任务挂起与恢复及中断管理续
系统中断优先级配置寄存器
三个系统中断优先级配置寄存器,分别为 SHPR1、 SHPR2、 SHPR3 :
SHPR1寄存器地址:0xE000ED18~0xE000ED1B
SHPR2寄存器地址:0xE000ED1C~0xE000ED1F
SHPR3寄存器地址:0xE000ED20~0xE000ED23
FreeRTOS主要是使用SHPR3寄存器对PendSV和Systick中断优先级进行设置(设置为最低优先级)
FreeRTOS如何配置PendSV和Systick中断优先级
在FreeRTOS系统中PendSV和SysTick设置最低优先级,保证系统任务切换不会阻塞系统其他中断的响应,再直接一点,FreeRTOS系统任务是级别最低的中断,编程时注意它在整个程序中的优先级及适用性,其它类型中断可以打断它,但它优先级最低,只能管理自己这个级别内的优先级,无法打断高等级中断。
中断屏蔽寄存器
三个中断屏蔽寄存器,分别为PRIMASK、FAULTMASK和BASEPRI:
FreeRTOS所使用的中断管理就是利用的BASEPRI这个寄存器
BASEPRI中断屏蔽寄存器简介
BASEPRI:屏蔽优先级低于某一个阈值的中断,当设置为0时,则不关闭任何中断
比如: BASEPRI设置为0x50,代表中断优先级在5到15内的均被屏蔽,0到4的中断优先级正常执行
注释:0x50由来:数字5左移4位的结果是80(十六进制为0x50)
- 二进制表示:数字5的二进制表示为101。
- 左移4位:将101左移4位,得到1010000。
- 转换为十进制:1010000(二进制)转换为十进制是12^6 + 02^5 + 12^4 + 02^3 + 02^2 + 02^1 + 0*2^0 = 64 + 16 = 80。
- 转换为十六进制:80的十六进制表示为0x50
FreeRTOS的关中断程序
此时,中断优先级在5~15的全部被关闭,关中断范围取决于阈值,如果是0x60,那么6到15全部被关闭,0到4不能被操作
FreeRTOS的关中断程序
中断服务函数的优先级需在FreeRTOS所管理的范围内
在中断服务函数里边需调用FreeRTOS的API函数,必须使用带“FromISR”后缀的函数