当前位置: 首页 > backend >正文

FreeRTOS任务与中断服务程序ISR

FreeRTOS任务与中断服务程序ISR

  • Free RTOS与硬件中断的管理与使用
    • FreeRTOS与硬件中断的关系
    • 中断优先级分组策略
  • MCU中断与RTOS任务管理的原理及区别
    • 任务与ISR函数关系
    • 任务函数与中断的ISR运行时序图
  • 临界区管理
    • FreeRTOS中的中断管理和宏函数使用

Free RTOS与硬件中断的管理与使用

FreeRTOS与硬件中断的关系

FreeRTOS的任务有优先级,MCU的硬件中断也有中断优先级,这是两个不同的概念。FreeRTOS任务管理要用到硬件中断,使用FreeRTOS时也可以使用硬件中断。但是硬件中断的中断服务程序的设计要注意一些设计原则。在本章中我们将详细介绍FreeRTOS与硬件中断的关系,以及如何正确的使用硬件中断。

中断是MCU的硬件特性。STM32使用4个位设置优先级分组策略,优先级数字越低,优先级别越高。每个中断有一个ISR

FreeRTOS在SysTick中断里进行任务调度申请,在PendSV中断里进行任务调度。启用FreeRTOS后,会自动设置NVIC。

中断优先级分组策略

在这里插入图片描述中FreeRTOS默认将中断优先级分组设置为 Group 4(全部4位用于抢占优先级,无子优先级),以简化中断管理。

在这里插入图片描述

  • configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY(默认值为5):
    • 定义FreeRTOS可管理的最高中断优先级。
    • 仅允许优先级 ≥ 5 的中断调用FreeRTOS的中断安全API函数(如 xSemaphoreGiveFromISR)。
    • 绝对禁止在优先级 < 5 的中断中调用任何FreeRTOS API函数,包括带 FromISR 后缀的函数。

在这里插入图片描述
在NVIC的最右侧也会多出来一列使用Free RTOS的函数。如果勾选了这一项的话,就表示要在中断的ISR中来使用Free RTOS似的API函数。那么这个中断的优先级就不能小于5,也就是中断优先级不能设的更低。这个复选框并不会对生成的代码产生影响,它只是改变了中断优先级的可设置范围。

System tick time的中断优先级是15也是最低的系统,在System tick time中断里发出任务调度请求,只有在没有其他中断ISR运行的情况下,任务调度请求才能被及时响应。根据NVIC管理中断的特点,同等抢占优先级的中断是不能发生抢占的。所以说即使有一个强占优先级为15的中断,ISR在运行,那这两项中断就无法被及时的响应,也就不会发生任务调度,任务函数也就不会被执行。

MCU中断与RTOS任务管理的原理及区别

在这里插入图片描述

在这里插入图片描述

任务与ISR函数关系

在这里插入图片描述

任务函数与中断的ISR运行时序图

在这里插入图片描述
总结ISR执行时就无法执行任务函数。所以说如果一个ISR执行的时间比较长,任务函数就无法及时的执行,FreeRTOS也无法进行任务调度,就会导致软件响应变迟钝。

在实际的软件设计中,一般要尽量简化ISR的功能,尽可能的减少ISR占用CPU的时间。例如采用中断方式进行ADC数据采集时,只需要在ADC的中段里将数据读到缓冲区,而对数据进行滤波、频谱计算等耗时的工作就转移到任务函数里运行。当然这就涉及了中断ISR与任务函数之间的同步问题。这就是进程间的通信问题。

临界区管理

  • 用于保护共享资源,暂停任务调度,防止高优先级任务抢占当前任务。
  • 在临界区中,中断可能被屏蔽(具体取决于配置),但不会影响同优先级或更低优先级的中断。
    在这里插入图片描述

FreeRTOS中的中断管理和宏函数使用

在这里插入图片描述
可以使用taskDISABLE_INTERRUPTS来屏蔽mcu的部分中断,然后使用taskENABLE_INTERRUPTS就可以解除屏蔽。

在这里插入图片描述
taskENTER_CRITICAL()以及taskEXIT_CRITICAL(),你在这两个函数之间就可以界定一个临界代码段。在临界代码段内,FreeRTOS会暂停任务调度,正在执行的任务是不会被更高优先级的任务抢占的,能够保证代码执行的连续性。

标有FROM_ISR的两个宏函数是中断服务程序ISR版。
在这里插入图片描述
FreeRTOS API函数分为两个版本的好处是在API的实现代码中,无需判断调用这个API的函数是一个ISR还是一个任务函数。这样就不需要再添加额外的代码,FreeRTOS代码运行效率就会更高。

注意:在ISR中绝对不可以使用任务级API函数,但是在任务函数中是可以使用中断级的API函数的。
在这里插入图片描述

http://www.xdnf.cn/news/4331.html

相关文章:

  • 推荐系统架构设计
  • 雅思阅读--易错词汇60个
  • 《深入理解分布式系统》之认识分布式系统
  • 兰亭妙微设计外包:把专业交给专业,让创意落地生花
  • Kaamel白皮书:GenAI 时代的隐私困境
  • 依图科技C++后端开发面试题及参考答案
  • 基于 Spring Boot 瑞吉外卖系统开发(十)
  • NVIDIA Halos:智能汽车革命中的全栈式安全系统
  • LeetCode 220 存在重复元素 III 题解
  • LeetCode热题100--238.除自身以外数组的乘积--中等
  • 替换所有的问号 --- 模拟
  • Windows下安装EMQX服务代理和MQTTX客户端服务器
  • 小土堆pytorch--transform
  • sqli-labs靶场通关保姆级教学(Get传输篇)Less-1Less-10
  • CyberSentinel AI开源程序 是一个自动化安全监控与AI分析系统
  • (一)毛子整洁架构(Domain Layer/Repository Pattern/Result Pattern/Error Pattern)
  • Python基于Django的在线考试系统【附源码、文档说明】
  • WiFi那些事儿(六)
  • JavaSE核心知识点01基础语法01-03(流程控制:顺序、分支、循环)
  • C语言的重要知识点☞static关键字
  • C语言_可变参数_LOG宏
  • 2.Redis高阶实战
  • git常用命令
  • RN学习笔记 ✅
  • 如何判断内核模块是否为最新版本?
  • tinyrenderer笔记(上)
  • 【Linux我做主】深入探讨从冯诺依曼体系到进程
  • v-modal失效如何解决
  • 深入浅出iOS性能优化:打造极致用户体验的实战指南
  • 仓颉语言深度解析