是否可以在 C++ 中为嵌入式平台创建新的原始类型?
Is it possible to create a new primitive type in C++ for embedded platforms?
我正在从头开始为 Atmel ATmega2560 芯片编写我自己的 c++ 库,作为学习它(和一般电子产品)如何工作的练习。作为其中的一部分,我想在 C++ 中创建一个新的基本 byte
类型,它不仅仅是另一种类型的别名,而且具有 8 位的精确大小。
由于这是一个嵌入式平台,我希望尽可能避免为芯片生成额外的指令来处理,这使得 类 和结构不适合。我知道我可以使用 char
类型,但是 C++ 标准对它的大小进行了模糊定义("at least one byte",并且一个字节的大小可能因平台而异),我不确定如何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;
}
能够隐式转换 to/from 一个 int 和其他基本类型将是一个好处,但可能不是必需的。除了分叉 avr-gcc 并写入新的内部类型之外,是否有可能做到这一点?
注意:我有 ATmega2560 的完整数据 sheet,其中包括指令集列表。如果必须的话,我不害怕使用内联汇编,但出于性能(毕竟,我只是人类)和最佳实践的原因,我宁愿不使用。
我能够找到 this question,但这仍然只是别名,无法控制类型的实际大小。一些答案还提到使用 Boost 库;我不确定 Boost 在 AVR 上是否有效,我不想依赖其他库,因为这违背了我从头开始编写自己的库的目的。
没有。 C++ 中的所有类型要么由标准定义("primitive types",但也包括指针和函数)、由实现定义的扩展类型(__int128
)或用户定义类型(类、结构, 工会)。
具有固定基础类型的枚举可以满足您的要求:
enum byte : unsigned char {};
但是,您的概念基础似乎有点不稳定:
and I'm not sure how the AVR platform treats it
在嵌入式编程中,您通常会花更多时间了解特定平台。可以肯定 char
在 8 位平台上恰好是八位,但实际上您应该找到实际如此说明的手册。
/* 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 */
这不是你们图书馆的工作。芯片供应商通常最了解他们自己的硬件和他们支持的编译器。使用官方库。
以编译器为基础构建您自己的运行时库可能是一项有趣的练习,但您真的不想永久开发和支持它。
我正在从头开始为 Atmel ATmega2560 芯片编写我自己的 c++ 库,作为学习它(和一般电子产品)如何工作的练习。作为其中的一部分,我想在 C++ 中创建一个新的基本 byte
类型,它不仅仅是另一种类型的别名,而且具有 8 位的精确大小。
由于这是一个嵌入式平台,我希望尽可能避免为芯片生成额外的指令来处理,这使得 类 和结构不适合。我知道我可以使用 char
类型,但是 C++ 标准对它的大小进行了模糊定义("at least one byte",并且一个字节的大小可能因平台而异),我不确定如何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;
}
能够隐式转换 to/from 一个 int 和其他基本类型将是一个好处,但可能不是必需的。除了分叉 avr-gcc 并写入新的内部类型之外,是否有可能做到这一点?
注意:我有 ATmega2560 的完整数据 sheet,其中包括指令集列表。如果必须的话,我不害怕使用内联汇编,但出于性能(毕竟,我只是人类)和最佳实践的原因,我宁愿不使用。
我能够找到 this question,但这仍然只是别名,无法控制类型的实际大小。一些答案还提到使用 Boost 库;我不确定 Boost 在 AVR 上是否有效,我不想依赖其他库,因为这违背了我从头开始编写自己的库的目的。
没有。 C++ 中的所有类型要么由标准定义("primitive types",但也包括指针和函数)、由实现定义的扩展类型(__int128
)或用户定义类型(类、结构, 工会)。
具有固定基础类型的枚举可以满足您的要求:
enum byte : unsigned char {};
但是,您的概念基础似乎有点不稳定:
and I'm not sure how the AVR platform treats it
在嵌入式编程中,您通常会花更多时间了解特定平台。可以肯定 char
在 8 位平台上恰好是八位,但实际上您应该找到实际如此说明的手册。
/* 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 */
这不是你们图书馆的工作。芯片供应商通常最了解他们自己的硬件和他们支持的编译器。使用官方库。
以编译器为基础构建您自己的运行时库可能是一项有趣的练习,但您真的不想永久开发和支持它。