1. 引言
最近在调试程序时发现程序会在运行一段时间后崩溃。在仔细阅读FreeRTOS和PIC32MX的相关资料后,修改了FreeRTOS配置,调整了优先级设置,优化了关键区域的代码,显著降低了崩溃的概率。在这里分享一些心得。
想学习FreeRTOS的基础知识请阅读专栏:
1. FreeRTOS基础篇
2. FreeRTOS高级篇
2. 配置FreeRTOSConfig.h
这里主要提几个与PIC32MX微处理器的特性有关的配置项,其他通用的配置请参考 FreeRTOS系列第6篇—FreeRTOS内核配置说明
/* Interrupt nesting behaviour configuration. */
/* The priority at which the tick interrupt runs. This should probably be kept at 1. */
#define configKERNEL_INTERRUPT_PRIORITY 1
/* The maximum interrupt priority from which FreeRTOS.org API functions can be called.
Only API functions that end in ...FromISR() can be used within interrupts. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 6
PIC32MX的中断优先级为1-7,其中1最低,7最高。低优先级的中断触发的中断服务程序可以被高优先级的中断打断,从而执行更紧急的中断服务程序。
系统定时器中断使用最低优先级1,其可以被中断优先级为2-7的中断嵌套。
优先级为2-6的中断触发的中断服务程序里,可以使用FreeRTOS提供的后缀为FromISR()的API函数。
优先级为7的中断触发的中断服务程序不受FreeRTOS的影响,且不可以使用后缀为FromISR()的API函数。
设置configMAX_SYSCALL_INTERRUPT_PRIORITY的意义在于,使一些中断服务函数可以使用自己的栈空间。不高于configMAX_SYSCALL_INTERRUPT_PRIORITY的中断服务程序都使用相同的中断栈空间。