FreeRTOS笔记(十)中断

2023-11-15

中断

当CPU在执行某一事件A时,发生另外一个更重要紧急的事件B请求CPU去处理(产生了中断),于是CPU暂时中断当前正在执行的事件A任务而对对事件B进行处理,CPU处理完事件B后再返回之前中断的位置继续执行原来的事件A,这一过程统称为中断。

单片机通常拥有丰富的片内外设和很多中断源,中断程序相比于在主程序中使用循环语句轮询系统状态(Polling)能有效提高CPU的利用效率,同时能够更加及时地响应外部事件。

注意

在FreeRTOS中,任务程序由内核调度器统一调度和执行,程序的运行情况在一定程度上是稳定可预测的;中断相对而言是由外部环境决定是不可预测的,会对系统引入不确定性,如果使用不当的话会导致系统的失效和不稳定。

对中断的使用要根据实际需求和使用场景来决定,通过合理的配置和与FreeRTOS的中断管理(Interrupt Management)配合可以达到系统的高效能和高稳定性。

FreeRTOS的中断管理

FreeRTOS对于中断没有特别的处理程序,但提供一些特性和系统API函数方便用户可以简单地实现和维护中断管理。

在FreeRTOS中中断的优先级和任务的优先级是有区别的。可以把任务类比是人间模式,而中断是上帝模式,拥有更高的权限。

  • 任务的优先级是由用户设置内核管理器管理的软件特性(software feature),与操作系统所在的硬件平台无关
  • ISR 虽然也是使用软件实现的,但是它被认为是硬件特性的一部分,因为它跟硬件密切相关
  • 中断的优先级是由硬件平台相关的硬件特性(hardware feature),在中断代码运行的时候任务的代码将无法运行。即使是拥有最小优先级的中断也会打断拥有最高优先级的任务

FreeRTOS对于一些系统API函数提供两种版本,一种是供任务调用的,一种是供中断调用的(Interrupt Safe API)。由中断调用的API函数后缀上会有“FromISR”。

在任务中系统API函数被调用后,如果有更高优先级的任务处于就绪状态的话,内核调度器会自动执行有更高优先级的任务。(需要在FreeRTOSConfig.h头文件中设置configUSE_PREEMPTION为1)。在中断处理代码中系统API函数被调用后,内核调度器不会自动切换到有更高优先级的任务,会把系统API函数中指针参数pxHigherPriorityTaskWoken设置为pdTRUE,然后由用户根据pxHigherPriorityTaskWoken的值自行决定是否切换任务。在中断处理代码中,切换任务的系统API函数如下

portYIELD_FROM_ISR( xHigherPriorityTaskWoken );

如果xHigherPriorityTaskWoken的值是pdFALSE的话,任务切换不会发生;如果xHigherPriorityTaskWoken的值是pdTRUE的话,任务切换会发生。

延迟中断处理

中断处理程序中代码可以尽量简短,并把处理中断的代码放在一个中断任务里。这种方法称为延迟中断处理(deferred interrupt processing)。

通过延迟中断处理用户可以把中断处理当成由调度器调度的一个任务并分配优先级,此时中断的优先级和任务的优先级是一致的。

用户可以把中断任务的优先级设置为最高级,当中断发生在中断处理程序调用portYIELD_FROM_ISR()函数后中断任务将会优先执行。当然如果程序简单的话用户可以直接在中断处理程序中处理中断。

两套API函数列表

FreeRTOS使用两套API 可以让程序更高效。

类型 在任务中 在 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
怎么切换任务
portYIELD_FROM_ISR( xHigherPriorityTaskWoken );  

xHigherPriorityTaskWoken 的含义是:是否有更高优先级的任务被唤醒了。如果为pdTRUE,则意味着后面要进行任务切换。

资源管理

