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

时间:2016-07-21 12:44:11

标签: c++ task state-machine

我有一个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与上次运行任务时的行为相同< strong> [1] ),以便旧的状态 [2] 中的代码在点击break [3] 和州改变生效。

我能实现这种行为吗?

1 个答案:

答案 0 :(得分:1)

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

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

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