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了
测试成功,串口不死机了!!
心累