在任务中屏蔽中断
* 在任务中,当前时刻中断是使能的
* 执行这句代码后,屏蔽中断
*/
taskENTER_CRITICAL();
/* 访问临界资源 */
/* 重新使能中断 */
taskEXIT_CRITICAL();

这套 taskENTER_CRITICA()/taskEXIT_CRITICAL()宏,是可以递归使用的,它的内部会记录嵌套的深度,只有嵌套深度变为 0 时,调用 taskEXIT_CRITICAL()才会重新使能中断。

**在 ISR 中屏蔽中断要使用含有"FROM_ISR"后缀的宏 **

暂停调度器

如果需要禁止别的任务来竞争临界资源,不需要关中断,暂停调度器就行了;在这期间,中断正常运行。

/* 暂停调度器 */
void vTaskSuspendAll( void );
/* 恢复调度器
* 返回值: pdTRUE 表示在暂定期间有更高优先级的任务就绪了
* 可以不理会这个返回值
*/
BaseType_t xTaskResumeAll( void );

这套 vTaskSuspendScheduler()/xTaskResumeScheduler()宏,是可以递归使用的,它的内部会记录嵌套的深度,只有嵌套深度变为 0 时,调用 taskEXIT_CRITICAL()才会重新使能中断。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS笔记(十)中断 的相关文章

  • FASTAI and Fine-Tuning BERT with FastAI

    这是一篇笔记类型文章 主要是从新学习一下fastai 和实践 pytorch pretrained BERT 和 pytorch transformers 对接fastai 后简洁快速实现bert模型的训练和执行任务 我还是一个小白 大佬看

