在一个任务的状态被另一个任务更改后重新启动该任务

Restarting a task after its state is changed by another task

本文关键字:任务 另一个 重新启动 一个 状态      更新时间:2023-10-16

我有一个C++设计,其中我有两个状态机,AB,在两个不同的FreeRTOS任务中运行,如下所示:

A::task()
{
    while (1)
    {
        switch (m_state)
        {
        case A1:
            // Do A1 stuff
            break;
        case A2:
            // [1] Do A2 stuff before yielding to B::task()
            // [2] Do more A2 stuff after resuming from B::task()
            break; // [3]
        default:
            break;
        } // switch: state
    } // while: task loop
}
B::task()
{
    while (1)
    {
        switch (m_state)
        {
        case B1:
            // Do B1 stuff
            break;
        case B2:
            // Do B2 stuff
            break;
        default:
            break;
        } // switch: state
    } // while: task loop
}

现在,B能够更改A的状态(异步地,通过回调)。这一切都很好,但我想做的是让A的机器在其状态更改时"重新启动"(即break与上次任务运行[1]时的状态不同),这样,在达到break[3]并使状态更改生效之前,旧状态[2]

我能做到这种行为吗?

不,我认为你想做的事情不像你所描述的那样有合理的可能性。当任务A被抢占时,调度程序保存任务A的上下文并恢复任务B的上下文。保存的任务A上下文包括切换时正在使用的局部变量和程序计数器(正在执行的指令的地址)。为了恢复上下文A,使其在不同的地方运行,你必须在恢复之前编辑任务A保存的上下文。我认为这不是一件合理的事情。

我不确定这是否是个好主意,但请考虑任务B是否可以在任务B更改任务a的状态时删除并重新创建任务a。也许这样,任务B更改a的状态后,任务a就可以重新启动。

另一个想法是使任务A在任务中间时不会被抢占。如果任务A的状态太大,无法长时间禁用抢占,那么这些状态可能会被划分为多个较小的状态。

相关文章: