我正在用 C 编写一个嵌入式控制系统,该系统由多个相互发送消息的任务组成(我相信这是一个相当常见的习语!),但我很难设计一种机制:
- 很整洁
- 是通用的
- 是相对有效的
- 最重要的是:独立于平台(具体来说,不违反严格混叠或对齐问题)
从概念上讲,我想将每种消息类型表示为一个单独的结构定义,并且我想要一个具有以下功能(简化)的系统:
void sendMsg(queue_t *pQueue, void *pMsg, size_t size);
void *dequeueMsg(queue_t *pQueue);
其中 aqueue_t
包含一个节点的链接列表,每个节点都有一个char buf[MAX_SIZE]
字段。我所在的系统没有malloc()
实现,因此需要一个全局空闲节点池,然后是以下之一(以粗体表示的感知问题):
sendMsg()
将memcpy
传入消息的一部分放入空闲节点的缓冲区中。我的理解是,除非调用者对返回值进行进一步
处理,否则这将存在对齐问题。dequeueMsg()
memcpy
- 或者会有一个
void *getFreeBuffer()
返回buf[]
下一个空闲节点的函数,调用者(发送者)将把它转换为适当的指针类型。
我的理解是,现在这将在进入的过程中出现对齐问题,并且仍然需要稍后才能避免memcpy
在dequeueMsg()
退出时出现对齐问题。 - 或将节点中的缓冲区重新定义
queue_t
为 (eg)uint32_t buf[MAX_SIZE]
。
我的理解是这违反了严格的别名,并且不是独立于平台的。
我能看到的唯一其他选择是创建所有消息类型的联合以及char buf[MAX_SIZE]
,但我不认为这是“整洁”!
所以我的问题是,如何正确地做到这一点?