我正在使用 std::queue 来缓冲网络上的消息(在这种情况下为 CAN 总线)。在中断期间,我将消息添加到“收件箱”。然后我的主程序检查队列是否为空,如果不是则处理消息。问题是,队列被弹出直到空(它从 退出while (! inbox.empty())
,但是下次我将数据推送到它时,它可以正常工作,但旧数据仍然挂在后面。
例如,第一条消息将“1”推送到队列中。循环读取
- 1
下一条消息是“2”。下一个阅读是
- 2
- 1
如果我在另一次阅读之前收到两条消息,“3”,“4”,那么下一次阅读将是
- 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;
有人想吗?我用错了吗?还有其他方法可以轻松完成我正在做的事情吗?我希望缓冲区足够小,可以实现一个小的循环数组,但是手头有队列,我希望不必这样做。