FreeRTOS学习之中断配置和临界段

前言

此文章针对开发板stm32F103ZET6。

工作中的学习是重应用,不是用来考试的!!!

在初学的时候对里面的一些概念比较模糊,看了第二遍才清楚了不少。因为是初学stm32,学习过程中有些知识掌握得不够扎实,比如:

此章涉及了NVIC的有关知识,相关内容拓展知识:

        STM32属于ARM中Cortex-M系列处理器,比如:STM32F1数据Cortex-M3,STM32F7数据Cortex-M7。

        Cortex-M3是stm32F1的一个内核,stm32F1是在Cortex-M3基础上增加了一些外设(如:USART、AD等)的芯片

参考博文:(12条消息) STM32中断,及FreeRTOS中断优先级配置_strongerHuang-CSDN博客

FreeRTOS中断配置和临界段

中断配置

Cortex-M中断(涉及NVIC知识)

中断简介

中断是微控制器一个很常见的特性,中断由硬件产生,当中断产生以后 CPU 就会中断当前的流程转而去处理中断服务,Cortex-M 内核的 MCU 提供了一个用于中断管理的嵌套向量中断 控制器(NVIC)。

优先级

优先级分两种:抢占优先级和响应优先级,两种优先级还有其他叫法。

本文章外的内容:

        中断优先级 > 任务优先级

        在stm32的FreeRTOS中,中断优先级与中断分组和相关优先级寄存器的位数有关(在stm32f1中用了高4位,共有16级优先级——抢占和响应的总和)

FreeRTOS中断配置宏

        1.configPRIO_BITS

设置MCU使用几位优先级,stm32一般使用4位,因此设此宏为4,共16级抢占优先级        

        2.configLIBRARY_LOWEST_INTERRUPT_PRIORITY

设置最低优先级,优先技术是16个,最低优先级为15

        3.configKERNEL_INTERRUPT_PRIORITY

设置内核中断优先级

此宏由 configLIBRARY_LOWEST_INTERRUPT_PRIORITY 左移 (8-configPRIO_BITS 位),也就是左移4位

宏 configKERNEL_INTERRUPT_PRIORITY 用来设置 PendSV 和滴答定时器的中断优先级,在函数 xPortStartScheduler()中设置:

上述代码中红色部分就是设置 PendSV 和 SysTick 优先级的,它们是直接向地址 portNVIC_SYSPRI2_REG 写入优先级数据,portNVIC_SYSPRI2_REG 是个宏,在文件 port.c 中 由定义:

#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) )

可以看到宏 portNVIC_SYSPRI2_REG 就是地址 0XE000ED20!同时也可以看出在 FreeRTOS 中 PendSV 和 SysTick 的中断优先级都是最低的

        4.configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY

设置FreeRTOS系统可管理的中断最大优先级,BASEPRI 寄存器说的那个阈值优先级。这个大家可以自由设置,实验中设置为了5。也就是高于5 的优先级(优先级数小于 5)不归 FreeRTOS 管理!

        5.configMAX_SYSCALL_INTERRUPT_PRIORITY

此宏是 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 左移 4 位而来的。

此宏设置好以后,低于此优先级的中断可以安全的调用 FreeRTOS 的 API 函数;高于此优先级的中断 FreeRTOS 是不能禁止的,中断服务函数也不能调用 FreeRTOS 的 API 函数!

由于高于 configMAX_SYSCALL_INTERRUPT_PRIORITY 的优先级不会被 FreeRTOS 内核 屏蔽,因此那些对实时性要求严格的任务就可以使用这些优先级,比如四轴飞行器中的壁障检测。

FreeRTOS开关中断

用于开启或关闭中断优先级低于RTOS可管理优先级的外设中断服务

FreeRTOS 开关中断函数为 portENABLE_INTERRUPTS ()和 portDISABLE_INTERRUPTS()

#define portDISABLE_INTERRUPTS()     vPortRaiseBASEPRI()

#define portENABLE_INTERRUPTS()      vPortSetBASEPRI(0)

