IDE:Code Composer IDE版本12。
编译器:ti-cgt-arm_20.2.6.LTS
芯片:Texas Instruments AM 6442(ARM Cortex R5 F内核)。
语言:C
我正在写一些结构类型定义,定义一些硬件寄存器在内存中的布局。在某些外围模块的内存Map中,内存中可能存在相对较大的间隙(如1024字节)。其中一些外设相当复杂(比如500多个唯一的寄存器名称和各种填充区域)。所有寄存器均为32位对齐,32位长。为了解决这些空白,我将uint32_t数组作为填充。
现在,填充数组有了名称。但是,由于没有需要访问填充区域中的内存的情况(这可能会触发内存故障),我希望填充是匿名的。
使用匿名填充的优点是不会弄乱IDE中的代码完成弹出菜单。在这些菜单中,我只想看到我的寄存器名称,而不是所有填充区域的名称。
//Example
typdef struct __attribute__((packed)){
uint32_t REG1;
uint32_t REG2;
uint32_t REG3;
uint32_t REG4;
uint32_t PAD_1[64];
uint32_t REG5;
uint32_t REG6;
uint32_t PAD_2[32];
uint32_t REG7;
}
**有没有办法让填充数组匿名?匿名数组以复合文字的形式存在,但我不知道在类型定义中有什么语法可以做到。我想避免像在结构中放置1000个匿名uint32_t这样的解决方案。
1条答案
按热度按时间nlejzf6q1#
必须命名结构成员。寄存器Map的约定是将事物命名为
reserved0
、reserved1
等。如果你因为奇怪的IDE原因不能接受它,那么我想你必须做几个结构。虽然重写源代码以适应程序员/IDE的特殊口味总是一个坏主意,而不是让程序员/IDE适应现实。正如@chux在评论中提到的,通过附加
__LINE__
来创建自动的、自增的数字可能是一个好主意:这将归结为这样的东西:
你确实可以在代码完成列表的末尾添加一个“z”来移动所有的寄存器名,比如
CONCAT(zreserved_, x)
等等。你也可以使用这些宏来声明数组:
uint32_t reserved(__LINE__) [10];
将产生如下结果:另外请注意,在寄存器Map结构中使用
__attribute__((packed))
是非常可疑的-这里不应该发生自动结构填充。防止这种情况的正确方法是使用static_assert
。