Можно ли создать новый примитивный тип в С++ для встраиваемых платформ?

Я пишу свою собственную библиотеку C++ для чипа Atmel ATmega2560 с нуля в качестве упражнения, чтобы узнать, как он (и электроника в целом) работает. В рамках этого я хочу создать новый фундаментальный тип byte в C++, который не является просто псевдонимом другого типа и имеет точный размер 8 бит.

Поскольку это встроенная платформа, я хочу избежать генерации дополнительных инструкций для процессора, чтобы обрабатывать как можно больше, что делает классы и структуры неподходящими. Я знаю, что мог бы использовать тип char, но его размер определен нечетко ("не менее одного байта", а размер байта может варьироваться в зависимости от платформы) стандартами C++, и я не уверен, как платформа AVR лечит его; хотя я подозреваю, что unsigned char будет 8-битным, так как большинство регистров 8-битные. Есть и другие причины, по которым я бы предпочел не использовать unsigned char.

По сути, то, что я хотел бы сделать, когда моя библиотека заработает, выглядит примерно так:

int main()
{
/* PORTB is global object instantiated in my lib that unifies handling the Data Register and Data Direction Register for PORTB pins on the chip. PORTD is similar, just memory addresses of registers are different */
  PORTB.setDDR(0); // All pins are inputs.
  PORTD.setDDR(0xFF); // All pins are outputs.
  byte b = PORTB.read();
  b |= 0b10011000;
  PORTD.write(b);

  return 0;
}

Возможность неявного приведения типа к типу int и другим фундаментальным типам была бы преимуществом, но, вероятно, в этом нет необходимости. Возможно ли вообще это сделать, если не считать разветвления avr-gcc и написания нового встроенного типа?

Примечание. У меня есть полный лист данных для ATmega2560, который включает список набора инструкций. Я не боюсь использовать встроенный ассемблер, если мне нужно, но предпочел бы не из соображений производительности (в конце концов, я всего лишь человек) и из соображений передового опыта.

Мне удалось найти этот вопрос, но это все еще просто псевдоним и не дает никакого контроля больше фактического размера шрифта. В некоторых ответах также упоминается использование Boost lib; Я не уверен, что Boost работает на AVR, и я не хочу полагаться на другие библиотеки, так как это противоречит цели написания моей собственной с нуля.


person KDØBPV    schedule 23.07.2015    source источник
comment
размер [из char] определен нечетко, нет, это ровно 1 байт, независимо от платформы. Возможно, вы думаете об октете. Если это так, проверьте ‹stdint.h›.   -  person Cheers and hth. - Alf    schedule 23.07.2015
comment
Если вы не пишете свой собственный компилятор, вам не нужно ни о чем беспокоиться, поставщик вашего компилятора уже заработал.   -  person n. 1.8e9-where's-my-share m.    schedule 23.07.2015
comment
Я не думаю, что это хорошая идея - программировать AVR на C++. Из-за внешней Гарвардской архитектуры это добавит довольно много накладных расходов (не говоря уже о флэш-памяти и, возможно, накладных расходах ОЗУ). Для типов: читайте о stdint.h. Там у вас уже есть типы правильного размера.   -  person too honest for this site    schedule 23.07.2015


Ответы (2)


Нет. Все типы в C++ либо определяются стандартом ("примитивные типы", но также указатели и функции), расширенными типами, определяемыми реализацией (__int128), либо определяемыми пользователем типами (классы, структуры, объединения).

person MSalters    schedule 23.07.2015
comment
Это вызывает вопрос, исключая пользовательские типы. Никакой тип в C или C++ не является просто псевдонимом другого типа; typedef реализует псевдонимы, но не создает типы. - person Potatoswatter; 25.07.2015

Перечисление с фиксированным базовым типом может соответствовать вашим требованиям:

enum byte : unsigned char {};

Однако ваши концептуальные основы кажутся немного шаткими:

и я не уверен, как к этому относится платформа AVR

При программировании встраиваемых систем вы обычно тратите больше времени на изучение конкретной платформы. Можно с уверенностью сказать, что char — это ровно восемь бит на 8-битной платформе, но на самом деле вы должны найти руководство, в котором действительно так написано.

/* PORTB — это глобальный объект, созданный в моей библиотеке, который унифицирует обработку регистра данных и регистра направления данных для выводов PORTB на микросхеме. PORTD похож, только адреса памяти регистров разные */

Это не задача вашей библиотеки. Поставщик микросхем обычно знает лучше, когда речь идет об их собственном оборудовании и поддерживаемых им компиляторах. Используйте официальные библиотеки.

Создание собственной библиотеки времени выполнения с использованием компилятора в качестве основы может быть забавным упражнением, но на самом деле вы не хотите постоянно разрабатывать и поддерживать ее.

person Potatoswatter    schedule 23.07.2015
comment
Поправьте меня, если я ошибаюсь, но IIRC, enum в C++ позволяет назначать только свои константы, как определено. Таким образом, вы не можете комбинировать биты и т. д., как вы можете сделать в C (где вы не можете указать базовый тип otoh. На самом деле вам нужно будет предоставить константы для всех возможных значений. - person too honest for this site; 24.07.2015
comment
@Olaf Нет, перечисления C++ обратно совместимы с C. Стандарт C++ даже благословляет перечисления, позволяя им реализовывать типы наборов битов в std::. - person Potatoswatter; 24.07.2015
comment
Хм... Вообще-то я был уверен, что это одно из основных отличий. Мне действительно нужно освежить свои знания C++. - person too honest for this site; 24.07.2015
comment
Я голосую против этого ответа, потому что он полностью упустил тот факт, что я делаю это для развлечения и обучения. Я знаю, что для реального приложения мне было бы лучше использовать avr-libc и C. Я также прямо заявил, что не хочу использовать готовую библиотеку, поэтому совет использовать только официальные библиотеки контрпродуктивен. . Далее, я нигде не указывал, что собираюсь выпустить эту библиотеку. Это просто обучающее упражнение. Наконец-то у меня есть полный техпаспорт чипа. Я даже сказал так. Но это более 1000 страниц, и я лучше всего учусь на практике, и в этом весь смысл этого упражнения. - person KDØBPV; 24.07.2015
comment
@KDØBPV Это ваша прерогатива, но ни одна из ваших критических замечаний не относится к решению здесь, которое заключается в использовании перечисления. (Технические данные могут ничего не говорить о C ABI, большинство из них этого не делают.) Что бы это ни стоило, я единственный, кто проголосовал за ваш вопрос. - person Potatoswatter; 25.07.2015
comment
Кроме того, говоря, что есть и другие причины, по которым я бы предпочел не использовать unsigned char, звучит как нечто большее, чем развлечение и образование. - person Potatoswatter; 25.07.2015