随机推荐

  • python Elasticsearch 排序

    sort 与query是同级的 Elasticsearch python sort sort score order desc query function score query match all script score lang p
  • 接口报错之number值过大问题

    number的最大的值为2的53次方 9007199254740992 16位 当你传入的参数为Number类型时候超过16位 js就识别不了 接口会出现错误的情况 可以直接改成字符串就好了 1 JavaScript中所有的数字 无论是整数
  • 合工大 编译原理 实验二 LL1 自动生成M[A,a]

    实验目的 通过完成预测分析法的语法分析程序 了解预测分析法和递归子程序法的区 别和联系 使学生了解语法分析的功能 掌握语法分析程序设计的原理和构造方 法 训练学生掌握开发应用程序的基本方法 有利于提高学生的专业素质 为培 养适应社会多方面需
  • C++ *和&

    简单理解 是指向内存的地址变量 是取变量的地址 介绍参见 https www cnblogs com mr stn p 9037773 html简介
  • spring boot项目显示3行日志错误,内置tomcat不可使用

    spring boot项目显示3行日志错误 内置tomcat不可使用 首先这中错误是只显示三行 第一种方法是没有用spring boot starter web 在pom中将这个依赖放在第一个 第二种方法是继承ServletInitiali
  • 详解如何将python3.6软件的py文件打包成exe程序

    本文来源于公众号 csdn2299 喜欢可以关注公众号 程序员学府 这篇文章主要介绍了详解如何将python3 6软件的py文件打包成exe程序 小编觉得挺不错的 现在分享给大家 也给大家做个参考 一起跟随小编过来看看吧 在我们完成一个Py
  • Codeforces Round 867 (Div. 3)(A题到E题)

    链接 Dashboard Codeforces Round 867 Div 3 Codeforces 头一次div3做出来四题 第五题也差临门一脚 赛后看到别人e题跟自己几乎一样的思路肠悔青了 还得练才行 A TubeTube Feed 签
  • 网络系列--如何理解网络“软化”?简要整理分析网络软化的赋能技术。

    文章目录 对网络软化的理解 SDN NFV NFV与SDN简单对比 如何理解网络 软化 简要整理分析网络软化的赋能技术 对网络软化的理解 在互联网飞速发展的今天 通信网络规模爆发式的增长以及客户对网络性能需求的多样性 对网络的灵活性和敏捷性
  • 【0day】复现时空智友企业流程化管控系统SQL注入漏洞

    注 该文章来自作者日常学习笔记 请勿利用文章内的相关技术从事非法测试 如因此产生的一切不良后果与作者无关 目录 一 漏洞描述 二 影响版本 三 资产测绘 四 漏洞复现 一 漏洞描
  • cocos2d-x实例学习(8)之CCJumpTo和CCJumpBy

    CCJumpTo和CCJumpBy概念 CCJumpTo 把某一CCSprite跳到某一位置 CCJumpBy 把某一CCSprite跳起一段距离 它有一个方法reverse 它让对象按原路径返回 CCJumpTo和CCJumpBy示例 创
  • react中context的使用详解

    先说一说context是干什么的 跨层级通信 一般组件通信的方法都是通过props来传递 不过这种方法当有了第三级或往后孙孙组件的时候就显得比较繁琐 以及不好修改 这时我们可以使用context来管理这些数据 不管多少层级都能让想要使用这些
  • 线程函数不能为类成员函数_GPU编程2CUDA核函数和线程配置

    CUDA核函数 在GPU上执行的函数称为CUDA核函数 Kernel Function 核函数会被GPU上多个线程执行 我们可以在核函数中获取当前线程的ID CUDA核函数的定义 global void addKernel int c co
  • 堆栈桢的生成原理

    摘要 那么Windbg分析Dump时 会如何推理堆栈过程呢 如果每个函数都是有标准的push ebp 那么按照ebp递推就可以了 否这就只能用其他方法分析 比如看看堆栈里某个地址是不是函数返回地址 该地址属于某个模块的代码段 这样就可以确定
  • mac系统下面调用brew报错core_ext/kernel_require.rb:55:in `require': cannot load such file

    mac系统下面调用brew报错 如下所示 usr local Homebrew Library Homebrew vendor portable ruby 2 3 7 lib ruby 2 3 0 rubygems core ext ker
  • [598]Windows版InfluxDB及相关软件安装与配置

    公司在做一个工业监控系统 虽然数据采集点并不算多但是数据量积累下来也非常大 使用mysql数据库进行数据存储和查询时很慢 所以让我调研一下时序数据库 通过调研和了解时序数据库在海量数据的读取和写出都比关系型数据库和NoSql快很多 有人做过
  • 如何向 Pandas DataFrame 添加行

    您可以使用df loc 函数在Pandas DataFrame的末尾添加一行 add row to end of DataFrame df loc len df index value1 value2 value3 您可以使用df appe
  • 计算机网络基本概念相关习题(二)

    一 单项选择题 1 不是对网络模型进行分层的目标 A 提供标准语言 B 定义功能执行的方法 C 定义标准界面 D 增加功能之间的独立性 2 将用户数据分成一个个数据块传输的优点不包括 A 减少延迟时间 B 提高错误控制效率 C 使多个应用更
  • 毕业答辩模板

    毕业答辩准备工作 一 首先是开场白 各位老师 上午好 我叫 是 级 班的学生 我的论文题目是 论文是在 导师的悉心指点下完成的 在这里我向我的导师表示深深的谢意 向各位老师不辞辛苦参加我的论文答辩表示衷心的感谢 并对三年来我有机会聆听教诲的
  • 三层架构、MVC、前后分离的一些知识

    三层架构 MVC 前后分离的一些知识 三层架构模型 MVC模式 三层架构与 MVC 架构区别 前后端分离开发时的变化 一个前后端分离项目的分层 前端 MVVM 后端 Service层 Model层 Mapper映射 BLL业务逻辑层 DAL
  • FreeRTOS笔记(十)中断

    中断 当CPU在执行某一事件A时 发生另外一个更重要紧急的事件B请求CPU去处理 产生了中断 于是CPU暂时中断当前正在执行的事件A任务而对对事件B进行处理 CPU处理完事件B后再返回之前中断的位置继续执行原来的事件A 这一过程统称为中断