问题现象
程序运行一段时间出现程序死在vListInsert函数中的
pxIterator = pxList->xListEnd.pxPrevious;
可能原因
1、freertos堆栈溢出
2、中断优先级与系统优先级配置问题
3、taskENTER_CRITICAL临界区引起
4、在初始化队列或信号量之前使用队列或信号量
问题排查方法
- freertos堆栈溢出问题:
1.打开堆栈溢出检测功能,查看是否有溢出
2.使用uxTaskGetStackHighWaterMark函数查看任务剩余的栈空间
- 中断优先级与系统优先级配置问题:
1.查看freertos系统优先级配置
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 0xf
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
2.查看硬件中断优先级配置,当中断优先级小于 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY时该中断将 不受系统控制,这种优先级使用时要特别注意。
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- 临界区引起问题:
1.查看是否存在临界区内是否存在信号量、互斥锁之类的接口
- 在初始化队列或信号量之前使用队列或信号量
1.查看中断中是否存在调用未初始化的情况