FreeRTOS学习(十三)——队列与中断
📅 2026/8/3 12:10:39
👁️ 次浏览
上一节学习了xQueueSend()和xQueueReceive()实现了两个任务之间的数据传递。实际STM32程序中很多数据并不是由任务主动产生而是来自按键中断、串口接收中断、定时器中断等。中断发生后我们通常希望快速记录数据然后交给任务完成后续处理。这一节学习如何在中断服务函数中使用FreeRTOS队列。一、中断中为什么不能直接使用xQueueSend()任务中可以这样发送队列xQueueSend( DataQueue, data, pdMS_TO_TICKS(100) );但是在中断服务函数中不能直接这样使用。原因很简单xQueueSend()可能因为队列已满而让当前任务进入阻塞态。而中断服务函数不是任务没有运行态 → 阻塞态这样的任务状态转换也不能在中断里面等待100ms。因此FreeRTOS专门提供了中断版本xQueueSendFromISR();带有FromISR后缀的函数就是专门给中断服务函数使用的接口。二、xQueueSendFromISR()函数可以简单理解为BaseType_t xQueueSendFromISR( QueueHandle_t xQueue, const void *pvItemToQueue, BaseType_t *pxHigherPriorityTaskWoken );第一个参数xQueue表示队列句柄。第二个参数pvItemToQueue表示需要发送的数据地址。第三个参数pxHigherPriorityTaskWoken用于判断发送数据以后是否唤醒了一个优先级更高的任务。这个参数是中断中使用队列时需要重点理解的地方。三、创建一个按键消息队列首先定义QueueHandle_t KeyQueue;然后创建队列KeyQueue xQueueCreate( 5, sizeof(uint8_t) );这里创建一个长度为5的队列每条消息都是uint8_t类型。之后创建按键处理任务xTaskCreate( KeyTask, KeyTask, 128, NULL, 2, NULL );这个任务专门负责等待按键中断发送过来的数据。四、编写按键中断假设STM32F407的某个按键通过外部中断触发。中断服务函数可以写成void EXTI0_IRQHandler(void) { BaseType_t xHigherPriorityTaskWoken pdFALSE; uint8_t KeyValue 1; if(EXTI_GetITStatus(EXTI_Line0) ! RESET) { xQueueSendFromISR( KeyQueue, KeyValue, xHigherPriorityTaskWoken ); EXTI_ClearITPendingBit(EXTI_Line0); portYIELD_FROM_ISR(xHigherPriorityTaskWoken); } }按键触发以后进入EXTI中断 ↓ KeyValue 1 ↓ 发送到KeyQueue ↓ 退出中断这样中断只负责产生按键消息不负责执行复杂的按键处理程序。五、pxHigherPriorityTaskWoken是什么中断开始时先定义BaseType_t xHigherPriorityTaskWoken pdFALSE;假设此时KeyTask正在xQueueReceive();中等待按键数据因此处于阻塞态。按键中断发生后执行xQueueSendFromISR();队列中出现数据等待这个队列的KeyTask就可能从阻塞态变成就绪态如果被唤醒的任务优先级高于当前被中断的任务FreeRTOS会把xHigherPriorityTaskWoken设置为pdTRUE这说明现在已经有一个更高优先级的任务可以运行了。六、portYIELD_FROM_ISR()有什么用中断最后执行portYIELD_FROM_ISR(xHigherPriorityTaskWoken);如果xHigherPriorityTaskWoken pdTRUE那么退出中断以后就可以立即切换到刚刚被唤醒的高优先级任务。过程可以理解为普通任务运行 ↓ 按键中断发生 ↓ 发送队列数据 ↓ KeyTask被唤醒 ↓ 发现KeyTask优先级更高 ↓ 退出中断 ↓ 立即运行KeyTask这样就提高了系统响应速度。如果没有更高优先级任务被唤醒xHigherPriorityTaskWoken pdFALSE则不会因为这次操作产生额外的任务切换。七、按键处理任务任务中继续使用普通的xQueueReceive();例如void KeyTask(void *pvParameters) { uint8_t KeyValue; while(1) { if(xQueueReceive( KeyQueue, KeyValue, portMAX_DELAY ) pdPASS) { if(KeyValue 1) { GPIO_ToggleBits( GPIOE, GPIO_Pin_3 ); printf(Key Press\r\n); } } } }没有按键时KeyQueue为空 ↓ KeyTask阻塞不会一直查询按键。按键中断发生EXTI中断 ↓ xQueueSendFromISR() ↓ KeyQueue收到数据 ↓ KeyTask被唤醒 ↓ 处理按键这就是非常典型的中断产生事件任务处理事件。八、为什么不直接在中断里处理例如按键中断后需要printf();控制LED处理数据发送通信数据。如果全部放在中断服务函数中中断执行时间就会很长。这可能影响其他中断以及系统实时性。更合理的方法是中断 ↓ 快速获取数据 ↓ 发送队列 ↓ 退出中断 ↓ 任务处理复杂工作因此实际FreeRTOS工程中一般要求中断尽量短复杂处理交给任务。九、中断中使用队列的注意事项首先中断中不能使用普通xQueueSend();应该使用xQueueSendFromISR();类似地中断中还有xQueueReceiveFromISR();等专门的ISR接口。其次中断中不能使用vTaskDelay();因为中断不是任务不能进入阻塞态。最后使用FreeRTOS的FromISR接口时还需要正确配置STM32的NVIC中断优先级。并不是任意中断优先级都可以调用FreeRTOS API。关于FreeRTOS中断优先级和ISR安全API的具体规则后面学习中断安全API时再详细介绍。十、总结这一节学习了FreeRTOS队列在中断中的基本使用方法。任务中发送队列使用xQueueSend();中断中则使用xQueueSendFromISR();通过xHigherPriorityTaskWoken和portYIELD_FROM_ISR()还可以在中断唤醒更高优先级任务后及时进行任务切换。实际工程中推荐采用中断快速获取数据 ↓ 队列 ↓ 任务完成复杂处理这种方式既能够发挥中断响应速度快的特点又能避免在中断服务函数中执行大量耗时操作。
很多人已经习惯把文档上传给 AI,再让它总结内容。
处理一两个文件时,这种方式足够方便。但当任务涉及整个项目目录、多份表格或持续修改的资料时,反复上传附件很快就会变成新的负担。
上传附件适合一次性问答
例如:
总结这份 …
📅 2026/8/3 12:10:39
Windows 部署 Hermes 不再麻烦|整合包实现快速搭建本地智能体
前言
Hermes Agent 原生部署流程涉及大量环境配置工作,新手操作时常常遇到依赖缺失、路径报错等各类问题。 整合安装包预先封装全部运行所需组件与配置文件,无需手动配置环境&a…
📅 2026/8/3 12:10:39
1. 项目概述与核心痛点在Unity项目开发中,尤其是涉及全球运营、多地区玩家数据同步或后端服务交互时,处理时间数据绝对是一个高频且容易踩坑的领域。我们经常遇到这样的场景:后端服务返回一个形如2024-05-27T15:30:45.123Z的时间字符串&#…
📅 2026/8/3 12:09:38
NoSleep防休眠神器:Windows自动锁屏问题的终极解决方案 【免费下载链接】NoSleep Lightweight Windows utility to prevent screen locking 项目地址: https://gitcode.com/gh_mirrors/nos/NoSleep
你是否曾经因为Windows自动锁屏而中断了重要的演示、下载或…
📅 2026/8/3 13:07:10
5分钟掌握Faster-Whisper-GUI:免费开源语音转文字桌面应用终极指南 【免费下载链接】faster-whisper-GUI faster_whisper GUI with PySide6 项目地址: https://gitcode.com/gh_mirrors/fa/faster-whisper-GUI
你是否曾经面对海量音频文件感到束手无策&#x…
📅 2026/8/3 13:07:10
写的文章明明是一个字一个字敲的,提交后却被导师批"满屏机器味"?自查AIGC率飙到87%,改了3遍还是降不下来?
我踩过替换同义词越改越假、用错降AI率工具反升的坑,今天把9个原创免费降AI率技巧3款实测工具深度测…
📅 2026/8/3 13:07:10
5分钟掌握Palworld存档编辑:从二进制到可读JSON的完整解决方案 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools
你是否曾为Palworld存档…
📅 2026/8/3 13:07:10
如何用Qobuz-DL构建个人无损音乐库:从零到精通的实用指南 【免费下载链接】qobuz-dl A complete Lossless and Hi-Res music downloader for Qobuz 项目地址: https://gitcode.com/gh_mirrors/qo/qobuz-dl
你是否曾渴望拥有一个高品质的个人音乐库࿰…
📅 2026/8/3 13:07:10
百度网盘高速下载终极方案:pan-baidu-download一键突破限速 【免费下载链接】pan-baidu-download 百度网盘下载脚本 项目地址: https://gitcode.com/gh_mirrors/pa/pan-baidu-download
今天要介绍的项目是pan-baidu-download,它能帮你解决百度网盘…
📅 2026/8/3 13:06:09
PC服务器具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构一、前言:具身智能需要“混合算力闭环系统”传统人工智能依赖云端静态数据集训练,不具备物理交互能力,无法适应真实世界的不确定性。具身智能(Embodied…
📅 2026/8/3 0:00:19
前言构建机器人、具身智能这类分布式实时系统,通信底座直接决定整套系统的实时性、容错性、组网能力。分布式领域长期存在 4 类经典通信架构:点对点模式、Broker 中间代理模式、广播模式、以数据为中心(DDS)模式。很多开发者疑惑&…
📅 2026/8/3 0:00:19
完整指南:如何让2008-2017年老款Mac运行最新macOS系统 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher
还在为手中的老款Mac无法升级到最新系统而烦…
📅 2026/8/3 0:00:19
1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…
📅 2026/8/3 1:24:09
温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…
📅 2026/8/3 1:24:09
1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同ÿ…
📅 2026/8/3 1:24:09
AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言
HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…
📅 2026/8/3 1:24:08
无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut
在数字媒体创作领域,视频编辑处理的质量损…
📅 2026/8/3 1:24:08
1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…
📅 2026/8/3 1:24:08