IDE:Code Composer IDE 版本 12。
编译器:ti-cgt-arm_20.2.6.LTS
芯片:德州仪器 AM6442(ARM Cortex R5F 内核)。
语言:C
我正在编写一些结构体 typedef,它们定义了一些硬件寄存器在内存中的布局。在某些外围模块的内存映射中,内存中可能存在相对较大的间隙(例如 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 这样的解决方案。
您必须命名结构成员。寄存器映射的约定是将事物命名为
reserved0
、reserved1
等等。如果由于奇怪的 IDE 原因您不能接受这一点,那么我想您必须创建多个结构。尽管重写源代码以适应程序员/IDE 的特殊品味总是一个坏主意,而不是让程序员/IDE 适应现实......
正如 @chux 的评论中提到的,通过附加
__LINE__
: 创建自动、自增的数字可能是个好主意
#define CONCAT(x,y) x ## y
#define reserved(x) CONCAT(reserved_, x)
typedef struct
{
uint32_t x;
uint32_t reserved(__LINE__);
uint32_t reserved(__LINE__);
} struct_t;
归结为:
uint32_t reserved_7;
uint32_t reserved_8;
您确实可以输入“z”来移动代码完成列表末尾的所有寄存器名称,
CONCAT(zreserved_, x)
等。
您还可以使用这些宏来声明数组:
uint32_t reserved(__LINE__) [10];
将产生类似以下内容:
uint32_t reserved_8 [10];
另请注意,在寄存器映射结构中使用
__attribute__((packed))
非常可疑 - 自动结构填充永远不应该发生在这里。防止这种情况的正确方法是使用 static_assert
。
static_assert(sizeof(mystruct) == expected, "Incorrect struct padding detected in mystruct.")