目前,我正在使用嵌入式设备进行工作。
我正在创建自己的“寄存器表示法”,以学习C语言中的过程。
我通过在给定位置放置结构体来实现这一点:
struct myIo {
u32 flagA : 1;
u32 fieldB : 7;
u32 reserved : 24;
u32 regB;
};
struct __attribute__((section("sec"))) myIo MyIo;
这个代码可以正常工作,但是我想知道如何移除
reserved
字段不会影响硬件所执行的填充/对齐方式。
我的问题是:
如何设计一个结构体,使得其中的“隐藏”字段在访问结构体时不会显示出来。
本质上:
MyStruct.reserved = val;
或者
val = MyStruct.reserved;
应该抛出编译错误和类型错误
MyIo.
在Eclipse CDT C/C++中,不应该出现“自动完成”选项。
我正在使用Arm Cross GCC和Eclipse CDT C/C++。
我熟悉符合C标准的解决方案、编译器pragma解决方案和预处理器解决方案。
reserved
— 除非你打算对结构体进行打包(不建议这样做!),否则regB
将会被正确地对齐。或者,将reserved
替换为u32 : 0;
,以强制对齐到下一个存储单元。 - Jonathan LefflerRegB
的对齐就不能再保证了(在位域中任何事情都不是完全保证的——它们非常“实现定义”)。如果你有显式的reserved
成员,或者有一个匿名的 24 位位域,那么你就没问题了。但是去掉位域并打包结构体会让编译器能够在名称后面的 8 位保留字节之后立即对齐RegB
。 - Jonathan Leffleru32
可能无效... - Jonathan Leffler