FreeRTOS学习(十三)——队列与中断
上一节学习了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 处理本地文件,为什么不能只靠上传附件?

AI 处理本地文件,为什么不能只靠上传附件?

很多人已经习惯把文档上传给 AI,再让它总结内容。 处理一两个文件时,这种方式足够方便。但当任务涉及整个项目目录、多份表格或持续修改的资料时,反复上传附件很快就会变成新的负担。 上传附件适合一次性问答 例如: 总结这份 …

2026/8/3 12:10:30 阅读更多 →
基于QT与C++的中国象棋游戏开发实战:从MVC架构到AI算法

基于QT与C++的中国象棋游戏开发实战:从MVC架构到AI算法

1. 项目概述:为什么选择QT与C来复刻中国象棋?如果你对桌面应用开发感兴趣,或者想找一个能串联起C面向对象编程、图形界面设计和游戏逻辑的实战项目,那么用QT和C来开发一个中国象棋游戏,绝对是一个“黄金级”的练手选择…

2026/8/3 12:09:30 阅读更多 →
Unity InputSystem 从入门到精通:告别旧版输入系统,掌握现代化输入处理

Unity InputSystem 从入门到精通:告别旧版输入系统,掌握现代化输入处理

1. 项目概述:为什么是时候拥抱InputSystem了?如果你还在Unity项目里用着那个老旧的InputManager,每次处理复杂输入组合(比如“冲刺跳跃切换武器”)时,都得写一堆Input.GetKeyDown和状态管理代码&#xff0c…

2026/8/3 12:09:30 阅读更多 →

最新新闻

GBase 8a MPP Cluster DBA 应该掌握的 100 条命令

GBase 8a MPP Cluster DBA 应该掌握的 100 条命令

GBase 8a MPP Cluster 是面向分析型场景的分布式数据库。它的运维对象不仅包括数据库和 SQL,还包括 Coordinator、gnode、gcware、数据分片、副本、DML/DDL Event、数据装载任务和重分布任务。 如果只按照普通 MySQL 的思路检查 SHOW PROCESSLIST,往往只…

2026/8/3 12:45:52 阅读更多 →
终极指南:Diablo Edit2 - 暗黑破坏神2存档编辑器的完整使用教程

终极指南:Diablo Edit2 - 暗黑破坏神2存档编辑器的完整使用教程

终极指南:Diablo Edit2 - 暗黑破坏神2存档编辑器的完整使用教程 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit Diablo Edit2是一款专业的暗黑破坏神2存档编辑器,支持从经典…

2026/8/3 12:45:52 阅读更多 →
99%人不知道的办公神器!OpenClaw Windows本地部署+实战指令大全

99%人不知道的办公神器!OpenClaw Windows本地部署+实战指令大全

🔥前言:Win11 环境运行 OpenClaw 必读说明 OpenClaw(因其图标形似小龙虾,在社区中常被昵称为“小龙虾”)是一款备受瞩目的本地优先 AI 智能体项目。该项目基于开源协议开发,能够通过自然语言指令驱动计算机…

2026/8/3 12:45:52 阅读更多 →
番茄小说下载器:高效构建个人数字图书馆的5种实用方案

番茄小说下载器:高效构建个人数字图书馆的5种实用方案

番茄小说下载器:高效构建个人数字图书馆的5种实用方案 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 在数字阅读日益普及的今天,fanqienovel-downloader作为一款专…

2026/8/3 12:45:52 阅读更多 →
Linux nohup部署Java应用:从基础命令到生产级运维实战

Linux nohup部署Java应用:从基础命令到生产级运维实战

1. 项目概述:为什么nohup依然是Java后台部署的“定海神针”?在Linux服务器上部署一个需要长期稳定运行的Java后台程序,比如一个数据处理服务、一个API接口服务或者一个定时任务调度器,是后端开发者再熟悉不过的场景。你可能听说过…

2026/8/3 12:45:52 阅读更多 →
1分钟快速解决iPhone USB网络共享问题:Windows用户终极驱动安装指南

1分钟快速解决iPhone USB网络共享问题:Windows用户终极驱动安装指南

1分钟快速解决iPhone USB网络共享问题:Windows用户终极驱动安装指南 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitco…

2026/8/3 12:44:52 阅读更多 →

日新闻

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。…

2026/8/3 0:00:47 阅读更多 →
[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

PC服务器具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构一、前言:具身智能需要“混合算力闭环系统”传统人工智能依赖云端静态数据集训练,不具备物理交互能力,无法适应真实世界的不确定性。具身智能(Embodied…

2026/8/3 0:00:47 阅读更多 →
[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

前言构建机器人、具身智能这类分布式实时系统,通信底座直接决定整套系统的实时性、容错性、组网能力。分布式领域长期存在 4 类经典通信架构:点对点模式、Broker 中间代理模式、广播模式、以数据为中心(DDS)模式。很多开发者疑惑&…

2026/8/3 0:00:47 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 4:36:35 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/2 6:34:16 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/3 5:19:38 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/3 8:27:36 阅读更多 →