在任务的状态被另一个任务更改后重新启动任务
Restarting a task after its state is changed by another task
我有一个 C++ 设计,其中有两个状态机,A
和 B
,运行 在两个不同的 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
的机器 "restart" 当它的状态改变时(即 break
从上次任务开始时它正在做的运行 [1]), 因此旧状态 [2] 中的代码在到达 break
[3] 并且状态更改生效。
我可以实现这种行为吗?
不,我相信你想做的事情并不像你描述的那样合理。当任务 A 被抢占时,调度程序保存任务 A 的上下文并恢复任务 B 的上下文。任务 A 保存的上下文包括切换出时使用的局部变量和程序计数器(指令的地址那正在执行)。为了恢复上下文 A 以便它在不同的地方运行,您必须在恢复之前编辑任务 A 的已保存上下文。而且我认为这不是一件合理的事情。
我不确定这是个好主意,但请考虑任务 B 是否可以在任务 B 更改任务 A 的状态时删除并重新创建任务 A。也许任务 A 可以在任务 B 更改 A 的状态时重新启动。
另一个想法是让任务A在任务执行过程中不能被抢占。如果任务 A 的状态太大而无法长时间禁用抢占,那么也许可以将状态分为多个较小的状态。
我有一个 C++ 设计,其中有两个状态机,A
和 B
,运行 在两个不同的 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
的机器 "restart" 当它的状态改变时(即 break
从上次任务开始时它正在做的运行 [1]), 因此旧状态 [2] 中的代码在到达 break
[3] 并且状态更改生效。
我可以实现这种行为吗?
不,我相信你想做的事情并不像你描述的那样合理。当任务 A 被抢占时,调度程序保存任务 A 的上下文并恢复任务 B 的上下文。任务 A 保存的上下文包括切换出时使用的局部变量和程序计数器(指令的地址那正在执行)。为了恢复上下文 A 以便它在不同的地方运行,您必须在恢复之前编辑任务 A 的已保存上下文。而且我认为这不是一件合理的事情。
我不确定这是个好主意,但请考虑任务 B 是否可以在任务 B 更改任务 A 的状态时删除并重新创建任务 A。也许任务 A 可以在任务 B 更改 A 的状态时重新启动。
另一个想法是让任务A在任务执行过程中不能被抢占。如果任务 A 的状态太大而无法长时间禁用抢占,那么也许可以将状态分为多个较小的状态。