У меня есть проект 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]), так что код в старом состоянии [2] не продолжается до нажатия break
[3] и изменение состояния вступает в силу.
Могу ли я достичь такого поведения?
Похоже, вы хотите переменную условия. То есть, когда B устанавливает состояние A в A2, A затем будет ждать переменной условия, в которой b будет уведомляться. Более простым примером является то, что у вас есть мьютекс, который B берет, прежде чем установить состояние A в A2. После того, как A завершает работу с A2, он пытается захватить мьютекс, который будет работать до тех пор, пока B не выпустит его. – AndyG