FreeRtos入门-7 中断管理

中断管理

中断管理相比非中断的优势

1,简洁和效率。

2,同步和安全。提供了中断安全的操作,确保在中断上下文中执行时不会引发竞态条件或破坏系统状态。

3,通过配置中断的优先级,可以确保高优先级的中断能够立即响应,而低优先级的中断则可以在需要时等待

4,系统稳定性:非管理的中断通常直接将中断服务程序挂到中断向量表上,这需要用户自己处理上下文的保存与恢复。如果处理不当,可能会导致堆栈错误。相比之下,通过FreeRTOS进行中断管理可以确保这些操作的正确性和一致性,从而提高系统的稳定性。

FreeRTOS 中很多 API 函数都有两套,

为什么不使用同一套函数,在函数里面判断用任务还是ISR

使用同一套函数的话,需要增加额外的判断代码、增加额外的分支,是的

函数更长、更复杂、难以测试

在任务、ISR 中调用时,需要的参数不一样,

如果强行把两套函数揉在一起,会导致参数臃肿、无效

任务中使用

ISR 中使用

API函数会导致任务进入阻塞

ISR不是任务,ISR不能进入阻塞

需要指定超时时间,表示如果不成功就阻塞一会

不需要指定超时时间,无论是否成功都要即刻返回

队列(queue)

xQueueSendToBack

xQueueSendToBackFromISR

xQueueSendToFront

xQueueSendToFrontFromISR

xQueueReceive

xQueueReceiveFromISR

xQueueOverwrite

xQueueOverwriteFromISR

xQueuePeek

xQueuePeekFromISR

信号量(semaphore)

xSemaphoreGive

xSemaphoreGiveFromISR

xSemaphoreTake

xSemaphoreTakeFromISR

事件组(event group)

xEventGroupSetBits

xEventGroupSetBitsFromISR

xEventGroupGetBits

xEventGroupGetBitsFromISR

任务通知(task notification)

xTaskNotifyGive

vTaskNotifyGiveFromISR

xTaskNotify

xTaskNotifyFromISR

软件定时器(software timer)

xTimerStart

xTimerStartFromISR

xTimerStop

xTimerStopFromISR

xTimerReset

xTimerResetFromISR

xTimerChangePeriod

xTimerChangePeriodFromISR

xHigherPriorityTaskWoken

含义是:是否有更高优先级的任务被唤醒了。

如为pdTRUE,则意味着后面要进行任务切换。

*pxHigherPriorityTaskWoken 等于 pdTRUE:函数的操作导致更高优先级的任务就绪了,ISR 应该进行任务切换

*pxHigherPriorityTaskWoken 等于 pdFALSE:没有进行任务切换的必要

不在"FromISR"函数内部进行任务切换,而只是标记一下而已呢

这些带ISR后缀的函数,不会发起调度,会唤醒任务,但不会引起调度,会在xHigherPriorityTaskWoken记录是否需要调度

portYIELD_FROM_ISR(xHigherPriorityTaskWoken);

这条代码根据上面的变量来切换是否需要调度

这条代码是触发调度,不是即刻引起调度

