是否有可能在c++中为嵌入式平台创建一个新的原语类型?
Is it possible to create a new primitive type in C++ for embedded platforms?
我正在从头开始为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是类似的,只是寄存器的内存地址不同*/
这不是库的工作。当涉及到他们自己的硬件和他们支持的编译器时,芯片供应商通常最了解。使用官方库
使用编译器作为基础构建自己的运行时库可能是一个有趣的练习,但您不会真的想要永久地开发和支持它。
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 更改可变参数模板中的最后一个类型
- 如何构造一个类型特征,可以判断一个类型的私有方法是否可以在另一个类型的构造函数中调用?
- 有没有办法同时将一个类型分配给C++中的多个模板?
- C++:可以模板化一个类型名称吗
- 有没有一种方法可以使用SFINAE来检测一个类型是否实现了给定的抽象基类
- 给定一个类型为 Container:<T>:Iterator 的函数参数,如何为某些类型的 T 实现特定的重载?
- 期望一个类型,得到一个模板
- 初始化一个类型向量的巨大向量<int>
- 我可以使用预处理器将一个类型声明替换为另一个类型声明吗?
- 具有多种类型的类数组?如何访问数组中的一个类型
- Opencv C++ 声明一个类型为 uint8 的矩阵
- 模板参数列表中只有一个类型名称是什么意思?
- C++模板部分特化:为什么我无法匹配可变参数模板中的最后一个类型
- 为什么我们有一个类型不匹配
- 在函数模板中将一个类型名映射到另一个类型名
- 创建一个类型bool的向量,其中所有值均可初始化为true
- 在C API中定义了一个类型,如何将其与命名空间中的C++类相关联