FreeRTOS的中断管理

news2024/12/25 1:51:37

前言

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

1、FreeRTOS与中断设置

        中断是MCU的硬件特性,FreeRTOS的运行要用到中断,因为它的上下文切换就是在PendSV中断中进行的,FreeRTOS还需要一个基础时钟产生滴答信号,CubeMX中启动FreeRTOS后,系统会自动对NVIC进行一些设置,这些设置是必要的

        启用FreeRTOS后,中断优先级分组策略自动设置为4位全用于抢占优先级,所以优先级编号是0到15,这个参数在FreeRTOS中不能修改,默认为4

        FreeRTOS可管理的最高优先级默认值为5,也就是说,只有在中断优先级等于或大于5的中断ISR里,才可以调用FreeRTOS的中断安全API函数,也就是带 FromISR 后缀的函数,使用taskDISABLE_INTERRUPTS() 函数也只能屏蔽优先级数值等于或者大于5的中断

2、任务与中断的关系

        MCU的中断有中断优先级,有中断服务例程(ISR),FreeRTOS的任务有任务优先级,有任务函数,这两者具体的特点和区别如下

1、中断是MCU特有的硬件属性,由硬件时间和软件信号引起中断,运行哪个ISR是由硬件决定的,中断的优先级数字越小,表示优先级越高,所以中断的最高优先级是0

2、FreeRTOS的任务是一个纯软件概念,与硬件系统无关,任务的优先级是由开发者在软件中赋予的,任务的优先级数字越低,表示优先级越低,所以任务的最低优先级为0,FreeRTOS的任务调度器决定哪个任务处于运行状态,FreeRTOS在中断优先级15的PendSV中断里进行上下文切换,所以只要有中断ISR在运行,FreeRTOS就无法进行切换

3、任务只有在没有ISR运行的时候才能运行,即使是优先级最低的中断,也可以打断高优先级的任务去执行,而任务不能抢占ISR的运行

        注意对最后一条规则的理解,根据NVIC管理中断的原则,同等抢占优先级的中断是不能发生抢占的,一个优先级为15的RTC唤醒中断是不能抢占优先级为15的SysTick和PendSV中断的执行的,这是因为SysTick和PendSV中断的ISR运行时间很短,RTC唤醒中断的ISR能被及时执行,但如果优先级为15的RTC唤醒中断执行时间很长,那么SysTick和PendSV发生了中断也无法抢占,也就无法进行任务调度,任务函数也无法执行

        所以在实际的软件设计中,一般要尽量简化ISR的功能,使其减少占用CPU的时间,一般的硬件中断都是处理一些数据的接收或发送工作,例如采用中断方式进行ADC数据采集时,只需要把ADC的中断里将数据读取到缓冲区,而对数据进行滤波,频谱计算等耗时间的工作就转移到任务中处理。

3、中断屏蔽和临界段代码

        一个任务函数在执行时,可能会被其他高优先级的任务抢占CPU,也可能被任何一个中断的ISR抢占CPU,在某些时候,任务的某段代码可能非常关键,需要连续执行完,不希望被其他任务或者中断打断,这种程序段被成为临界段,在FreeRTOS中,有函数定义临界段代码,也可以屏蔽系统的部分中断

我们在文件task.h中定义了几个宏函数,定义代码如下,函数功能见注释

//开启临界段代码
#define taskENTER_CRITICAL()		portENTER_CRITICAL()
#define taskENTER_CRITICAL_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR()

//退出临界段代码
#define taskEXIT_CRITICAL()			portEXIT_CRITICAL()
#define taskEXIT_CRITICAL_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( x )

//屏蔽MCU的部分中断 5-15 以及解除屏蔽
#define taskDISABLE_INTERRUPTS()	portDISABLE_INTERRUPTS()
#define taskENABLE_INTERRUPTS()		portENABLE_INTERRUPTS()

