【FreeRTOS】——中断优先级设置&中断相关寄存器&临界段代码保护&调度器挂起与恢复

这篇具有很好参考价值的文章主要介绍了【FreeRTOS】——中断优先级设置&中断相关寄存器&临界段代码保护&调度器挂起与恢复。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言:

一、中断优先级设置

二、中断相关寄存器(STM32-Cortex M3)

三、临界段代码保护

四、任务调度器的挂起和恢复

总结:


前言:

博客笔记根据正点原子视频教程编辑,仅供学习交流使用!

一、中断优先级设置

①中断概念回顾

让CPU打断正常运行的程序,转而去处理紧急的事件(程序),就叫中断。可简单概括为以下三步:

                   【FreeRTOS】——中断优先级设置&中断相关寄存器&临界段代码保护&调度器挂起与恢复

② 优先级分组设置

ARM Cortex-M 使用了 8 位宽的寄存器(256级)来配置中断的优先等级,这个寄存器就是中断优先级配置寄存器。但STM32,只用了中断优先级配置寄存器的高4位 [7 : 4],所以STM32提供了最大16级的中断优先等级。

             【FreeRTOS】——中断优先级设置&中断相关寄存器&临界段代码保护&调度器挂起与恢复

 STM32 的中断优先级可以分为抢占优先级子优先级抢占优先级: 抢占优先级高的中断可以打断正在执行但抢占优先级低的中断。子优先级:当同时发生具有相同抢占优先级的两个中断时,子优先级数值小的优先执行。(中断优先级数值越小越优先)

优先级的设置有5 种分配方式,对应着中断优先级分组的 5 个组,通过在在HAL_Init()中调用函数HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4)即可完成设置(FreeRTOS中常用NVIC_PriorityGroup_4):

            【FreeRTOS】——中断优先级设置&中断相关寄存器&临界段代码保护&调度器挂起与恢复

 注意:低于5级优先级的中断里才可调用FreeRTOS的API函数。在FreeRTOS中常把4位都设置为抢占优先级即NVIC_PriorityGroup_4。中断优先级数值越小越优先,任务优先级数值越大越优先。


二、中断相关寄存器(STM32-Cortex M3)

①三个系统中断优先级配置寄存器

一个寄存器是32位的,它的地址是这一段区域的首地址(8位),要设置一个寄存器区域的非首地址(如PendSV和SysTick),通过首地址偏移bit即可。

SHPR1寄存器地址:0xE000ED1

SHPR2寄存器地址:0xE000ED1C

SHPR3寄存器地址:0xE000ED20

         【FreeRTOS】——中断优先级设置&中断相关寄存器&临界段代码保护&调度器挂起与恢复

 注意:PendSV和SysTick设置最低优先级,保证系统任务切换不会阻塞系统其他中断的响应。即中断可打断任务,但任务不可打断中断。

②三个中断屏蔽寄存器

  【FreeRTOS】——中断优先级设置&中断相关寄存器&临界段代码保护&调度器挂起与恢复

注意:FreeRTOS利用的BASEPRI这个寄存器完成对中断的管理。该寄存器屏蔽优先级低于某个阈值(或优先级号大于某个值)的中断,如BASEPRI设置为0x50(配置优先级只用到低4位,只用到高四位[7:4],所以这里写的是5向左偏移4位的值),代表中断优先级在5~15内的均被屏蔽,0~4的中断优先级正常执行。当BASEPRI设置为0,不关闭任何中断(不是屏蔽所有中断的意思)。

关闭中断优先级在5-15的中断程序示例:

#define portDISABLE_INTERRUPTS() 		vPortRaiseBASEPRI()
static portFORCE_INLINE void vPortRaiseBASEPRI( void ) 
{ 
	uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; 
	__asm 
	{
		msr basepri, ulNewBASEPRI 
		dsb 
		isb
	} 
}
#define configMAX_SYSCALL_INTERRUPT_PRIORITY            ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )  
/*STM32中断优先级只用高4位配置,偏移4位*/
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY        5      
/* FreeRTOS可管理的最高中断优先级 ,也即把BASEPRI设置为0x50*/ 

  【FreeRTOS】——中断优先级设置&中断相关寄存器&临界段代码保护&调度器挂起与恢复

 FreeRTOS说:“我可以中断你,可以让你用我的API函数;我不能中断你,你也不能用我的API函数!”

注意:中断服务函数的优先级需在FreeRTOS所管理的范围内;中断服务函数里边需调用FreeRTOS的API函数,必须使用带“FromISR”后缀的函数。

 开中断代码示例(即BASEPRI设置为0):

#define portENABLE_INTERRUPTS()		 vPortSetBASEPRI( 0 )
static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI ) 
{ 
	__asm
	{
		msr basepri, ulBASEPRI
	} 
}

三、临界段代码保护

临界段代码:也叫做临界区,是指那些必须完整运行,不能被打断的代码段。

使用场合:①外设:需严格按照时序初始化的外设,如I2C、SPI等。②系统在自身需求。③用户的某些需求。

能够打断当前程序运行的:中断、任务调度(PendSV相关)。要想程序不被打断,关中断即可(指FreeRTOS所管辖的最高级别中断),因为PendSV是与任务切换有关的一个中断,被设置成了最低优先级,所以关中断后,PendSV(与任务调度器有关)也一定不会响应。

FreeRTOS 在进入临界段代码的时候需要关闭中断,当处理完临界段代码以后再打开中断!

    【FreeRTOS】——中断优先级设置&中断相关寄存器&临界段代码保护&调度器挂起与恢复

 无论是任务级还是中断级临界区本质都是关中断,代码是成对使用的,且支持嵌套,可尽量保持临界段耗时短

