admin管理员组

文章数量:1623788

1、今天在调试串口时,发现在中断调用xQueueSendFromISR后就会出现系统卡死

经过百度和谷歌后发现原来如此:

2、在FreeRTOSConfig.h中有个宏,

        #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY    2

这个宏是用来规定FreeRTOS能干预的优先级的,比如这里定义为2表示:

        1>中断优先级2~15的优先级,可以调用FreeRTOS的ISR后缀API

        2>中断优先级小于2的优先级,不可以调用FreeRTOS的ISR后缀API

不可以调用,就意味着我的系统中断不受FreeRTOS的影响,系统调度干预不到我的操作; 

而2~15的优先级调用FreeRTOS的ISR后缀API后,FreeRTOS通过函数会执行自己的调度算法

3、修改,在修改优先级时,又碰到了这个函数

有两个优先级要填,死活没配置成功。

之后仔细了解后才发现这两个优先级分别功能如下:

一个叫Preemption Priority(抢占优先级),一个叫SubPriority(子优先级)

1、抢占优先级:顾名思义能够抢先执行任务,即打断当前的主程序或者中断程序的运行,前去完成抢断中断。可以中断嵌套。俗称主优先级

2、子优先级:也是从优先级或者副优先级,在抢占优先级相同的情况下不能发生中断嵌套,高级的子优先级先执行。如果低级的子优先级在执行,需要等待完成才能执行高级的子优先级,即不发生抢断。俗称从优先级

这两个优先级,共同占用4bit的优先级表,具体的可以通过函数nvic_priority_group_set分配

不知道怎么分配,直接强制极端的分频,4个主,0个从

然后调用函数

nvic_irq_enable(USART0_IRQn, 3, 0);

 主优先级3,在2~15内,可以调用isr的API了

测试成功,串口不死机了!!

心累

本文标签: freeRTOSconfigLIBRARYMAXSYSCALLINTERRUPTPRIORITY