Я пишу свою собственную библиотеку C++ для чипа Atmel ATmega2560 с нуля в качестве упражнения, чтобы узнать, как это работает (и электроника в целом). В качестве части этого я хочу создать новый базовый тип byte
на C++, который не является просто псевдонимом другого типа и имеет точный размер 8 бит.Возможно ли создать новый примитивный тип в C++ для встроенных платформ?
Поскольку это встроенная платформа, я хочу избежать создания дополнительных инструкций для обработки микросхем, насколько это возможно, что делает классы и структуры неудовлетворительными. Я знаю, что я мог бы использовать тип 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;
}
Будучи в состоянии неявно в/из междунар и других основных типов будет бонус, но, вероятно, не необходимо. Возможно ли это сделать, если не использовать forr-gcc и писать в новом внутреннем типе?
Примечание: У меня есть полная спецификация для ATmega2560, которая включает в себя список набора инструкций. Я не боюсь использовать встроенную сборку, если это необходимо, но предпочел бы не работать (в конце концов, я только человек) и соображениями лучших практик.
Я смог найти this question, но это все еще просто наложение псевдонимов и не дает никакого контроля над фактическим размером этого типа. В некоторых ответах также упоминается использование Boost lib; Я не уверен, что Boost работает на AVR, и я не хочу полагаться на другие библиотеки, поскольку это побеждает цель писать мои собственные с нуля.
«размер [char'] неопределенно определен», нет, это ровно 1 байт, независимо от платформы. Возможно, вы думаете о октете. Если да, просмотрите. –
Если вы не пишете собственный компилятор, вам не нужно беспокоиться об этом, ваш компилятор уже получил его. –
Я не думаю, что это хорошая идея для программирования AVR на C++. Из-за внешней Гарвардской архитектуры это добавит довольно немного накладных расходов (не говоря о Flash и, возможно, ОЗУ). Для типов: читайте о 'stdint.h'. Там у вас есть профили с нулевым размером. – Olaf