1. 项目背景
项目是基于Nxp Mcu+FreeRtos,成品是车机(车载导航系统),也是刚入职接手的项目,机器总是无缘无故的重启,没有规律
2. 问题结果
Mcu代码里面驱动中断优先级设置不对,全部都是默认的优先级,并且有些调用了系统API函数,所以机器会不定时产生重启
3. 分析和说明
1.对比FreeRtos和Ucos的明显区别
关于Mcu中断的设置,FreeRtos和Ucos有着明显的区别,其中FreeRtos是可以设置一个中断优先级界限的(#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 0x03),不同芯片的优先级大小不一样(有些芯片是优先级越高,数值越低,有些是优先级越高,数值越高),基于这个优先级我们就可以设定某些驱动不受系统切换时禁止中断的管制。
2.关于FreeRtos优先级设置
这里我们以优先级越高,数值越低的芯片进行说明,S32K就是如此
上面我们已经提到FreeRtos有个设置优先级界限的#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 0x03,即小于3的优先级是不受系统管制的,但是不可以调用系统Api函数,大于3的可以调用系统Api函数。而且这里得提出有些芯片提供的SDK包里面的驱动是带有Blocking功能的,那你就得特别注意了,这里肯定是使用了系统API函数的,中断优先级必须设置在 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY之后
所以如果你是在使用FreeRtoss,并且遇到了同样的问题,请记住千万要检查中断优先级设置对不对,希望对你们有帮助