立志最细,FreeRtos的中断管理(Interrupt Management)函数,详解!!!
前言:本文参考,韦东山老师开发文档,连接放在最后。
为什么需要中断管理函数?
在FreeRtos操作系统中,需要实时响应性,也就是随时随地必须保证正常多任务的运行,如果有中断发生,因为中断的优先级是最高的,这就导致了,中断中不能有大量执行的任务函数,或者在中断中不能有大量的任务进行切换调用,保证中断的执行是一瞬间,保证RTOS的,实时响应性。否则多任务就不能并发运行。
这就导致了,在中断里面调用函数是不能有延迟等待的,和不能有更高优先级的任务进行切换的,如果有切换因为,中断函数的优先级始终是最高的,被切换的普通函数始终是执行不了的。
同时因为中断内不能有延时函数,所以就常用函数都有中断版本,专门用在中断函数内执行的函数,这些函数没有阻塞延时时间,有参数会记录是否有更高优先级的任务发生,如果有在中断结束后,进行任务切换执行,实际执行是在中断结束之后由任务调度器完成。
到这里,我们知道了,函数有中断版本,是为了保证中断中没有延时,同时在函数内没有函数调用,以及中断版本多出来的参数就是为了,记录是否有更高优先级的任务被调用,如果有在中断执行结束后,由任务调度器调用任务。
函数比较
FreeRtos操作系统的 队列 信号量 事件组 软件定时器 任务通知 都有两套版本的函数,一套用来调用在普通任务上下文,一套被用在中断任务上下文,具体表格如下。
| 类型 | 普通任务上下文 | 中断任务上下文 |
| 队列(queue) | xQueueSendToBack | xQueueSendToBackFromISR |
| 队列(queue) | xQueueSendToFront | xQueueSendToFrontFromISR |
| 队列(queue) | xQueueReceive | xQueueReceiveFromISR |
| 队列(queue) | xQueueOverwrite | xQueueOverwriteFromISR |
| 队列(queue) | xQueuePeek | xQueuePeekFromISR |
| 信号量(semaphore) | xSemaphoreGive | xSemaphoreGiveFromISR |
| 信号量(semaphore) | xSemaphoreTake | xSemaphoreTakeFromISR |
| 事件组(event group) | xEventGroupSetBits | xEventGroupSetBitsFromISR |
| 事件组(event group) | xEventGroupGetBits | xEventGroupGetBitsFromISR |
| 任务通知(task notification | xTaskNotifyGive | vTaskNotifyGiveFromISR |
| 任务通知(task notification | xTaskNotify | xTaskNotifyFromISR |
| 软件定时器(software timer) | xTimerStart | xTimerStartFromISR |
| 软件定时器(software timer) | xTimerStop | xTimerStopFromISR |
| 软件定时器(software timer) | xTimerReset | xTimerResetFromISR |
| 软件定时器(software timer) | xTimerChangePeriod | xTimerChangePeriodFromISR |
这两套函数参数区别只有,最后以为,在普通任务版本中的,最后一位参数是,如有阻塞愿意等待的时间,中断版本参数是,是否记录有更高优先级的任务发生,并在中断函数结束后是否调用。
BaseType_t xQueueOverwrite(QueueHandle_t xQueue,const void * pvItemToQueue);
BaseType_t xQueueOverwriteFromISR(QueueHandle_t xQueue,const void * pvItemToQueue,BaseType_t *pxHigherPriorityTaskWoken);
xHigherPriorityTaskWoken参数
中断函数里面,这个是最后的参数,作用是记录是否在中断的过程,中是否有更高优先级的任务被唤醒了 ,这里需要弄清楚的一点是,在中断函数执行过程中被唤醒的函数的比较对象不是中断函数,而是在中断函数之前被中断函数打断执行的普通任务函数,这两个任务相互比较优先级的大小。
xHigherPriorityTaskWoken这个参数最重要的是,这个参数首先有用户调用时传递给程序,但是它的具体值(pdTRUE或pdFALSE)在函数运行过程中可以由程序去修改。
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
xQueueSendFromISR(myQueue, &data, &xHigherPriorityTaskWoken);
在上面事例程序里面,FreeRtos会检查在中断运行的过程中,是否有比中断发生前执行函数的优先级更高优先级的任务被唤醒,如有 xHigherPriorityTaskWoken 这个参数将被程序设置改变pdTRUE。
所以当我们在ISR里面调用这些中断函数的时候,只需要将 xHigherPriorityTaskWoken 这个参数设置为 pdFALSE,剩下的FreeRtos在运行的时候会自己设置,如果最后为pdTRUE就代表在中断结束后需要切换任务运行,如有依然是pdFALSE,就继续执行被中断打断的任务。
到这里,我们知道了, xHigherPriorityTaskWoken的值虽然是通过参数手动传递的,但是在FreeRtos运行的过程中,会根据任务唤醒情况去设置 xHigherPriorityTaskWoken的值。当值被设定之后,通过调用 portYIELD_FROM_ISR() 在中断响应函数最后,来完成任务的切换。
中断的延迟处理定义
如果在ISR中,中断函数的响应本身就是耗时的,可以使用 中断的延时处理(Deferring interrupt processing)
·ISR :中清除中断标志位,清理,记录工作。
·任务:将更加复杂的事情放在任务重处理。

欢迎指正,希望对你,有所帮助!!!
[10-1]_事件组的本质_哔哩哔哩_bilibili
相关文章:
立志最细,FreeRtos的中断管理(Interrupt Management)函数,详解!!!
前言:本文参考,韦东山老师开发文档,连接放在最后。 为什么需要中断管理函数? 在FreeRtos操作系统中,需要实时响应性,也就是随时随地必须保证正常多任务的运行,如果有中断发生,因为中…...
作业2-线性回归的Matlab代码实现
一、前言 相关配置:Matlab 2020a(版本的影响应该不大,.m代码基本都能运行,个人感觉就是Simulink对版本的要求高一些) 二、任务描述 基于近两节课的理论推导,用代码实现线性回归,并对预测结果进…...
用jQuery在canvas上绘制绝对定位的元素
在Web开发中,我们经常需要在canvas上精确定位和绘制元素。虽然canvas本身不支持DOM元素的定位,但我们可以借助jQuery来实现这一功能。本文将介绍如何使用jQuery在canvas上实现元素的绝对定位。 1. 基本思路 我们的基本思路是: 创建一个包含canvas的容器div将需要定位的元素放…...
Android中 tools:text 和 android:text区别
首先引入命名空间 <androidx.constraintlayout.widget.ConstraintLayoutxmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"/androidx.constraintlayout.widget.ConstraintLayout> tools:te…...
Wordpress GutenKit 插件 远程文件写入致RCE漏洞复现(CVE-2024-9234)
0x01 产品简介 GutenKit 是一个WordPress的页面构建器,在 Gutenberg 设计您的下一个 WordPress 网站。借助 Gutenberg 的原生拖放界面、50+ WordPress 块、14+ 多功能模块和 500+ 模板,您可以在几分钟内创建专业、响应迅速的 Web 内容。 0x02 漏洞概述 Wordpress GutenKit…...
Redis历史漏洞未授权RCE复现
Redis是一个开源的内存数据库,它用于存储数据,并提供高性能、可扩展性和丰富的数据结构支持。 Redis复现文章 Redisssrf漏洞利用探测内网 RedisInsight/RedisDesktopManager可视化连接工具 漏洞原理 (1)redis绑定在 0.0.0.0:…...
Greenhills学习总结
学习背景:近期参与xx项目过程中,遇到较多的关于代码集成编译的知识盲区,因此需要进行相关知识的学习和扫盲。 参考资料:GreenHills2017.7编译手册:本手册是GreenHills 2017.7.14版编译器的软件使用手册。该手册详细介绍了GreenHi…...
【深入学习Redis丨第八篇】详解Redis数据持久化机制
前言 Redis支持两种数据持久化方式:RDB方式和AOF方式。前者会根据配置的规则定时将内存中的数据持久化到硬盘上,后者则是在每次执行写命令之后将命令记录下来。两种持久化方式可以单独使用,但是通常会将两者结合使用。 一、持久化 1.1、什么…...
【27续】c++项目练习
定义一个或多个类,来描述以下需求: 汽车,有多个轮胎,一个发动机,品牌,型号, 价格, 行驶里程。 轮胎,有品牌,尺寸,气压。 发动机,有品牌&#x…...
Lazarus Query转EXCEL功能
Lazarus Query转EXCEL功能 需要用到控件XMLXSDExporter1 procedure SaveToExcel(AQuery:TSQLQuery); var SaveDialog: TSaveDialog; Ext:String; begin SaveDialog : TSaveDialog.Create(nil); SaveDialog.Filter:Excel 97-2003文件(*.xls)|*.XLS; if SaveDialog.Exec…...
AnaTraf | 深入探讨DNS流量分析:保障网络稳定性的关键
目录 什么是DNS流量分析? DNS流量的组成 为什么进行DNS流量分析? DNS流量分析在IT运维中的应用 1. 故障排查 2. 性能监控与优化 3. 安全检测 AnaTraf 网络性能监控系统NPM | 全流量回溯分析 | 网络故障排除工具 在当今数字化时代,互联…...
P1017 [NOIP2000 提高组] 进制转换
题目是意思就是转化 负进制 题干给定内容确实看不懂 我是看了别人的题解才会的 注意点:进制中不能出现负数(解决方法 向前借一位 这是核心代码)抓住 被除数除数*商余数 if(tp<0){//模是负数 就要转化为正数tp-y;xy;}//自己在纸上模拟一…...
计算机网络—vlan(虚拟局域网)
内容补充 冲突域 如果两台设备同时发送数据,他们的数据会互相干扰,那么他们就处于同一冲突域,例如集线器(总线型,所有设备共享带宽)的所有端口都处于冲突域。 广播域 如果一台设备发送数据,…...
C++头文件大全及解释
在C编程中,头文件起到了非常重要的作用。它们包含了函数声明、类定义和其他预处理指令,为程序提供了所需的各种功能和库。本文将介绍一些常见的C头文件,并提供具体实例来说明它们的用途和解释。 1. <iostream> 这是C标准库中最常用的头…...
基于 Django 的电商比价系统
想在毕业设计中展示自己的开发能力吗?今天给大家推荐一个绝对能让你脱颖而出的项目——基于 Django 框架的电商比价系统!主打实用创新,你一定能用它拿下好成绩~🤩 ✨项目核心功能亮点: 完善的用户系统&…...
Excel重新踩坑2:Excel数据类型;自定义格式(设置显示格式);分列操作;其他常用操作;一些重要操作
0、Excel数据类型:文本、数字、逻辑值、错误值 文本数据类型:输入什么显示什么;常见错误值 VALUE:文本与数字运算; DIV/0:分母为0; NAME:公式名称错误; N/A:…...
python从0快速上手(十四)数据库操作
Python学习:数据库操作篇 在这个信息爆炸的时代,数据库就像是一个个巨大的宝藏库,里面藏着无数珍贵的数据宝石。而Python,就是那把能够打开这些宝藏库的神奇钥匙。在这一章中,我们将一起学习如何使用Python来操作数据…...
【热门主题】000004 案例 Vue.js组件开发
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【热…...
Ingress-nginx中HTTPS的强制转发
文章目录 在使用aws 的NLB转发流量到ingress时,发现NLP上生成的转发配置不符合正常预期,如下图: ingress-nginx service 配置如下: apiVersion: v1 kind: Service metadata:annotations:service.beta.kubernetes.io/aws-load-b…...
C++深入探寻二叉搜索树:数据管理的智慧之选
✨✨小新课堂开课了,欢迎欢迎~✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C:由浅入深篇 小新的主页:编程版小新-CSDN博客 前言: 我们在前面已经学习过有关…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
