是否可以在嵌入式平台的C ++中创建新的基元类型?

时间:2015-07-23 03:43:45

标签: c++ embedded avr avr-gcc atmega

我正在从头开始为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的完整数据表,其中包括指令集的列表。如果必须的话,我不害怕使用内嵌式装配,但我不愿意为了性能(毕竟,我只是人类)和最佳实践原因。

我能够找到this question,但这仍然只是别名,并且无法控制该类型的实际大小。一些答案还提到使用Boost lib;我不确定Boost是否适用于AVR,而且我不想依赖其他库,因为这会破坏我自己编写自己的目的。

2 个答案:

答案 0 :(得分:1)

具有固定基础类型的枚举可以满足您的要求:

enum byte : unsigned char {};

然而,你的概念基础似乎有些不稳定:

  

我不确定AVR平台如何对待它

在嵌入式编程中,您通常会花更多时间了解特定平台。可以肯定的是,char在8位平台上只有8位,但实际上您应该找到实际上这样说的手册。

  

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

这不是图书馆的工作。芯片供应商通常最了解他们自己的硬件和他们支持的编译器。使用官方图书馆。

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

答案 1 :(得分:0)

没有。 C ++中的所有类型都由标准(“基本类型”,还有指针和函数),实现(__int128)或用户定义类型(类,结构,联合)定义的扩展类型定义。