stm32 FreeRTOS中断优先级不能高于配置宏 vPortValidateInterruptPriority

博客讨论了在STM32Cube的FreeRTOS配置中,如何理解和处理中断优先级,以避免在不合适的中断级别调用RTOS函数导致程序停止。vPortValidateInterruptPriority函数用于验证当前中断优先级是否安全,如果中断优先级高于预设的最大系统调用优先级或者优先级分组超出配置,程序会停止运行。

在这里插入图片描述
在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 );
}
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值