【发布时间】:2023-07-05 01:17:01
【问题描述】:
我正在从头开始为 Atmel ATmega2560 芯片编写自己的 c++ 库,作为学习它(以及一般电子设备)如何工作的练习。作为其中的一部分,我想在 C++ 中创建一个新的基本 byte 类型,它不仅仅是另一种类型的别名,并且具有 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 的完整数据表,其中包括指令集列表。如果必须,我不害怕使用 in-line Assembly,但出于性能(毕竟,我只是人类)和最佳实践的原因,我不希望这样做。
我能够找到this question,但这仍然只是别名,并且无法控制类型的实际大小。一些答案还提到使用 Boost 库;我不确定 Boost 是否适用于 AVR,并且我不想依赖其他库,因为这违背了从头开始编写自己的库的目的。
【问题讨论】:
-
“[
char] 的大小定义模糊”,不,它正好是 1 个字节,与平台无关。也许您正在考虑八位字节。如果是这样,请查看. -
除非您正在编写自己的编译器,否则您无需担心任何这些,您的编译器供应商已经开始工作了。
-
我认为用 C++ 编写 AVR 不是一个好主意。由于外部哈佛架构,这将增加相当多的开销(更不用说闪存和可能的 RAM 开销)。对于类型:阅读
stdint.h。在那里,您已经有了适当大小的类型。
标签: c++ embedded avr avr-gcc atmega