私は、互いにメッセージを送信する複数のタスクで構成される組み込み制御システムを 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]
、これを「きれい」とは見なしません!
だから私の質問は、どうすればこれを適切に行うことができるのでしょうか?