修正が必要なCプログラムの予期しない動作を誰かが解決するのを手伝ってくれることを願っています:
2 つの CAN バスのいずれかから着信メッセージを受信するまで待機する 2 つの Xenomai リアルタイム タスク (スレッド) があります。
各タスクは関数 checkMessageNumber() を呼び出しますが、予測できない結果が得られます。
優先順位に基づくシングル スレッド システムを使用していることに注意してください。1 つのスレッドが他のスレッドよりも優先されますが、一方のスレッドが他のスレッドよりも優先されると、一方のスレッドが途中で実行される可能性があります。
将来、ハードウェアがマルチスレッド システムにアップグレードされる可能性はありますが、プログラムのこの部分は依然として単一のスレッド (1 つの CPU コア) に限定されます。
各スレッドがこの関数の独自のインスタンスを呼び出すことを理解しているため、何が起こっているのかわかりません。
int getMessageIndex(unsigned int msg_number)
{
unsigned int i = 0;
while(i < global_number_message_boxes)
{
if (global_message_box[i].id == msg_number}
return i; // matched the msg number, so return the index number
i++;
}
return -1; // no match found
}
もともと、この関数は非常に予測不可能であり、メッセージがストリーミングされて 2 つのタスクによって処理されると (メッセージの送信元のハードウェア バスによって異なります)、着信 'msg_number' が 'id と一致した場合でも、この関数は -1 を返すことがありました。 'global_message_box' 構造体で。
「global_number_message_boxes」を整数に設定することで、よりうまく機能させることができました
。 while(i < 50)
ただし、一致するはずなのに、関数が -1 を返すことがあります。
グローバル変数しか読み取っていないのに、なぜ破損するのですか? これについて何を学ぶ必要がありますか?
私の考えは、着信 'msg_number' が単純に 'global_message_box' の 'id' になるように単純化することです。
各スレッドは、どの「id」を書き込むかをチェックすることなく、構造体に直接書き込みます。
ミューテックスを使用することはどれほど重要ですか? システム設計により、各スレッドが構造体の同じ部分に書き込むことは決してないので、それが重要かどうかはわかりませんか?
ありがとう。