Я пишу свою собственную библиотеку 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, и я не хочу полагаться на другие библиотеки, так как это противоречит цели написания своих собственных с нуля.
Нет. Все типы в C ++ определяются стандартом («примитивные типы», но также указатели и функции), расширенные типы определяются реализацией (__int128
) или пользовательские типы (классы, структуры, объединения).
Перечисление с фиксированным базовым типом может соответствовать вашим требованиям:
enum byte : unsigned char {};
Тем не менее, ваши концептуальные основы кажутся немного шаткими:
и я не уверен, как платформа AVR относится к этому
Во встроенном программировании вы обычно тратите больше времени на изучение конкретной платформы. Это безопасная ставка, что char
это ровно восемь бит на 8-битной платформе, но на самом деле вы должны найти руководство, которое на самом деле так говорит.
/ * PORTB — это глобальный объект, созданный в моей библиотеке, который объединяет обработку регистра данных и регистра направления данных для контактов PORTB на чипе. PORTD похож, просто адреса памяти регистров разные * /
Это не работа для вашей библиотеки. Производитель микросхем, как правило, лучше всех знает, когда речь идет об их собственном оборудовании и поддерживаемых им компиляторах. Используйте официальные библиотеки.
Это может быть забавным упражнением для создания своей собственной библиотеки времени выполнения с использованием компилятора в качестве основы, но вы действительно не хотите разрабатывать и поддерживать это вечно.