我目前遇到一个问题,该问题涉及使用任务调度程序的程序和使用延迟的任务。
任务正在运行以下代码:
// Some function
delay(_speedVar);
// Some function
delay(_speedVar);
// End of task.
由于我还有另一个任务,只是从 UART 轮询信息,因此设置 _speedVar 的值。
// Uart task
if(Serial.available())
{
_speedVar = Serial.read();
}
// End of task
我的问题是,如果 speedVar 设置为很高的值,比如说 10 秒,则执行某些功能且延迟为 (_speedVar) 的任务需要以某种方式中断,并使用新的 _speedVar 值重新开始。
我使用的任务计划程序实际上没有灵活性。它只允许我创建和销毁任务。我还没有找到一个具有更多功能并且可能有效的产品,所以我暂时坚持使用这个
解决方案的唯一想法是使用中断,但我不确定在使用任务调度程序时如何正确实现这一点。
所有编程都是使用 Arduino 的 Sketch 工具用 C++ 完成的。编程单元是Arduino Uno。
最佳答案
假设调度程序是协作的,并且您发布的这些代码片段以某种方式在某些“大循环”中被调用,那么,大多数不平凡的任务通常会作为状态机实现。鉴于:
class cElapsedTime
{
cElapsedTime()
{
zero() ;
}
void zero()
{
timestamp = millis() ;
}
bool time()
{
return millis() - m_timestamp ;
}
} ;
enum
{
STATE_A,
STATE_B
} state = STATE_A;
cElapsedTime control_task_delay ;
然后在两个状态之间切换,以在每个延迟周期后执行不同的代码块。通过不断将耗时与_speedVar
的当前值进行比较,可以随时更改延迟。如果_speedVar
从10秒变为5秒,且运行时间为7秒,则延迟的代码将立即执行;如果时间延长,延迟也会:
if( control_task_delay.time() >= _speedVar )
{
switch( state )
{
case STATE_A :
// Some function
control_task_delay.zero() // Restart delay
state = STATE_B ; // Next state
break ;
case STATE_B :
// Some function
control_task_delay.zero() // Restart delay
state = STATE_A ; // Next state
break ;
}
}
您的代码片段中不清楚第一个 //Some function
与第二个不同;也许//其他一些函数
会澄清?然而,如果它们实际上是相同的,那么代码将很简单:
if( control_task_delay.time() >= _speedVar )
{
// Some function
control_task_delay.zero() // Restart delay
}
您可以看到,这与您应用于 UART 轮询任务的原理相同 - 使用非阻塞测试。也就是说,在任何情况下也许都不需要单独的任务;你可以:
if( Serial.available() )
{
_speedVar = Serial.read();
}
if( control_task_delay.time() >= _speedVar )
{
switch( state )
{
case STATE_A :
// Some function
control_task_delay.zero() // Restart delay
state = STATE_B ; // Next state
break ;
case STATE_B :
// Some function
control_task_delay.zero() // Restart delay
state = STATE_A ; // Next state
break ;
}
}
您的代码片段中不清楚第一个 //Some function
与第二个不同;也许//其他一些函数
会澄清?然而,如果它们实际上是相同的,那么代码将很简单:
if( control_task_delay.time() >= _speedVar )
{
// Some function
control_task_delay.zero() // Restart delay
}
if( control_task_delay.time() >= _speedVar )
{
switch( state )
{
case STATE_A :
// Some function
control_task_delay.zero() // Restart delay
state = STATE_B ; // Next state
break ;
case STATE_B :
// Some function
control_task_delay.zero() // Restart delay
state = STATE_A ; // Next state
break ;
}
}
很难看出“调度程序”在这种情况下实现了什么。
关于c++ - Arduino,任务调度程序的延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23312619/