在 低位裸金属嵌入上下文中,我想在内存中创建一个空白空间,在 C + + 结构中,没有任何名称,以禁止用户访问这样的内存位置。
现在,我已经实现了它通过放置一个丑陋的 uint32_t :96;
位字段,这将方便地取代三个单词,但它会引起一个警告从 GCC (Bitfield 太大,以适应 uint32 _ t) ,这是相当合法的。
虽然它工作得很好,但是当您希望分发一个包含几百个这样的警告的库时,它并不是很干净..。
我该怎么做?
我正在进行的项目包括定义整个微控制器生产线(意法半导体 STM32)不同外围设备的内存结构。为此,结果是一个类,其中包含几个结构的联合,这些结构根据目标微控制器定义所有寄存器。
一个非常简单的外设的简单示例如下: 通用输入/输出(GPIO)
union
{
struct
{
GPIO_MAP0_MODER;
GPIO_MAP0_OTYPER;
GPIO_MAP0_OSPEEDR;
GPIO_MAP0_PUPDR;
GPIO_MAP0_IDR;
GPIO_MAP0_ODR;
GPIO_MAP0_BSRR;
GPIO_MAP0_LCKR;
GPIO_MAP0_AFR;
GPIO_MAP0_BRR;
GPIO_MAP0_ASCR;
};
struct
{
GPIO_MAP1_CRL;
GPIO_MAP1_CRH;
GPIO_MAP1_IDR;
GPIO_MAP1_ODR;
GPIO_MAP1_BSRR;
GPIO_MAP1_BRR;
GPIO_MAP1_LCKR;
uint32_t :32;
GPIO_MAP1_AFRL;
GPIO_MAP1_AFRH;
uint32_t :64;
};
struct
{
uint32_t :192;
GPIO_MAP2_BSRRL;
GPIO_MAP2_BSRRH;
uint32_t :160;
};
};
其中所有的 GPIO_MAPx_YYY
都是宏,定义为 uint32_t :32
或寄存器类型(专用结构)。
这里你看到的 uint32_t :192;
工作得很好,但它触发了一个警告。
我可能已经替换了几个 uint32_t :32;
(6在这里) ,但我有一些极端的情况下,我有 uint32_t :1344;
(42)(其中)。因此,即使结构生成是脚本编写的,我也不愿意在8k 其他代码之上添加大约100行代码。
确切的警告信息是这样的:
width of 'sool::ll::GPIO::<anonymous union>::<anonymous struct>::<anonymous>' exceeds its type
(我就是喜欢它阴暗的样子)。
我宁愿 没有通过简单地删除警告来解决这个问题,但是使用
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-WTheRightFlag"
/* My code */
#pragma GCC diagnostic pop
可能是一个解决方案... 如果我找到 TheRightFlag
。然而,正如在 这根线,gcc/cp/class.c
中指出的这个悲哀的代码部分:
warning_at (DECL_SOURCE_LOCATION (field), 0,
"width of %qD exceeds its type", field);
这告诉我们没有 -Wxxx
标志来移除这个警告..。