FreeRTOS的中断管理
前言
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函数
相关文章:
FreeRTOS的中断管理
前言 FreeRTOS的任务有优先级,MCU的硬件中断有中断优先级,这是两个不同的概念,FreeRTOS的任务管理要用到硬件中断,使用FreeRTOS时候也可以使用硬件中断,但是硬件中断ISR的设计要注意一些设计原则,在本节中我…...
JS加密=JS混淆?(JS加密、JS混淆,是一回事吗?)
JS加密、JS混淆,是一回事吗? 是的!在国内,JS加密,其实就是指JS混淆。 1、当人们提起JS加密时,通常是指对JS代码进行混淆加密处理,而不是指JS加密算法(如xor加密算法、md5加密算法、…...
hive-拉链表
目录 拉链表概述缓慢变化维拉链表定义 拉链表的实现常规拉链表历史数据每日新增数据历史数据与新增数据的合并 分区拉链表 拉链表概述 缓慢变化维 通常我们用一张维度表来维护维度信息,比如用户手机号码信息。然而随着时间的变化,某些用户信息会发生改…...
高并发内存池(六):补充内容
目录 有关大于256KB内存的申请和释放处理方法 处理大于256KB的内存申请 补充内容1 补充内容2 补充内容3 处理大于256KB的内存释放 新增内容1 新增内容2 测试函数 使用定长内存池替代new 释放对象时不传对象大小 补充内容1 补充内容2 补充内容3 补充内容4 测试…...
高性能存储 SIG 月度动态:优化 fuse 提升 AI 存储接入能力,erofs 工具发布新版本
本次月报综合了 SIG 在 7、8 两个月的工作进展,包含多项新特性、优化、Bugfix 等。 SIG 整体进展 fuse 支持 failover,并优化 background 读写公平性,提升 AI 存储接入场景的能力。 erofs page cache 共享特性已发到上游社区,re…...
2024 年最新 Protobuf 结构化数据序列化和反序列化详细教程
Protobuf 序列化概述 Protobuf(Protocol Buffers)是由Google开发的一种语言中立、平台中立、可扩展的序列化结构数据的方法。它用于在不同系统之间高效地交换数据。Protobuf使用定义文件(.proto)来描述数据结构,并通过…...
【小程序】微信小程序课程 -4 项目实战
目录 1、 效果图 2、创建项目 2.1 创建小程序端 2.1.1 先创建纯净项目 2.1.2 删除components 2.1.4 删除app.json红色部分 2.1.5 删除index.json红色部分 2.1.6 删除index.wxss全部内容 2.1.7 删除index.wxml全部内容 2.1.8 app.json创建4个页面 2.1.9 app.json添加…...
【期刊】论文索引库-SCI\SSCI\IE\南大核心\北大核心\CSCD等
外文期刊检索 SCI SCI即《科学引文索引》(Science Citation Index),是由美国科学信息研究所(Institute for Scientific Information)创建于1961年,收录文献的作者、题目、源期刊、摘要、关键词,不仅可以从文献引证的角度评估文章的学术价值,还可以迅速方便地组建研究课…...
开源链动 2+1 模式 S2B2C 商城小程序:社交电商团队为王的新引擎
摘要:本文深入探讨在社交电商领域中,团队的重要性以及如何借助开源链动 21 模式 S2B2C 商城小程序,打造具有强大竞争力的团队,实现个人价值与影响力的放大,创造被动收入,迈向财富自由之路,同时为…...
使用Fiddler Classic抓包工具批量下载音频资料
1. 通过F12开发者工具,下载音频文件 浏览器打开音频列表->F12快捷键->网络->媒体,播放一个音频文件,右边媒体下生成一个音频文件,右击“在新标签页中打开”,可以下载这个音频文件。 2.通过Fiddler Classic抓…...
QT开发:基于Qt实现的交通信号灯模拟器:实现一个带有倒计时功能的图形界面应用
介绍 本文将介绍如何使用Qt框架实现一个简单的交通信号灯控制程序。本程序包括一个图形界面,显示红、黄、绿三色信号灯,并通过定时器控制信号灯的切换。同时,我们还将实现一个带有按钮的界面,用于展示信号灯的状态。 1. 安装Qt开…...
【编程基础知识】网络I/O模型详解:从阻塞到异步
引言 网络I/O模型是网络编程的核心,它们决定了应用程序如何进行读写操作以与网络进行数据交换。了解不同的网络I/O模型对于设计高效、可扩展的网络应用程序至关重要。 一、阻塞I/O(Blocking I/O) 1. 定义 阻塞调用:当应用程序…...
yolo自动化项目实例解析(六)自建UI(主窗口、预览窗口)
前面我们大致把各个代码块梳理出来了,但是还是不知道从那块开始,我们这里主要先通过ui页面的元素去推理整个执行过程,我们首先需要知道ui功能里面有那些组件 qt设计师基础控件 Qt Designer 是一个图形界面设计工具,用于创建 Qt 应…...
Unity优质教程分类汇总 【持续更新中】
以下收录的均为作者自己看过的觉得比较好的教程 基础 Unity入门: https://www.bilibili.com/video/BV1HX4y1V71E?p13 生命周期 https://docs.unity.cn/cn/2022.3/uploads/Main/monobehaviour_flowchart.svg https://zhuanlan.zhihu.com/p/551294000 编程技巧…...
真正掌握left join on 和 where 的差别
总结 用 where 是先连接然后再筛选用 on 是先筛选再连接数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。在使用left jion时,on和where条件的区别如下: on条件是在生成临时表…...
神经网络在多分类问题中的应用
作者简介:热爱数据分析,学习Python、Stata、SPSS等统计语言的小高同学~个人主页:小高要坚强的博客当前专栏:Python之机器学习本文内容:神经网络在多分类问题中的应用作者“三要”格言:要坚强、要努力、要学习 目录 1. 引言 2.数据构造 3.划分数据集 4.神经网络实现多…...
nginx的安装和使用
源码安装 1.环境准备:卸载其他方式安装的web应用,防止端口冲突 2.下载nginx源码包 wget https://nginx.org/download/nginx-1.20.2.tar.gz 3.源码编译安装 yum install -y gcc pcre-devel zlib-devel #安装依赖包 useradd -M -s /sbin/nologin ngi…...
js采用覆盖键、覆盖鼠标滑动事件实现禁止网页通过 ctrl + +/- 和 ctrl + 滚轮 对页面进行缩放
一、兼容电脑端的禁止通过 ctrl /- 和 ctrl 滚轮 对页面进行缩放 const keyCodeMap {// 91: true, // command61: true,107: true, // 数字键盘 109: true, // 数字键盘 -173: true, // 火狐 - 号187: true, // 189: true, // -};二、覆盖ctrl||command ‘’/‘-’ // 覆…...
某客户Oracle RAC无法启动故障快速解决
某日,9:50左右接到好友协助需求,某个客户Oracle RAC无法启动,并发过来一个报错截图,如下: 和客户维护人员对接后,远程登录服务端进行故障分析。 查看hosts信息,首先进行心跳测试,测…...
【计算机网络 - 基础问题】每日 3 题(二十八)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…...
如何实现SASM多语言支持:完整国际化配置与翻译指南
如何实现SASM多语言支持:完整国际化配置与翻译指南 【免费下载链接】SASM SASM - simple crossplatform IDE for NASM, MASM, GAS and FASM assembly languages 项目地址: https://gitcode.com/gh_mirrors/sa/SASM SASM(Simple Assembler IDE&…...
VSCode远程连接报错?手把手教你修复settings.json文件(附常见错误排查)
VSCode远程连接报错终极排查指南:从settings.json修复到SSH配置优化 当你正准备通过VSCode远程连接服务器投入工作时,突然弹出的Failed to write remote.SSH.remotePlatform报错就像一盆冷水浇下来。更令人抓狂的是,明明命令行SSH连接一切正常…...
3D打印机步进电机参数计算全攻略:从同步带到丝杆的实战配置
3D打印机步进电机参数计算全攻略:从同步带到丝杆的实战配置 在DIY 3D打印机的过程中,步进电机的参数计算往往是让初学者最头疼的环节之一。无论是同步带驱动的XY轴,还是丝杆控制的Z轴,亦或是齿轮传动的挤出机构,都需要…...
ComfyUI图片生成视频大模型技术选型与实战:从原理到生产环境部署
最近在搞一个AI视频生成的项目,用到了ComfyUI这个可视化工作流工具。说实话,刚开始选模型的时候真是眼花缭乱,Stable Diffusion Video、ModelScope、RunwayML……每个都说自己好,但实际用起来坑真不少。今天就把我趟过的路和总结的…...
ESP32 SPI性能调优指南:从80MHz时钟到DMA配置,避开那些坑
ESP32 SPI性能调优实战:突破80MHz时钟与DMA配置的终极指南 当你在ESP32项目中遇到SPI通信速度瓶颈时,是否曾为如何突破80MHz时钟限制而苦恼?是否在配置DMA时踩过各种坑?本文将带你深入ESP32 SPI性能优化的核心领域,从硬…...
JAVA重点基础、进阶知识及易错点总结(10)Map 接口(HashMap、LinkedHashMap、TreeMap)
🚀 Java 巩固进阶 第10天 主题:Map 接口深度解析 —— 键值对的高效艺术📅 进度概览:掌握 Java 中最灵活的数据结构。 💡 核心价值: 动态数据承载:SpringBoot 中接收前端动态参数 (Map<Stri…...
Unity游戏开发:A*寻路算法实战,5步搞定NPC智能移动(附完整Demo)
Unity游戏开发:A*寻路算法实战指南与高级优化技巧 在游戏开发中,NPC的智能移动一直是开发者需要解决的核心问题之一。想象一下,当玩家在《魔兽世界》中穿越荆棘谷时,那些巡逻的巨魔守卫是如何绕过树木和山丘找到最短路径的&#x…...
在曹妃甸哪里可以吃到当天现捕上来的野生海鲜?
在曹妃甸,想要吃到当天现捕上来的野生海鲜,高尚堡老刘海鲜绝对是个绝佳的选择。2006 年,一群世代靠海吃海的渔民,在渤海湾码头开起了这家“老刘海鲜饭店”。起初他们只是想把自家渔船捕捞的野生海鲜,用最朴素的做法端给…...
PROFINET通信避坑指南:PN/PN耦合器在S7系列PLC中的3种典型应用场景解析
PROFINET通信避坑指南:PN/PN耦合器在S7系列PLC中的3种典型应用场景解析 在工业自动化领域,PROFINET通信的稳定性和可靠性直接关系到生产线的运行效率。PN/PN耦合器作为跨子网通信的关键设备,其配置方式的选择往往让工程师陷入纠结。本文将深入…...
Ostrakon-VL-8B零基础上手:无需代码,5分钟完成门店图片智能分析
Ostrakon-VL-8B零基础上手:无需代码,5分钟完成门店图片智能分析 1. 引言 想象一下,你是一家连锁便利店的区域经理,手下管着几十家门店。每周巡店检查,光是看照片、数货架、查价格标签,就要花掉大半天时间…...
