考虑以下代码:
// 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、TaskB 和 TaskC,由 uCOS-III 操作系统管理。 TaskA 负责处理 UART 数据接收,ISR 在接收到数据时发布一个标志(UartRec)来激活 TaskA。 TaskB 和 TaskC 是周期性任务,优先级低于 TaskA。
正常情况下,当 UART 帧发送缓慢(大约 1ms 间隔)时,一切正常。然而,当 UART 速度提高并且大量发送帧时,TaskA 在处理大约 2K、5K 或有时 300 帧后变得无响应。 TaskB 和 TaskC 继续正常工作,没有任何问题。
我已经通过检查TaskA任务控制块(TCB)和CSTACK排除了堆栈溢出,但两者都没有达到极限。
我还验证了以下内容:
TaskA 处于就绪状态。 TaskA 没有等待任何标志,因为所需的标志 (UartRec) 已准备就绪。 尽管任务 A 在任务中具有最高优先级,但调度程序似乎并未优先考虑任务 A。因此,任务 A 保持无响应,而其他任务(包括空闲任务)正常运行。
如果您能就可能导致此行为的原因以及我应该检查哪些配置来解决此问题提供任何见解或建议,我将不胜感激。