前言
1:临界段:在执行的时候不能被中断的代码段,最常见的是对全局变量的操作,能关闭的最大中断 由这个宏决定configMAX_SYSCALL_INTERRUPT_PRIORITY 他是按照单片机的中断等级的,比他小的都不能控制,因为操作的是单片机中的寄存器
2:在FreeRTOS中,对中断的开关是通过操作BASEPRI寄存器来实现的。当他设置为5时,所有优先级号>=5的中断都被关闭(等级比他低的都关掉)。若设置为0,则不关闭任何中断
1:关中断
不能在中断里面使用的
/*1:不带返回值的关中断函数,不能嵌套,不能在中断里面使用
2:不带返回值的意思是:在往BASEPRI写入新的值的时候,不用先将BASEPRI的值保存起来,即不用管当前的中断状态是怎么样的,既然不用管 当前的状态,不会保留当前的状态,也就意味着这样的函数不能在中断里面调用
3:这是最底层的,使用于,进入与退出临界段中
*/
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 /* 高四位有效,即等于0xb0,或者是11 ,FreeRTOS能管理的最大中断值*/
#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI()
static portFORCE_INLINE void vPortRaiseBASEPRI( void )
{
uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;//要写入BASEPRI的值。优先级>=11的中断都会被屏蔽(优先级比11低的中断),11以内的中断不受FreeRTOS管理
__asm
{
/* Set BASEPRI to the max syscall priority to effect a critical
section. */
msr basepri, ulNewBASEPRI //将configMAX_SYSCALL_INTERRUPT_PRIORITY的值写入BASEPRI,关掉部分中断(设置为0就不关任何中断)
dsb
isb
}
}
能在中断里面使用,带返回值的关中断,可以嵌套
#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI()
//带返回值的关中断,可以嵌套,可以在中断里面使用
static portFORCE_INLINE uint32_t ulPortRaiseBASEPRI( void )
{
uint32_t ulReturn, ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;
__asm
{
/* Set BASEPRI to the max syscall priority to effect a critical
section. */
mrs ulReturn,