问题
在低级别的裸机嵌入式环境中,我想在内存中以C ++结构创建一个空白且没有任何名称的名称,以禁止用户访问此类内存位置。
现在,我通过放置一个丑陋的uint32_t :96;
位域(可以方便地代替三个词)来实现它,但是它会引起GCC的警告(位域太大,无法容纳在uint32_t中),这是非常合理的。
虽然可以正常工作,但是当您要分发包含数百种警告的库时,它并不是很干净。
我该怎么做呢?
为什么首先存在问题?
我正在从事的项目包括定义整个微控制器系列(STMicroelectronics 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之上添加约一百行。
确切的警告消息是这样的:(
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
标记可删除此警告...
uint32_t :192;
。
:42*32
而不是:1344
char unused[12];
了吗?