在一个任务的状态被另一个任务更改后重新启动该任务
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
的机器在其状态更改时"重新启动"(即break
与上次任务运行[1]时的状态不同),这样,在达到break
[3]并使状态更改生效之前,旧状态[2]
不,我认为你想做的事情不像你所描述的那样有合理的可能性。当任务A被抢占时,调度程序保存任务A的上下文并恢复任务B的上下文。保存的任务A上下文包括切换时正在使用的局部变量和程序计数器(正在执行的指令的地址)。为了恢复上下文A,使其在不同的地方运行,你必须在恢复之前编辑任务A保存的上下文。我认为这不是一件合理的事情。
我不确定这是否是个好主意,但请考虑任务B是否可以在任务B更改任务a的状态时删除并重新创建任务a。也许这样,任务B更改a的状态后,任务a就可以重新启动。
另一个想法是使任务A在任务中间时不会被抢占。如果任务A的状态太大,无法长时间禁用抢占,那么这些状态可能会被划分为多个较小的状态。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 运行同一解决方案的另一个项目的项目
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- C++从另一个类访问公共静态向量的正确方法是什么
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 使用std::transform将一个范围的元素添加到另一个范围中
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- C++试图读取一个文件并输出到另一个文本文件
- 如何将指针从一个void函数传递到另一个C++
- 如何从另一个文件继承私有成员变量和公共函数
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 将执行从一个线程移动到另一个线程,以实现任务并行性并在将来调用
- 具有两个窗口的C++中的应用程序.任务栏中显示的一个窗口.另一个未显示
- 如何先启动另一个终端任务
- 在一个任务的状态被另一个任务更改后重新启动该任务