//更改上诉的按键中断管理的代码
void EXTI0_IRQHandler(void)
{static int cnt = 0;BaseType_t xHigherPriorityTaskWoken;if(EXTI_GetITStatus(EXTI_Line0) != RESET){printf("EXTI0_IRQHandler cnt = %d\r\n", cnt++);/* 使用定时器消除抖动 *///    xTimerReset(xMyTimerHandle, 0); /* Tcur + 2000 */   //按键触发后,复位定时器,如果有多次抖动,会多次复位,直至最后一次进入按键中断后,开始记录2000ms,这里的2000ms为了调试方便,实际运用20ms即可xTimerResetFromISR(xMyTimerHandle, &xHigherPriorityTaskWoken); portYIELD_FROM_ISR(xHigherPriorityTaskWoken);key_start = xTaskGetTickCount() ;printf("key_start = %d\r\n",key_start);EXTI_ClearITPendingBit(EXTI_Line0);     //清除中断}     
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/796186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

配置Mysql集群主从复制报错

配置Mysql集群主从复制报错: 我在master创建了一个数据库(demo_ds_0),然后又快速删除了。然后又再次创建了 demo_ds_0, 发现 slave 数据库没有将 demo_ds_0 库同步过来。 后面在 slave 数据库中执行 show slave status 发现 SLave_IO_Running 字段是 …

OpenHarmony开发-系统烧录

本文详细介绍了烧录OpenHarmony系统到开发板的操作流程。从基础的硬件准备和软件环境设置入手,详细说明了如何配置开发环境、构建系统镜像等过程,详细描述了烧录过程中的关键步骤,以及如何使用专用工具将OpenHarmony系统镜像传输到开发板。同…

蓝桥杯每日一题:公约数(gcd)

题目描述: 给定两个正整数 a 和 b。 你需要回答 q 个询问。 每个询问给定两个整数 l,r,你需要找到最大的整数 x,满足: x 是 a和 b 的公约数。l≤x≤r。 输入格式 第一行包含两个整数 a,b。 第二行包含一个整数 q。 接下来…

力扣Lc29---- 541. 反转字符串 II(java版)-2024年4月06日

1.题目描述 2.知识点 (1)执行步骤如下: 初始化 s “abcdefg” 和 k 2 将字符串分割成长度为 2k 4 的块。 对每个块中的前 k 2 个字符进行反转。 执行过程 1)第一次循环(i 0) start 0 end Math.min(0…

当下鸿蒙开发热潮,大前端开发有没有必要搞!!!

鸿蒙到底好不好?要不要搞? Android开发反正目前工作感觉也不好找,即便是上海这样的大城市也难搞,人员挺饱和的。而且年前裁员的公司那么多,再看自己,年龄不是优势;技术不是优势,想想…

16 - 程序计数器和内存

---- 整理自B站UP主 踌躇月光 的视频 1. 程序计数器 程序计数器需要支持后续程序的运行,需要支持跳转,所以需要一个预置数的功能。我们在 ALU 前面加上个寄存器。 2. 内存控制器 3. 通过程序计数器读取内存 辅助工具 4. 实验工程 【16 - 程序计数器和…

【C++】红黑树讲解及实现

前言: AVL树与红黑树相似,都是一种平衡二叉搜索树,但是AVL树的平衡要求太严格,如果要对AVL树做一些结构修改的操作性能会非常低下,比如:插入时要维护其绝对平衡,旋转的次数比较多,更…

降低笔记本电脑噪音的七种方法,看下有没有适合你的

序言 无论是玩游戏、浏览网络还是做严肃的工作,差不多都有这么一台笔记本电脑,它有足够的处理能力来处理几乎任何事情。不幸的是,它可能会变得非常大声,但有办法来遏制这种噪音。 清洁通风口和风扇,并使用硬表面 如果你的笔记本电脑现在比过去运行同样的软件时声音更大…

【MySQL基础】MySQL基本操作详解

系列文章目录 第1篇:【MySQL基础】MySQL介绍及安装 第2篇:【MySQL基础】MySQL基本操作详解 文章目录 ✍1,数据库操作     🔍1.1,查看数据库     🔍1.2,创建数据库     🔍1.3,选择数据库    …

腾讯云添加域名后不生效

问题原因 添加域名后不生效可能是因为没有加CDN域名解析 解决步骤

MacOS Docker 可视化面板 Portainer

一、简介 Portainer 是一个可视化的容器镜像图形管理工具,使用 Portainer 可以轻松构建、管理和维护Docker 环境。 而且完全免费(portainer-ce 是免费的,portainer-ee 是需要授权的,今天安装的是 portainer-ce 版本)&…

Java多态练习2

设计金融产品类Financial,属性包括产品名称、产品介绍、起投金额、产品期限(int)、年化收益(百分数);方法包括发布、截止、投资。 设计金融产品类子类: 基金产品Fund,继承金融产品类…

Jenkins (三) - 拉取编译

Jenkins (三) - 拉取编译 通过Jenkins平台 git 拉取github上项目,通过maven编译并打包。 Jenkins 安装 git 插件 Manager Jenkins -> Plugins -> Available plugins -> Git 打包编译检验 FressStyle 风格编译 New Item输入 item name Spring-Cloud-1…

LeetCode---127双周赛

题目列表 3095. 或值至少 K 的最短子数组 I 3096. 得到更多分数的最少关卡数目 3097. 或值至少为 K 的最短子数组 II 3098. 求出所有子序列的能量和 一、或值至少k的最短子数组I&II 暴力的做法大家都会,这里就不说了,下面我们来看看如何进行优化…

1、快速上手Docker:入门指南

文章目录 Linux中安装docker防火墙端口配置web项目需要的环境安装yarn安装nodejs安装脚手架并准备项目 构建镜像启动镜像查看日志管理镜像推送镜像 发布项目准备服务器环境部署项目: PS:扩展一点小知识 这篇文章只是docker入门的第一个Docker项目&#x…

STM32使用HAL库获取GPS模块HT1818Z3G5L信息(方法1)

1、写在最前 先了解一下GPRMC的格式 格 式: GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,A*50 说 明: 字段 0:$GPRMC,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data&…

数据结构|排序总结(1)|直接插入排序

排序分类 插入排序:直接插入排序,希尔排序 选择排序:选择排序,堆排序 交换排序:冒泡排序,快速排序 归并排序 插入排序 直接插入排序 相当于摸牌,例如我们现在手上有{2,4&#xff0…

碘浊度法与红外相机联用测定食品中维生素C

🌞欢迎来到看论文的世界 🌈博客主页:卿云阁 💌欢迎关注🎉点赞👍收藏⭐️留言📝 🌟本文由卿云阁原创! 📆首发时间:🌹2024年4月6日&…

数据库的简单查询

一、检索一列或多列1.检索单独一列 select 列名 from 表名; select order_num from orders; 2.检索多列数据 select 列 1,列 2... from 表名; select order_num,order_date from orders; select order_date,order_num from orders; 3.查询所有字段 select * from…

正排索引 vs 倒排索引 - 搜索引擎具体原理

阅读导航 一、正排索引1. 概念2. 实例 二、倒排索引1. 概念2. 实例 三、正排 VS 倒排1. 正排索引优缺点2. 倒排索引优缺点3. 应用场景 三、搜索引擎原理1. 宏观原理2. 具体原理 一、正排索引 1. 概念 正排索引是一种索引机制,它将文档或数据记录按照某种特定的顺序…