uC/OS-III高优先级TaskA高UART速率下无响应问题排查求助
uC/OS-III任务调度异常问题排查分析
问题背景与代码实现
基于uC/OS-III开发的应用包含三个任务,系统基础配置如下:
- Systick周期:1ms
- ISR栈大小:128
- 所有任务通过
OSTaskCreate创建
核心代码:
// uCOS-III // Systick - 1ms // ISR Stack Size 128 // All tasks have been created using OSTaskCreate ISR_UART0() { if(on receive) { OSFlagPost(UartRec); // Post Flag to activate TaskA } } TaskA() { // Priority -> 6 // StackSize -> 128 // StackLimit -> 0 for(;;) { OSFlagPend(UartRec); // Other Instructions } } TaskB() { // Priority -> 8 // StackSize -> 128 // StackLimit -> 0 for(;;) { OSDlyHSMS(0,0,0,2); // 2ms OS Delay } } TaskC() { // Priority -> 9 // StackSize -> 128 // StackLimit -> 0 for(;;) { OSDlyHSMS(0,0,0,2); // 2ms OS Delay } }
任务分工:
- TaskA(优先级6,最高):处理UART数据接收,UART0中断收到数据时通过
OSFlagPost发布UartRec标志唤醒TaskA - TaskB(优先级8)、TaskC(优先级9):低优先级周期性任务,通过
OSDlyHSMS实现2ms周期延时
问题现象
UART帧发送速率较低(约1ms间隔)时系统运行正常;提高UART速率、连续发送大量帧后,TaskA处理300~5000帧后无响应,但TaskB、TaskC仍正常运行。
已排查内容
- 确认TaskA的任务控制块(TCB)及栈未发生溢出
- 确认TaskA处于就绪状态,且
UartRec标志已就绪,并非因等待标志阻塞
原因分析及排查建议
可能原因
- 调度器锁未正确释放:若TaskA的
Other Instructions中调用了OSSchedLock()但未对应调用OSSchedUnlock(),会导致调度器嵌套锁计数异常,高优先级任务无法被调度。 - 中断优先级配置错误:若UART0中断优先级高于
OS_CFG_ISR_PRIO_MAX,uC/OS-III会跳过中断退出时的调度触发逻辑,导致TaskA就绪后无法及时被调度;若SysTick中断优先级过低,频繁的UART中断会抢占SysTick,导致调度时机被持续延迟。 - OSFlag参数配置异常:
OSFlagPost若使用OS_OPT_POST_NO_SCHED选项,ISR中发布标志后不会触发调度,TaskA需等待下一次调度事件(如低优先级任务延时到期)才能运行,高负载下会累积就绪请求导致异常。OSFlagPend未配置标志清除选项(如OS_OPT_PEND_FLAG_CLR_ALL),会导致UartRec标志持续有效,TaskA反复进入就绪状态但处理逻辑出现异常。
- TaskA栈资源不足:虽未溢出,但栈使用接近极限时可能破坏TCB中与调度相关的字段,导致任务无法被正常调度。
- TaskA处理逻辑缺陷:
Other Instructions中存在死循环、非OS兼容的延时操作,或错误修改了任务优先级、系统调度相关变量。
排查建议
- 检查调度器锁状态:在TaskA中添加对
OSSchedLockNestingCtr的监控,确认锁计数是否在合法范围,且每次OSSchedLock()后都有对应的OSSchedUnlock()调用。 - 验证中断优先级配置:确保UART0中断优先级低于
OS_CFG_ISR_PRIO_MAX,SysTick中断优先级高于UART0中断,保证调度触发逻辑能正常执行。 - 核查OSFlag参数:
- 确认
OSFlagPost未使用OS_OPT_POST_NO_SCHED,ISR中发布标志后会触发调度。 - 检查
OSFlagPend的选项参数,确保标志会被正确清除,避免持续触发TaskA就绪。
- 确认
- 优化TaskA栈配置:增大TaskA的栈大小,或开启栈检查(设置
StackLimit为非0值),监控栈使用峰值,排除栈资源不足导致的数据破坏。 - 排查TaskA处理逻辑:逐行检查
Other Instructions中的代码,确认无死循环、非法延时,或对系统调度变量的错误修改。
内容的提问来源于stack exchange,提问作者Arian
相关产品推荐
相关产品推荐

