FreeRtos 任务优先级和中断优先级

中断优先级和任务优先级的区别:
1.简单的说,这两者之间没有任何关系,不管中断的优先级是多少,中断的优先级永远高任何任务的优先级,即在执行的过程中,中断来了就开始执行中断服务程序,
2.对应STM32F103F407来说,中断优先级数值越小,优先级就越高,而FreeRTOS的任务优先级是,任务优先级数值越小
任务优先级越低。
【FreeRtos 任务优先级和中断优先级】 任务优先级配置
1. FreeRTOS中任务的最高优先级是通过FreeRTOSConfig.h中的configMAX_PRIORITIES进行配置的用户实际可以使用的优先级范围是0- configMAX_PRIORITIES -1,比如我们在此定义为5 那么用户可以使用优先级号 0,1,2,3,4,不包含5,数值越大优先级越高
2.建议用户配置configMAX_PRIORITIES 的最大值不要超过32,用户可以使用的范围0-31,根据实际应用配置,配置越大,需要的内存空间越大
优先级分配方案:
1.IRQ任务:IRQ任务是指通过中断服务程序进行触发的任务,,所有任务中优先级最高
2.高优先级后台任务:比如按键检测,触摸检测,USB消息处理
3.低优先级时间调度任务:比如:emWin的界面显示,LED数码管显示
note:特别注意IRQ任务和高优先级任务必须设置为阻塞式(调用消息等待或者延迟等函数),只有这样高优先级任务才会
释放CPU的使用权,从而低优先级任务才会有机会得到执行
在STM32使用由于中断优先级设置采用的是库函数,因此请必须保证优先级设置为可抢占优先级:
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 ); 只有抢占优先级,优先级为0--15级,数值越大优先级越低
优先级设置介绍:
FreeRTOSConfig.h中定义了两个宏,分别是:configKERNEL_INTERRUPT_PRIORITY和configMAX_SYSCALL_INTERRUPT_PRIORITY
configKERNEL_INTERRUPT_PRIORITY用来设置RTOS内涵自己的中断优先级,因为RTOS内涵中断
不允许抢占用户使用的中断,因此这个宏一般为硬件最低优先级
configMAX_SYSCALL_INTERRUPT_PRIORITY用来设置可以在中断服务程序中安全调用API函数最高优先级,
如果优先大于这个宏代表的优先级,FreeRtos将无法关闭该中断,不受FreeRtos控制
#ifdef __NVIC_PRIO_BITS /* __NVIC_PRIO_BITS 已经在stm32f4xx.h里面定义为4
*/ #define configPRIO_BITS __NVIC_PRIO_BITS
#else #define configPRIO_BITS 4 #endif
#define configPRIO_BITS4
此宏定义用于配置STM32的8位优先级设置寄存器实际使用的位数
STM32f103 STM32F407和STM32F429都是使用高4位。在往寄存器中写值的时候需要移位,
SysTick的优先级我们一般配置为最低,即0xf 。这样可以提高系统的实时响应能力,即其他的外部中断可以及时的得到响应。
FreeRtos 任务优先级和中断优先级
文章图片

上面宏定义的FreeRtos优先级为5-15级,在FreeRtos中调用中断关闭和中断开启只对5-15级有效,对0-4的中断无效












    推荐阅读