4、在ISR中使用FreeRTOS的API函数

        在中断的ISR里,有时会需要调用FreeRTOS的API函数,但是调用普通的API函数可能会存在问题,例如在ISR中调用vTaskDelay()就会出现问题,因为在vTaskDelay会使任务进入阻塞状态,而ISR根本就不是任务,ISR运行的时候,也不能进行任务调度

        为此,FreeRTOS的API函数分为两个版本,一个被成为“任务级”,既普通名称的API函数,另一个被成为“中断级”,既带后缀的FromISR的函数,中断API也被成为中断安全API函数

        FreeRTOS将API函数分为两个版本的好处是:在API的实现代码中,无须判断调用这个API函数的是一个ISR还是一个任务,否则需要增加额外的代码,而且不同的MCU判断ISR和任务函数的机制也不一样,所以两个版本的API函数会提升我们开发的效率

        在ISR中,绝对不能使用任务级API函数,但是在任务函数中,可以使用中断级API函数,此外在FreeRTOS不能管理的高优先级中断的ISR中,连中断级的API函数也不能调用

5、FreeRTOS中断及ISR的设计原则

根据FreeRTOS管理中断的特点,中断优先级和ISR程序设计应该遵循如下原则

1、根据参数的设置,MCU的优先级为0到15的中断,分为FreeRTOS不可屏蔽中断和可屏蔽中断,要根据中断的重要性和功能,为其设置合适的中断优先级,使其成为FreeRTOS的不可屏蔽中断和可屏蔽中断

2、ISR的代码应该尽量简短,应该将比较耗时的处理功能转移到任务函数中实现

3、可屏蔽中断的ISR中,能调用中断级的FreeRTOS API函数,绝不能调用普通的API函数,在不可屏蔽中断的ISR中,不能调用任何的FreeRTOS的API函数

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

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

相关文章

RVC变声器入门

主要参考资料: RVC变声器官方教程:10分钟克隆你的声音!一键训练,低配显卡用户福音!: https://www.bilibili.com/video/BV1pm4y1z7Gm/?spm_id_from333.337.search-card.all.click&vd_sourcedd284033cd0c4d1f3f59a2…

RocketMQ消息发送之广播模式

前言 在前面的文章中我们回顾了RocketMQ的顺序消息和乱序消息,以及里面包含的乱序消息和全局消息,RocketMQ支持多种消息类型和消费模式 今天这篇文章主要介绍RocketMQ的广播消息。希望文章能为正在学习RocketMQ相关知识的大佬们提供帮助! 广…

全自动ai生成视频MoneyPrinterTurbo源码 在线ai生成视频源码

介绍: 现在短视频这么火爆,流量就是金钱。 如果能全自动的生成短视频,是不是很容易带来流量,赚到马内。 MoneyPrinter 这个开源项目就可以自动生成短视频,而且质量还不错,不是那种低质的营销视频。 使用…

画个心,写个花!Python Turtle库带你玩转创意绘图!

文章目录 前言一、Turtle 库基础介绍二、画布设置三、画笔属性设置1.画笔颜色设置2.画笔粗细与速度设置3.画笔形状设置 四、画笔移动函数五、画笔控制函数六、实战案例一:“花”字绘制七、实战案例二:心型图案绘制总结 前言 Python 的 turtle 库是一种简…

【MySQL内置数据库】 mysql

目录 统计 columns_priv component db default_roles engine_cost func general_log global_grants gtid_executed help_category help_keyword help_relation help_topic innodb_index_stats innodb_table_stats ndb_binlog_index password_history plugin…

【RocketMQ】SpringBoot整合RocketMQ

🎯 导读:本文档详细介绍了如何在Spring Boot应用中集成Apache RocketMQ,并实现消息生产和消费功能。首先通过创建消息生产者项目,配置POM文件引入RocketMQ依赖,实现同步消息发送,并展示了如何发送普通字符串…

STM32+ADC+扫描模式

1 ADC简介 1 ADC(模拟到数字量的桥梁) 2 DAC(数字量到模拟的桥梁),例如:PWM(只有完全导通和断开的状态,无功率损耗的状态) DAC主要用于波形生成(信号发生器和音频解码器) 3 模拟看门狗自动监…

Ract vs Vue 你更喜欢谁?

React 和 Vue 是当今最受欢迎的两个前端框架,各自有其独特的特点和优势。以下是对这两个框架的详细比较和分析,以帮助你了解它们的异同和适用场景: React 简介 React 是由 Facebook 开发和维护的一个开源 JavaScript 库,主要用于…

OpenAI员工流失的背后:地盘争夺、倦怠、薪酬要求

近日,OpenAI的CTO Mira Murati宣布离职,同一天,首席研究官Bob McGrew、研究副总裁Barret Zoph也宣布离职。 据统计,这已经是2024年第11起OpenAI高管离职事件了。 至今,开启“ChatGPT时刻”的四位OpenAI领袖&#xff…

