我正在使用标志的枚举值:
typedef enum
{
a = 0x00,
b = 0x01u, // the u has no influence, as expected
c = 0x02u, // the u has no influence, as expected
...
} enum_name;
volatile unsigned char* reg = SomeAddress;
*reg |= b;
根据 MISRA-C:2004,不得使用有符号类型进行按位运算。不幸的是,我的编译器 IAR 使用signedint(或short或char)作为枚举的基础类型,我能找到的唯一选项与大小有关,而不是与符号有关(“--enum-is-int”)。
根据ARM 的 IAR C/C++ 开发指南 http://supp.iar.com/FilesPublic/UPDINFO/004916/arm/doc/EWARM_DevelopmentGuide.ENU.pdf,第 169 和 211 页,您可以定义您的类型enum
s 如果您启用 IAR 语言扩展(-e
命令行选项,或者Project > Options > C/C++ 编译器 > Language > 允许 IAR 扩展在 IDE 中)。
特别是,您应该定义一个额外的“哨兵”值,以确保编译器选择正确的类型。它更喜欢有符号类型,并使用尽可能小的整数类型,因此哨兵应该是相应的无符号整数类型可以描述的最大正整数。例如,
typedef enum {
/* ... */
enum_u8_sentinel = 255U
} enum_u8;
typedef enum {
/* ... */
enum_u16_sentinel = 65535U
} enum_u16;
typedef enum {
/* ... */
enum_u32_sentinel = 4294967295UL
} enum_u32;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)