portDISABLE_INTERRUPTS()是关中断

portENABLE_INTERRUPTS()是开中断

如:configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY = 5;

        TIM3的PRIORITY = 3、TIM5的PRIORITY = 5,那么TIM3不受FreeRTOS管理,中断的开和关于TIM3的中断服务函数无影响,对TIM5有影响。

实验:

任务实现函数

USART1_IRQHandler()函数

中断分组:中断分组为组4,共16个抢占优先级

①设置usart1抢占优先级<=5(及优先级高于5),RTOS的configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY = 5。

现象:在u1中断服务函数中实现接收到数据就printf,在串口调试助手处发送数据,能接收到printf;

②设置u1>=5。

现象:在上述关闭中断开始的5s内,在串口助手发送数据无法接收到printf;

临界段代码

临界段代码也叫做临界区,指必须完整运行、不能被打断的代码段。比如有的外设的初始化需要严格的时序,初始化过程不能被打断。

FreeRTOS进入临界代码段时,需要关闭中断,处理完临界段代码再打开中断

FreeRTOS与临界段代码保护有关的函数有4个:

        1.任务级临界段代码保护

taskENTER_CRITICAL()      任务级进入临界段

taskEXIT_CRITICAL()         任务级退出临界段

任务级临界代码保护使用方法如下:

(1)、进入临界区函数中,会关闭中断;

(2)、退出临界区函数中,会开启中断;

进入临界区时,中断会失效,所以临界区代码要精简。

(1)和(2)中间的代码就是临界区代码,注意临界区代码一定要精简!因为进入临界区会关闭中断,这样会导致优先级低于 configMAX_SYSCALL_INTERRUPT_PRIORITY 的中断得不到及时的响应。

        2.中断级临界段代码保护

函数 taskENTER_CRITICAL_FROM_ISR()和 taskEXIT_CRITICAL_FROM_ISR()中断级别临界段代码保护,是用在中断服务程序中的,而且这个中断的优先级一定要低于 configMAX_SYSCALL_INTERRUPT_PRIORITY

taskENTER_CRITICAL_FROM_ISR()    //中断级进入临界段

taskEXIT_CRITICAL_FROM_ISR(x)    //中断级退出临界段,参数x为taskENTER_CRITICAL_FROM_ISR() 返回值

中断级临界代码保护使用方法如下:

//定时器 3 中断服务函数
void TIM3_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
    {
        status_value=taskENTER_CRITICAL_FROM_ISR();     //(1)
        total_num+=1;
        printf("float_num 的值为: %d\r\n",total_num);
        taskEXIT_CRITICAL_FROM_ISR(status_value);       //(2)
    }
    TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中断标志位
}

进入临界区会返回ulReturn,退出临界区代码保护的时候要使用此值!

(1)、进入临界区。

(2)、退出临界区。

参考:(12条消息) FreeRTOS临界区应用与总结_chipsea_mltsum的博客-CSDN博客_freertos临界区

优先级配置建议:

学习疑问:

stm32使用FreeRTOS时任务优先级和中断优先级说明,它们之间有什么联系?

        1.简单的说,这两者之间没有任何关系,不管中断的优先级是多少,中断的优先级永远高任何任务的优先级,即在执行的过程中,中断来了就开始执行中断服务程序,

         2.对应STM32F103、F407来说,中断优先级数值越小,优先级就越高,而FreeRTOS的任务优先级是,任务优先级数值越小,任务优先级越低。
 

stm32:中断优先级,数值越小,优先级越高;共有16个优先级(中断分组4)

FreeRTOS:任务优先级,数值越大,优先级越高;共有32个优先级

参考:

STM32用FreeRTOS时任务优先级和中断优先级说明 - 骑单车去旅行 - 博客园 (cnblogs.com)

(12条消息) FreeRtos 任务优先级和中断优先级_nanjoh的博客-CSDN博客_freertos优先级

感谢参考博文的博主的总结经验,帮助我解惑,能让我少走点弯路。

本人为初学菜鸟,文章如有错误地方,感谢指正!!!

  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值