FreeRTOS学习笔记(四)Freertos的中断管理及临界保护

2024-09-08 12:36

本文主要是介绍FreeRTOS学习笔记(四)Freertos的中断管理及临界保护,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、Cortex-M 中断管理
    • 1.1 中断优先级分组
    • 1.2 相关寄存器
    • 1.3 相关宏定义
    • 1.4 FreeRTOS 开关中断
  • 二、临界段及其保护
    • 2.1 taskENTER_CRITICAL( ) 和 taskEXIT_CRITICAL( )
    • 2.2 taskENTER_CRITICAL_FROM_ISR( ) 和 taskEXIT_CRITICAL_FROM_ISR( )
    • 2.3 任务调度器的挂起及恢复


前言

  本章主要是讲述Freertos的中断管理及临界保护,具体的基础知识不再赘述,可以移步观看裸机开发部分。


一、Cortex-M 中断管理

1.1 中断优先级分组

  Cortex-M利用8位宽的寄存器来处理优先级,但stm32实际上只使用了高四位[7:4],即16级中断优先级。stm32的中断优先级可以分为抢占优先级(高优先级抢占低优先级)和子优先级(数值小先执行)。
中断分组
  由于FreeRTOS 的中断配置没有处理子优先级这种情况,所以只能配置为组 4,即 NVIC_PriorityGroup_4 。此时4 位优先级就都全是抢占优先级了,没有子优先级,那么就有 0~15 共 16 个优先级。

1.2 相关寄存器

  PendSV 和 SysTick 寄存器主要用于中断服务,并且在 FreeRTOS 中扮演了重要的角色,尤其是在任务切换和系统计时方面。这里首先介绍设置PendSV(PRI_14)和SysTick(PRI_15)优先级的两个寄存器。
在这里插入图片描述
  如上图所示,4 个相临的寄存器可以拼成一个32位的寄存器(SHPR1~ SHPR3),因而FreeRTOS 在设置 PendSV 和 SysTick 的中断优先级的时候都是直接操作的地址 0xE000_ED20 + offset。为了保证任务切换不会阻碍其他任务,在 FreeRTOS中 PendSV 和 SysTick 的中断优先级都是最低的!
  接着这里再讲述三个中断屏蔽寄存器。值得注意的是FreeRTOS 的开关中断就是操作 BASEPRI 寄存器来实现的,它可以关闭低于某个阈值的中断,高于这个阈值的中断就不会被关闭。

寄存器描述
PRIMASK禁止除 NMI 和 HardFalut 外的所有异常和中断,置1视为开启
FAULTMASK禁止除 NM 外的所有异常和中断,置1视为开启
BASEPRI最大9bit,只屏蔽优先级低于设置阈值的中断

1.3 相关宏定义

描述
configPRIO_BITS设置 MCU 使用几位优先级
configLIBRARY_LOWEST_INTERRUPT_PRIORITY设置最低优先级
configKERNEL_INTERRUPT_PRIORITY设置内核中断优先级
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY设置 FreeRTOS 系统可管理的最大优先级
configMAX_SYSCALL_INTERRUPT_PRIORITY低于此优先级的中断可以调用 FreeRTOS 的 API 函数,反之则禁止

1.4 FreeRTOS 开关中断

  FreeRTOS 开关中断函数为 portENABLE_INTERRUPTS ()和portDISABLE_INTERRUPTS(),这两个函数其实是宏定义,在 portmacro.h 中有定义,如下:

#define portDISABLE_INTERRUPTS( ) vPortRaiseBASEPRI()
#define portENABLE_INTERRUPTS( )  vPortSetBASEPRI(0)

  函数 vPortSetBASEPRI( )是向寄存器 BASEPRI 写入一个值,此值作为参数 ulBASEPRI 传递进来,portENABLE_INTERRUPTS( )是开中断,它传递了个 0 给 vPortSetBASEPRI( ),根据我们前面讲解 BASEPRI 寄存器可知,结果就是开中断。

二、临界段及其保护

  临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段,比如有的外设的初始化需要严格的时序,初始化过程中不能被打断。
  FreeRTOS 在进入临界段代码的时候需要关闭中断,当处理完临界段代码以后再打开中断。FreeRTOS 系统本身就有很多的临界段代码,这些代码都加了临界段代码保护,我们在写自己的用户程序的时候有些地方也需要添加临界段代码保护。

2.1 taskENTER_CRITICAL( ) 和 taskEXIT_CRITICAL( )

  这两个函数用于进入和退出临界区,在任务上下文中使用。它们通过禁用中断来保护临界区中的代码,确保该代码段在执行期间不会被打断。

  • taskENTER_CRITICAL( ):调用此函数后,所有中断都会被禁用,任务调度也会被禁止,这样可以确保当前任务在执行关键代码时不会被其他任务抢占或中断。
  • taskEXIT_CRITICAL( ):退出临界区时调用该函数,恢复中断和任务调度。必须确保在进入临界区后总是退出,以防止系统卡死或影响其他任务。
// 示例
void start_task(void *pvParameters)
{taskENTER_CRITICAL();  // 禁用中断,进入临界区...				   // 关键代码taskEXIT_CRITICAL();   // 重新启用中断,退出临界区
}

2.2 taskENTER_CRITICAL_FROM_ISR( ) 和 taskEXIT_CRITICAL_FROM_ISR( )

  这两个函数是在中断服务程序(ISR)中使用的版本,与任务上下文中的函数不同,这些函数可以确保临界区在中断中安全运行。除此之外,这个中断的优先级一定要低于前面提到的configMAX_SYSCALL_INTERRUPT_PRIORITY。

  • taskENTER_CRITICAL_FROM_ISR( ):与 taskENTER_CRITICAL() 类似,它也会禁用中断,但是该函数会返回一个变量,指示中断的先前状态,以便在退出临界区时恢复到正确的状态。
  • taskEXIT_CRITICAL_FROM_ISR( ):退出临界区时使用,需要传入先前的中断状态来恢复中断。
// 示例
UBaseType_t uxSavedInterruptStatus;	// FreeRTOS 中用于保存中断状态的变量
uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();// 保存中断状态并进入临界区...											   // ISR 中的关键代码
taskEXIT_CRITICAL_FROM_ISR(uxSavedInterruptStatus);// 退出临界区并恢复中断状态

2.3 任务调度器的挂起及恢复

  任务调度器的挂起和恢复常用于需要确保一段代码在不被其他任务打断的情况下执行,比如同时修改多个任务的优先级或共享资源。值得注意的是,调度器的挂起和恢复会影响整个系统,不管有多少任务,它都会停止任务的切换行为,而我们前面提到的任务挂起和恢复仅影响指定的任务。
  此外,与临界区不同的是任务调度器的挂起不会影响中断,它仅仅是防止任务之间相互抢占资源。适用于临界区位于任务和任务之间,可以做到既不采用延时,也可以保护临界段。

函数描述
vTaskSuspendAll( )暂停整个任务调度器的运行
xTaskResumeAll( )恢复任务调度器,重新允许任务切换

免责声明:本文参考了网上公开资料,仅用于学习交流,若有错误或侵权请联系笔者。

这篇关于FreeRTOS学习笔记(四)Freertos的中断管理及临界保护的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1148123

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学