生产者生产消息很快
消费者处理消息慢
生产者
设置
xQueueSend(xDataQueue,&ulValue,pdMS_TO_TICKS(200)); //如果队列满,最多等待200 Tick
| 等待参数 | 队列满时行为 | 适用情况 |
|---|---|---|
0 | 立即失败 | 数据允许丢弃、任务不能阻塞 |
| 有限Tick | 等待后超时 | 一般业务任务 |
portMAX_DELAY | 一直等待 | 数据绝对不能丢且允许长期阻塞 |
队列满后,Producer不会持续轮询,而是进入Blocked:
Producer:Running → Blocked
原因:等待队列出现空位
此时CPU可以运行:
- Consumer;
- 其他Ready任务;
- Idle任务;
- 中断。
所以队列满造成的是:
Producer任务阻塞
生产发送超时处理
if (xResult == pdPASS)
{
/* 发送成功 */
}
else
{
/* 超时,记录丢弃 */
}