河南移动:核心营业系统稳定运行超300天,数据库分布式升级实践|OceanBase案例

河南移动,作为电信全业务运营企业,不仅拥有庞大的客户群体和业务规模,还引领着业务产品与服务体系的创新发展。河南移动的原有核心营业系统承载着超过6000万的庞大用户量,管理着超过80TB的海量数据,因此也面临着数据规…

扩散模型(2)--1

1.简介 生成模型通过学习并建模输入数据的分布,从而采集生成新的样木,该模型广泛运用于图片视频生成、文本生成和药物分子生成。扩散模型是一类概率生成模型,扩散模型通过向数据中逐步加入噪声来破坏数据的结构,然后学习一个相对应…

在Windows系统上安装的 Boost C++ 库

步骤一 https://www.boost.org/users/history/version_1_86_0.html 下载Boost库文件: 步骤二 安装: https://www.boost.org/doc/libs/1_52_0/doc/html/bbv2/installation.html 点击运行.\bootstrap.bat脚本在当前目录的powershell中执行:./b2 install --prefixPREFIX 然后…

优选拼团平台架构解析与关键代码逻辑概述

一、系统架构设计 唐古拉优选拼团平台采用多层架构设计,主要包括前端展示层、业务逻辑层、数据访问层及数据存储层。 前端展示层:负责用户界面的展示和交互,包括商品列表、拼团详情、订单管理等页面。前端采用现代前端框架(如Vue…

第十四周学习周报

目录 摘要Abstract1. LSTM的代码实现2. 序列到序列模型3. 梯度与方向导数总结 摘要 在上周的学习基础之上,本周学习的内容有LSTM的代码实现,通过对代码的学习进一步加深了对LSTM的理解。为了切入到transformer的学习,本文通过对一些应用例子…

JUC高并发编程4:集合的线程安全

1 内容概要 2 ArrayList集合线程不安全 2.1 ArrayList集合操作Demo 代码演示 /*** list集合线程不安全*/ public class ThreadDemo4 {public static void main(String[] args) {// 创建ArrayList集合List<String> list new ArrayList<>();for (int i 0; i <…

铺铜修改后自动重铺

很多初学者对于敷铜操作感到比较麻烦&#xff1a;为什么每次打过孔&#xff0c;修改走线后都需要手动右击-重新修改敷铜。如何提升layout的效率&#xff1f; 版本&#xff1a;Altium Designer 21.9.2 首先&#xff0c;点击面板右边的小齿轮&#xff0c;进入设置 接下来&#…

9.29学习

1.线上问题rebalance 因集群架构变动导致的消费组内重平衡&#xff0c;如果kafka集内节点较多&#xff0c;比如数百个&#xff0c;那重平衡可能会耗时导致数分钟到数小时&#xff0c;此时kafka基本处于不可用状态&#xff0c;对kafka的TPS影响极大 产生的原因 ①组成员数量发…

【C++并发入门】摄像头帧率计算和多线程相机读取(上):并发基础概念和代码实现

前言 高帧率摄像头往往应用在很多opencv项目中&#xff0c;今天就来通过简单计算摄像头帧率&#xff0c;抛出一个单线程读取摄像头会遇到的问题&#xff0c;同时提出一种解决方案&#xff0c;使用多线程对摄像头进行读取。同时本文介绍了线程入门的基础知识&#xff0c;讲解了…

2-107 基于matlab的hsv空间双边滤波去雾图像增强算法

基于matlab的hsv空间双边滤波去雾图像增强算法&#xff0c;原始图像经过光照增强后&#xff0c;将RGB转成hsv&#xff0c;进行图像增强处理&#xff0c;使图像更加清晰。程序已调通&#xff0c;可直接运行。 下载源程序请点链接&#xff1a; 2-107 基于matlab的hsv空间双边滤…

“找不到emp.dll,无法继续执行代码”需要怎么解决呢?分享6个解决方法

在日常使用电脑玩游戏的过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中最常见的就是“emp.dll丢失”。那么&#xff0c;emp.dll到底是什么&#xff1f;它为什么会丢失&#xff1f;丢失后会对我们的电脑产生什么影响&#xff1f;本文将为您详细解析emp.dll的概念…