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

标签 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 从它上次正在做的事情开始任务正在运行的时间 [1]),以便旧状态 [2] 中的代码在遇到 break 之前不会继续[3] 并且状态更改生效。

我可以实现这种行为吗?

最佳答案

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

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

另一个想法是让任务A在任务执行过程中不能被抢占。如果任务 A 的状态太大而无法长时间禁用抢占,那么也许可以将这些状态分成多个较小的状态。

关于c++ - 在任务的状态被另一个任务更改后重新启动任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38504620/

相关文章:

使用 const char 初始化的 c++ 2D char 数组元素

c++ - 如何交换字节半字节?

android - 尝试为 android 示例构建 OpenCV 时运行构建器 'CDT Builder' 时出错

c# - 等待多个可选任务

speech-recognition - 隐马尔可夫模型 (HMM) 中的三态电话模型

math - 马尔可夫链与有限状态机相同吗?

c++ - TColor Initialise with int 适用于 {} 但不适用于 ()

c# - .RunSynchronously() 和 GetAwaiter().GetResult() 之间的区别?

c# - 使用 Task.FromResult 将 Task<T> 隐式转换为 Task<X> 其中 T : X?

c++ - 状态机状态之间的通信