101.2 - FreeRTOS | 1.FreeRTOS中断配置和Cortex-M中断

FreeRTOS中断和Cortex-M中断的关系

测试平台:STM32F1/4

编译环境:KEIL5

1.Cortex-M中断

1.1中断屏蔽寄存器

PRIMASK(1bit)

把当前优先级设置为0,除了NMI,HardFault都屏蔽。

FAULTMASK(1bit)

把当前优先级设置为-1,NMI异常和Rest异常

BASEPRI(最多9bit)

把当前优先级设置为x,屏蔽优先级低于x的异常。

举个例子:BASEPRI = 10,优先级编号高于10的,都不会被响应。

优先级数字越小,优先级越高)

2.FreeRTOS中断配置宏

2.1configPRIO_BITS

定义了用于配置Cortex-M,8位优先级寄存器实际使用位数。

(有IC厂商确定使用前几位,还可进一步划分抢占优先级子优先级

举个例子:

#define configPRIO_BITS 4
//使用了高4位,可配置优先级范围为 0 ~ 15

2.2 configLIBRARY_LOWEST_INTERRUPT_PRIORITY

配置FreeRTOS最低优先级,SysTick和PendSV默认在此优先级

#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 0x0f
//NVIC分组为4,全为抢占优先级,0x0f == 15,为最低

2.3 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY

高于这个优先级的中断,不归FreeRTOS管理

2.4 configKERNEL_INTERRUPT_PRIORITY

#define configKERNEL_INTERRUPT_PRIORITY         
(configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
//得到实际传递至 中断的优先级寄存器 的值

#define portNVIC_PENDSV_PRI               ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL )
//以0xE000_ED20为开始,移动16位,2Byte至0xE000_ED22
//0xE000_ED22 为PendSV中断优先级管理地址
#define portNVIC_SYSTICK_PRI              ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL )
//以0xE000_ED20为开始,移动24位,3Byte至0xE000_ED23
//0xE000_ED23 为SysTick中断优先级管理地址

 

2.5 configMAX_SYSCALL_INTERRUPT_PRIORITY

#define configMAX_SYSCALL_INTERRUPT_PRIORITY    (configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
//得到实际传递至 basepri寄存器 的值

 

3.总结

1.configPRIO_BITS 会被定义为:__NVIC_PRIO_BITS,

这个值在CMSIS中有定义,用来对后续中断 ( Pend_SV 和 SYSTICK )进行配置。

2.configLIBRARY_LOWEST_INTERRUPT_PRIORITY,用来配置当前中断条件下的最低优先级

configKERNEL_INTERRUPT_PRIORITY,实际传递给相关寄存器的值

3.configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY,规定了FreeRTOS调度的最高中断优先级。

configMAX_SYSCALL_INTERRUPT_PRIORITY,实际传递给相关寄存器的值


参考资料:

  • FreeRTOS Kernel V10.0.1

  • 安富莱FreeRTOS教程

  • 野火FreeRTOS教程

posted @ 2019-07-10 10:16  Peong  阅读(803)  评论(0)    收藏  举报