uC/OS-iii 任务无响应

问题描述 投票:0回答:1

考虑以下代码:

// 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 保持无响应,而其他任务(包括空闲任务)正常运行。

如果您能就可能导致此行为的原因以及我应该检查哪些配置来解决此问题提供任何见解或建议,我将不胜感激。

c stm32 rtos iar ucos
1个回答
0
投票

问题终于解决了,具体情况是这样的:

如您所见,当操作系统位于临界区内时,中断会定期发生。这会导致出现共享资源问题并损坏 OSprioTbl 变量。发生这种情况是因为 uCOS-III Cortex-M0 端口仅屏蔽除 BasePrio 之外的 ISR 优先级,在我的例子中,BasePrio 的优先级为零。将 ISR 优先级从零更改为大于零的任何其他值解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.