优先级分组
Cortex-M处理器有三个固定优先级和256个可编程的优先级,最多有128个抢占优先级,但实际上STM32将优先级精简为16级优先级,在精简的时候会裁掉表达优先级的几个低端有效位,保留高4位表达优先级
Cortex-M处理器把256个优先级按位分为高低两段:抢占优先级和子优先级。STM32使用了4位,因此最多有5组优先级分组设置:
NVIC_PriorityGroup_0 0位抢占优先级,4位子优先级
NVIC_PriorityGroup_1 1位抢占优先级,3位子优先级
NVIC_PriorityGroup_2 2位抢占优先级,2位子优先级
NVIC_PriorityGroup_3 3位抢占优先级,1位子优先级
NVIC_PriorityGroup_4 4位抢占优先级,0位子优先级(16个抢占优先级,没有子优先级)
用于屏蔽中断的特殊寄存器(PRIMASK、FAULTMASK、BASEPRI)
PRIMASK用于屏蔽除NMI和HardFault外的所有异常和中断
FAULTMASK用于屏蔽除NMI外的所有中断(即相比PRIMASK,FAULTMASK还可以屏蔽HardFault中断)
BASEPRI用于关闭优先级大于某个阈值(阈值由宏configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY决定)的中断,优先级高于这个阈值的中断就不会被关闭。Free RTOS就是操作BASEPRI寄存器来实现开关中断的。
注:优先级越高,优先级数越小。即优先级0>优先级15
宏configKERNEL_INTERRUPT_PRIORITY用来设置PendSV和滴答定时器的中断优先级
临界段代码:
Free RTOS与临界段代码保护有关的函数有4个:
任务级临界段代码保护:taskENTER_CRITICAL(),taskEXIT_CRITICAL()
中断级临界段代码保护:taskENTER_CRITICAL_FROM_ISR(),taskEXIT_CRITICAL_FROM_ISR()
在执行临界段代码时,优先级低于configMAX_SYSCALL_INTERRUPT_PRIORITY的中断都得不到及时的响应
中断级临界段代码保护是用在中断服务程序中的,且这个中断的优先级一定要低于 configMAX_SYSCALL_INTERRUPT_PRIORITY