FreeRTOS 10.0.1在CC1310平台运行卡在vListInsert的调试求助
FreeRTOS CC1310 内核死锁问题调试方案
1 中断上下文API调用合法性排查
- 优先检查I2C中断服务函数中调用的信号量释放接口:TI RTOS抽象层(P层)要求中断上下文只能调用带
FromISR后缀的API,如果直接调用任务级接口SemaphoreP_post(),会跳过临界区保护非法修改内核链表,该类错误通常表现为前1-N次操作正常,某次操作后突然触发内核死锁,和你描述的第一次读取正常、第二次卡死的现象完全吻合。 - 同步排查所有外设中断服务函数,确认没有在中断上下文调用非FromISR后缀的FreeRTOS API的情况。
2 中断优先级配置校验
- 确认
configMAX_SYSCALL_INTERRUPT_PRIORITY配置符合Cortex-M内核规则:CC1310使用3位宽度的中断优先级,FreeRTOS要求该配置项为左对齐后的寄存器值,而非逻辑优先级数值。例如逻辑优先级1对应的寄存器值为1 << (8 - 3) = 0x20,如果错误填入逻辑优先级数值1,会导致关中断范围异常,高优先级中断可能打断内核临界区操作,破坏链表结构。 - 确认I2C中断的逻辑优先级数值大于等于
configMAX_SYSCALL_INTERRUPT_PRIORITY对应的逻辑优先级,只有符合该要求的中断才允许调用FreeRTOS FromISR系列API。
3 内核链表损坏专项定位
- 开启FreeRTOS配置项
configASSERT():所有内核函数入口会自动校验参数、链表指针合法性,链表出现异常会直接触发断言,无需等待执行到vListInsert才发现问题。 - 使能
configCHECK_FOR_STACK_OVERFLOW = 2:2级栈溢出检测会扫描任务栈尾部的标记字节,任务切换时自动校验,可覆盖绝大多数任务栈溢出场景,任务栈溢出会直接破坏相邻的内核对象内存(包括链表结构)。 - 在
vListInsert入口处添加断点,每次执行前校验pxList的首尾指针合法性,同时记录最近一次操作该链表的任务/中断上下文,快速定位破坏链表的代码位置。
4 信号量异常排查
- 确认信号量创建类型匹配使用场景:如果是二值信号量,第一次pend成功后信号量变为空,需确认post操作是否实际修改了信号量计数值,是否出现计数值溢出的情况。
- 确认不存在多个任务同时操作同一个信号量且未加保护的场景。
内容的提问来源于stack exchange,提问作者JakobJ
相关产品推荐
相关产品推荐

