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

Я пишу свою собственную библиотеку 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, и я не хочу полагаться на другие библиотеки, так как это противоречит цели написания своих собственных с нуля.

0

Решение

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

0

Другие решения

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

enum byte : unsigned char {};

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

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

Во встроенном программировании вы обычно тратите больше времени на изучение конкретной платформы. Это безопасная ставка, что char это ровно восемь бит на 8-битной платформе, но на самом деле вы должны найти руководство, которое на самом деле так говорит.

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

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

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

1