0

ネットワーク (この場合は CAN バス) でメッセージをバッファリングするために std::queue を使用しています。中断中に、メッセージを「受信トレイ」に追加しています。次に、私のメインプログラムは、キューが空であるかどうかをサイクルごとにチェックし、そうでない場合はメッセージを処理します。問題は、キューが空になるまでポップされることです ( while (! inbox.empty()).

たとえば、最初のメッセージは「1」をキューにプッシュします。ループ読み取り

  • 1

次のメッセージは「2」です。次に読むのは

  • 2
  • 1

別の読み取り「3」、「4」の前に 2 つのメッセージを取得した場合、次の読み取りは

  • 3
  • 4
  • 2
  • 1

私は非常に混乱しています。また、STM32F0 ARM チップを使用してオンラインで mbed を実行していますが、これがハードウェアでうまく機能していないのか、それとも何なのかわかりません!

スレッドの安全性が心配だったので、追加のバッファー キューを追加し、"ロック解除" されたときにのみ受信トレイにプッシュしました。そして、これを実行すると、とにかく競合が発生するのを見たことはありません!

プッシャーコード:

if (bInboxUnlocked) {
    while (! inboxBuffer.empty()) {
        inbox.push (inboxBuffer.front());
        inboxBuffer.pop();
    }
    inbox.push(msg);
} else {
    inboxBuffer.push(msg);
    printf("LOCKED!");
}

メインプログラム読み取りコード

bInboxUnlocked = 0;
while (! inbox.empty()) {
    printf("%d\r\n", inbox.front().data);
    inbox.pop();
}
bInboxUnlocked = 1;

誰か考えますか?私はこれを間違って使用していますか?私がやっていることを簡単に達成する他の方法はありますか? 小さな循環配列を実装するのに十分なほどバッファが小さいと予想していますが、手元にキューがあるので、そうする必要がないことを望んでいました。

4

1 に答える 1