如何将匿名数组作为结构类型定义中的字段?

问题描述 投票:0回答:1

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 这样的解决方案。

arrays c struct padding typedef
1个回答
0
投票

您必须命名结构成员。寄存器映射的约定是将事物命名为

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.")
© www.soinside.com 2019 - 2024. All rights reserved.