嵌入式系统编译期定长IO适配器状态结构体设计咨询
嵌入式静态内存系统下IO适配器状态结构体设计问题
环境与核心需求
平台为仅支持静态内存的嵌入式系统,所有内容必须在编译期确定,无堆内存及内存管理机制。需要设计代表IO适配器的结构体,包含配置、读写数据指针、读写操作所需变量等信息,函数通过指向特定IO适配器结构体的指针完成读写操作,目标是让这些结构体设计尽可能相似。
所有IO结构体需包含统一的状态存储结构,但原设计的StatusS存在语法问题:
typedef struct ChannelStatusS ChannelStatusS; struct ChannelStatusS{ const int size; int entry[]; }; typedef struct StatusS StatusS; struct StatusS{ const int size; int general[]; ChannelStatusS channel[]; };
这种写法不可行:
- 柔性数组只能位于结构体末尾,
StatusS中general[]后还有channel[]不符合语法规则 - C99中无法初始化可变大小的结构体,如下初始化方式在无编译器扩展时非法:
ChannelStatusS channelstatus = { .size = 5, .entry = {0, 0, 0, 0, 0} };
核心诉求:所有IO结构体采用统一的状态结构/存储方式,以便仅用一个函数即可获取状态。
IO结构体示例
typedef struct ExampleS ExampleS; struct ExampleS { // 配置变量 const char_t device_name[20]; const bool_t simultaneous_update_supported; const int bit_resolution; // 12 const bool use_raw_data; const int IO_BUFfER_SIMULTANEOUS_ADR; // 设备特定数据结构 ExampleDataS channel[ES753_NUMBER_OF_CHANNELS]; ExampleRegisterDataS input_register[ES753_NUMBER_OF_CHANNELS]; // 内部变量(无需外部初始化) StatusS status; InternalVariablesS vars; // 函数指针结构体 FunctionsPointerS f; };
现有解决方案思路
- 方案1:不使用
Status结构体,仅用int数组和int类型的size成员变量,数组大小通过#define为每个适配器定义(原本也需定义)。 - 方案2:使用宏定义特定大小的
Status结构体,但该方案无法仅通过StatusS指针调用统一函数,需为每个状态结构体单独编写函数。 - 方案3:先声明静态数组,让结构体持有指向数组的指针。
求问
- 满足需求的最佳实现方式是什么?
- 关于IO结构体相似性/一致性设计的思路或资源。
内容的提问来源于stack exchange,提问作者Socialist2
相关产品推荐
相关产品推荐

