是否有可能在c++中为嵌入式平台创建一个新的原语类型?

Is it possible to create a new primitive type in C++ for embedded platforms?

本文关键字:一个 类型 原语 c++ 有可能 创建 平台 嵌入式 是否      更新时间:2023-10-16

我正在从头开始为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的完整数据表,其中包括指令集的列表。如果必须的话,我不怕使用内联汇编,但出于性能(毕竟,我只是人)和最佳实践的原因,我宁愿不要这样做。

我能够找到这个问题,但这仍然只是混叠,并且无法控制类型的实际大小。一些答案还提到使用Boost库;我不确定Boost是否能在AVR上工作,而且我不想依赖其他库,因为这违背了我从头开始编写自己的库的目的。

No。c++中的所有类型要么是由标准定义的("基本类型",也包括指针和函数),要么是由实现定义的扩展类型(__int128),要么是用户定义的类型(类、结构、联合)。

具有固定底层类型的枚举可以满足您的需求:

enum byte : unsigned char {};

然而,你的概念基础似乎有点不稳固:

,我不确定AVR平台如何处理它

在嵌入式编程中,您通常会花更多的时间来学习特定的平台。在8位平台上,char正好是8位,这是一个安全的赌注,但实际上你应该找到真正这样说的手册。

/* PORTB是在我的库中实例化的全局对象,它统一处理芯片上PORTB引脚的数据寄存器和数据方向寄存器。PORTD是类似的,只是寄存器的内存地址不同*/

这不是库的工作。当涉及到他们自己的硬件和他们支持的编译器时,芯片供应商通常最了解。使用官方库

使用编译器作为基础构建自己的运行时库可能是一个有趣的练习,但您不会真的想要永久地开发和支持它。

相关文章: