当前位置: 首页 > news >正文

【STM32】FreeRTOS 任务消息队列 和 中断消息队列的区别(六)

FreeRTOS 中的消息队列(Queue)是任务之间、任务与中断之间进行通信的核心机制之一。而当我们说:1、任务消息队列;2、中断消息队列; 其实我们说的是:谁在使用这个队列(任务 or 中断)进行发送或接收操作,以及使用的 API 函数是否安全、稳定、合适。

任务消息队列:
[Task A] --xQueueSend()--> [Queue] --xQueueReceive()--> [Task B]中断消息队列:
[ISR Handler] --xQueueSendFromISR()--> [Queue] --xQueueReceive()--> [Task]
那为什么要区分任务和中断队列使用?

这是因为 中断中不能使用阻塞函数,也不能调用导致上下文切换的函数,因此 FreeRTOS 专门提供了 FromISR() 后缀的函数做中断安全的队列操作。

对比项任务消息队列中断消息队列
使用场景任务 → 队列 → 任务中断 → 队列 → 任务
入队函数xQueueSend()
xQueueSendToBack()
xQueueSendToFront()
xQueueSendFromISR()
xQueueSendToBackFromISR()
xQueueSendToFrontFromISR()
出队函数xQueueReceive()
xQueuePeek()
xQueueReceiveFromISR()
xQueuePeekFromISR()
(极少数情况使用)
是否允许阻塞✅ 可以设置阻塞时间(如 portMAX_DELAY❌ 中断中禁止阻塞,必须立即返回
是否触发任务切换✅ 自动调度(按优先级)✅ 需手动触发:使用 portYIELD_FROM_ISR()
常见用途任务间异步通信 / 消息传递中断事件通知任务(如按键、串口等)
调用限制无特殊限制只能使用 FromISR 版本的 API 函数
任务消息队列
// 任务 A 发送
xQueueSend(MyQueue, &data, 100);   // 最多等待 100 tick// 任务 B 接收
xQueueReceive(MyQueue, &recvData, portMAX_DELAY);  // 永久等待直到有数据

RTOS 任务通信流程图:
在这里插入图片描述

中断消息队列
// ISR 中断发送
void EXTI0_IRQHandler(void)
{uint8_t key = 1;BaseType_t xHigherPriorityTaskWoken = pdFALSE;xQueueSendFromISR(MyQueue, &key, &xHigherPriorityTaskWoken);portYIELD_FROM_ISR(xHigherPriorityTaskWoken); // 必须添加
}

在这里插入图片描述

任务消息队列适用于任务间通信,可以使用阻塞等待;中断消息队列用于中断向任务发送事件,必须使用 FromISR() 函数,且不能有阻塞行为。

以上,欢迎有从事同行业的电子信息工程、互联网通信、嵌入式开发的朋友共同探讨与提问,我可以提供实战演示或模板库。希望内容能够对你产生帮助!

http://www.dtcms.com/a/303935.html

相关文章:

  • 14 - 大语言模型 — 抽取式问答系统 “成长记”:靠 BERT 学本事,从文本里精准 “揪” 答案的全过程(呆瓜版-1号)
  • “非参数化”大语言模型与RAG的关系?
  • 云原生MySQL Operator开发实战(五):扩展与生态系统集成
  • python使用ffmpeg录制rtmp/m3u8推流视频并按ctrl+c实现优雅退出
  • DateTime::ToString 日期时间文本格式化深度解析(C++)
  • Mysql InnoDB存储引擎
  • 2.快速开始
  • Windows下基于 SenseVoice模型的本地语音转文字工具
  • 【Linux我做主】探秘进程状态
  • 聚铭安全管家平台2.0实战解码 | 安服篇(三):配置保障 自动核查
  • 从单机架构到分布式:Redis为何成为架构升级的关键一环?
  • OpenLayers 综合案例-底图换肤(变色)
  • DevOps 详解
  • Linux -- 文件【中】
  • CVE-2022-46169漏洞复现
  • DNS污染与劫持
  • 《林景媚与命运协议》
  • 服务器数据恢复—RAID上层部署的oracle数据库数据恢复案例
  • logtrick 按位或最大的最小子数组长度
  • JavaWeb(苍穹外卖)--学习笔记15(分页查询PageHelper)
  • Unity_UI_NGUI_DrawCall
  • Mac安装Navicat步骤Navicat Premium for Mac v17.1.9【亲测】
  • 【腾讯云】EdgeOne网站安全防护的配置方法 防范盗刷流量 附恶意IP和UA黑名单
  • 学习网址备份(二)
  • Linux 启动流程、密码破解、引导修复完全手册
  • 【智能协同云图库】智能协同云图库第八弹:基于阿里云百炼大模型—实现 AI 扩图功能
  • haproxy应用详解
  • 创建型设计模式-工厂方法模式和抽象工厂方法模式
  • 云端文档管理新纪元:Paperless-ngx与cpolar打造的无边界文件生态
  • Ext JS极速项目之 Coworkee