Я пишу свою собственную библиотеку 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, и я не хочу полагаться на другие библиотеки, так как это противоречит цели написания моей собственной с нуля.
char
] определен нечетко, нет, это ровно 1 байт, независимо от платформы. Возможно, вы думаете об октете. Если это так, проверьте ‹stdint.h›. - person Cheers and hth. - Alf   schedule 23.07.2015stdint.h
. Там у вас уже есть типы правильного размера. - person too honest for this site   schedule 23.07.2015