
在stm32cube中FreeRTOS有以上两个配置,其代表了RTOS可以调用的最高和最低中断优先级,若在优先级不属于该定义的中断中调用FreeRTOS相关函数,则有可能调用vPortValidateInterruptPriority安全函数,导致程序停止运行。
void vPortValidateInterruptPriority( void )
{
uint32_t ulCurrentInterrupt;
uint8_t ucCurrentPriority;
//参考内核指南,这个命令是获取当前的中断号
ulCurrentInterrupt = vPortGetIPSR();
/*portFIRST_USER_INTERRUPT_NUMBER 是一个和芯片相关的用户中断号
在M3、M4的芯片上就是15以后是外部中断的中断号所以这里配置成16
判断是不是在外部中断中调用的API函数,如果是执行if里的内容*/
if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER )
{
/*根据中断服务函数的中断号获取当前中断的优先级设置*/
ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ];
/*如果当前执行的中断优先级数字小于配置ucMaxSysCallPriority这个值实际上是
configMAX_SYSCALL_INTERRUPT_PRIORITY,也就是当前中断优先级高于配置最高优先级
断言将会失败,程序将停止在这里*/
configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );
}
/*当前中断优先级分组组大于配置分组(也就是表示抢占优先级的位数少于配置)则断言失败,程序停止*/
configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue );
}
博客讨论了在STM32Cube的FreeRTOS配置中,如何理解和处理中断优先级,以避免在不合适的中断级别调用RTOS函数导致程序停止。vPortValidateInterruptPriority函数用于验证当前中断优先级是否安全,如果中断优先级高于预设的最大系统调用优先级或者优先级分组超出配置,程序会停止运行。
667