//任务级临界区调用格式示例
taskENTER_CRITICAL() ;
{
        … …	/* 临界区 */
}
taskEXIT_CRITICAL()	;


//中断级临界区调用格式示例(这段写在中断服务函数里)
uint32_t  save_status;
save_status  = taskENTER_CRITICAL_FROM_ISR();
{
        … …	/* 临界区 */
}
taskEXIT_CRITICAL_FROM_ISR(save_status );

四、任务调度器的挂起和恢复

 调用挂起任务调度器的函数时不需要关闭中断;仅仅是防止了任务之间的资源争夺,中断照样可以直接响应。

挂起调度器的方式,适用于临界区位于任务与任务之间;既不用去延时中断,又可以做到临界区的安全。

           【FreeRTOS】——中断优先级设置&中断相关寄存器&临界段代码保护&调度器挂起与恢复

vTaskSuspendAll() ;
{
        … …	/* 内容 */
}
xTaskResumeAll()	;

总结:

实时操作系统是嵌入式学习的进阶内容,掌握好在面试时会有巨大优势!

【FreeRTOS】——中断优先级设置&中断相关寄存器&临界段代码保护&调度器挂起与恢复

往期精彩:

电机应用控制——直流无刷电机

OpenCV机器视觉系列专栏

C语言进阶文章来源地址https://www.toymoban.com/news/detail-498026.html

到了这里,关于【FreeRTOS】——中断优先级设置&中断相关寄存器&临界段代码保护&调度器挂起与恢复的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第六步:NVIC中断优先级分组

     CM4内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。 STM32F4并没有使用CM4内核的全部东西,而是只用了它的一部分。 STM32F40xx/STM32F41xx总共有92个中断。 STM32F42xx/STM32F43xx则总共有96个中断  STM32F40xx/STM32F41xx的92个中断里面,包括1

    2024年02月12日
    浏览(42)
  • MSP432学习笔记6:中断优先级管理

    所用型号:MSP432P401R 今日继续我的MSP432电赛速通之路。 主要学习的是: 中断优先级管理、软件挂起中断、屏蔽中断优先级 目录 MSP432具有8级可编程的中断优先级。  中断优先级管理库函数:

    2024年02月05日
    浏览(48)
  • 【学习日记】【FreeRTOS】任务调度时如何考虑任务优先级——任务的自动切换

    本文开始为 RTOS 加入考虑任务优先级的自动调度算法,代码大部分参考野火。 本文主要是一篇学习笔记,加入了笔者自己对野火代码的梳理和理解。 首先我们要知道,在 RTOS 中,优先级越高、越需要被先执行的的任务的优先级的数字越大。比如优先级数字为 5 的任务就要比

    2024年02月12日
    浏览(33)
  • 三、STM32中systick中断的优先级

    systick为内核外设中断,与普通外设中断的优先级有些区别,并没有抢占优先级和子优先级的说法。 对于M3来说内核外设的中断优先级由内核SCB这个外设的寄存器:SHPRx(x=1.2.3)来配置。 内核外设的中断优先级可编程为0~15,数值越低,优先级越高。 在SysTick_Config中,配置优先

    2024年02月11日
    浏览(42)
  • 【STM32F407学习笔记】中断优先级管理与外部中断

    计算机系统中中断占有极其重要的地位,在嵌入式系统中更是如此。中断机制能让计算机有效合理的发挥效能和提高效率。 涉及外设 :EXIT外部中断,NVIC内嵌向量中断控制器。 计算机在执行程序的过程中,当出现异常情况或特殊情况时,计算机停止现在程序的运行,转向对

    2024年02月02日
    浏览(50)
  • stm32-NVIC中断优先级管理(以古代官职角度分析)

    讲在前面的话: 博主在学习正点原子这一章节的时候很是懵,感觉摸不到门路,于是在网上找了一些相关的视频讲解,将他们的内容整合了一下,并尽量用易懂的话讲解。(本文基于stm32f103ZET6) CM3 内核支持256个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有

    2024年02月22日
    浏览(39)
  • 线程休眠、线程让步、线程优先级相关内容学习笔记

        1、线程休眠     (1)sleep()             如果需要让当前正在执行的线程暂停一段时间,并进入阻塞状态(Timed_Waiting),则可以通过调用Thread类的静态sleep()方法来实现。             static void sleep(long millis):让当前正在执行的线程暂停millis毫秒,并进入阻塞状态,该方

    2024年02月03日
    浏览(49)
  • Yarn【多队列实例、任务优先级设置】

    我们知道,Hadoop常见的三种调度器:FIFO调度器(几乎不用,因为它是先来先服务)、容量调度器(Apache Hadoop 默认的调度器)、公平调度器(CDH默认调度器)。 其中,容量调度器和公平调度器都是支持多任务队列的,但是我们如果不去指定,它默认把任务都放到一个默认的队

    2024年02月09日
    浏览(41)
  • Spring Boot 配置属性设置优先级

    文章首发地址 Spring Boot设计了非常特殊的加载指定属性文件(PropertySource)的顺序,以允许对属性值进行合理的覆盖。属性值会以下面的优先级进行设置。 home目录下的Devtools全局设置属性(~/.spring-boot-devtools.properties,条件是当devtools激活时)。 @TestPropertySource注解的测试用例

    2024年02月16日
    浏览(52)
  • 终极指南:Scrum中如何设置需求优先级

    需求众多不知道如何下手?总想先做简单的需求,复杂需求却一拖再拖?那么,我们是时候开始考虑如何设置需求优先级了。 本期终极指南将展示如何为需求设置有效优先级,如何有效管理工作量,让效率指数倍增长,搭配 《 Scrum流程:如何科学地进行需求优先级排序 ?

    2024年02月08日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包