立志最细,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博客 前言: 我们在前面已经学习过有关…...
CentOS 7.6 下 OpenGauss 6.0 极简版安装踩坑实录:从用户权限到远程连接的全流程避坑
CentOS 7.6 下 OpenGauss 6.0 极简版安装实战:从权限配置到远程访问的深度排坑指南 国产数据库的崛起让OpenGauss逐渐成为企业级应用的新选择。但初次部署时,从用户权限到环境变量配置的每个环节都可能成为"拦路虎"。本文将带你穿越安装全流程…...
软件测试新范式:Phi-4-mini-reasoning智能生成测试用例与缺陷报告
软件测试新范式:Phi-4-mini-reasoning智能生成测试用例与缺陷报告 1. 传统测试流程的痛点与变革契机 在软件测试领域,工程师们长期面临着一个核心矛盾:随着敏捷开发和持续交付的普及,测试周期被不断压缩,但测试覆盖率…...
从工业控制到智能家居:手把手教你根据项目需求选对RTOS(ThreadX vs. FreeRTOS实战指南)
从工业控制到智能家居:手把手教你根据项目需求选对RTOS(ThreadX vs. FreeRTOS实战指南) 在嵌入式系统开发中,选择合适的实时操作系统(RTOS)往往决定了项目的成败。面对工业控制的高精度需求或智能家居的成本…...
智慧算力枢纽中心建设方案:从“烟囱林立”到“云网融合”的数字化重构(PPT)
摘要:本文基于《智慧算力枢纽中心建设方案》,深度剖析了在数字经济爆发式增长背景下,如何通过“云-网-端”一体化架构解决传统IT基础设施“资源孤岛、运维割裂、安全脆弱”的行业痛点。文章详细阐述了从传统服务器向全栈资源池化演进的技术路…...
效率提升秘籍:借助快马平台快速构建魔鬼面具图像滤镜应用
最近在做一个有趣的个人项目——魔鬼面具在线滤镜应用。作为一个前端开发者,我发现这类图像处理应用如果从零开始搭建会花费大量时间在基础框架上,而使用InsCode(快马)平台可以快速生成项目骨架,让我能专注于核心功能的实现。下面分享下我的开…...
09-开关电源滤波设计
1.开关电源滤波设计-差模干扰 (1)LISN电源 传导干扰(CE)测试的仪器,CE测试的频率范围为:150kHz到30MHz,其本质是噪声电流,将噪声电流转换为噪声电压来测量。 1uF和50uH,…...
PT站一键转载脚本:100+站点支持,彻底告别手动转载烦恼
PT站一键转载脚本:100站点支持,彻底告别手动转载烦恼 【免费下载链接】auto_feed_js PT站一键转载脚本 项目地址: https://gitcode.com/gh_mirrors/au/auto_feed_js PT(Private Tracker)社区的资源分享一直是核心文化&…...
OpenClaw权限精细化控制:Qwen2.5-VL-7B模型访问目录限制
OpenClaw权限精细化控制:Qwen2.5-VL-7B模型访问目录限制 1. 为什么需要权限控制 最近在本地部署了Qwen2.5-VL-7B多模态模型,通过OpenClaw实现自动化办公流程时,突然意识到一个问题:当AI助手能自由访问我的整个文件系统时&#x…...
BG3 Mod Manager:解决模组管理难题的一站式解决方案
BG3 Mod Manager:解决模组管理难题的一站式解决方案 【免费下载链接】BG3ModManager A mod manager for Baldurs Gate 3. This is the only official source! 项目地址: https://gitcode.com/gh_mirrors/bg/BG3ModManager 引言:告别博德之门3模组…...
dp动规 - 水质检测
题目 题目分析 有两行水质检测器,每一行的长度皆为n,现在的目的就是要让检测器之间联通,求至少需要多添加几台水质检测器? 思路梳理 错误思路 看到有图的时候,这道题我第一个思路想到了用BFS,观察测试用…...
