Arduino,任务调度程序延迟
Arduino, delay in a task scheduler
我目前遇到了一个问题,该问题涉及一个使用任务调度程序的程序和一个使用延迟的任务。
一个任务正在运行以下代码:
// 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
与第二个不同;也许// Some other 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
与第二个不相同;也许// Some other 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 ;
}
}
在这种情况下,很难看到"调度器"实现了什么。
协作任务调度程序的任务不能包括延迟或阻塞IO操作。相反,你需要计算节拍来匹配你需要的时间(在arduino上,我想你可以使用http://arduino.cc/en/Reference/millis)
- 编写一个读取五个整数并执行一些任务的C++程序
- 无法在基于 DFS 的任务排序程序中填充"stack"
- 5 CPU的任务调度N进程
- 任务计划程序库的预处理不起作用 - 多定义错误
- 任务计划程序:设置运行级别时拒绝访问
- 如何在boost.fibers中使用work_stealing调度程序
- C - 用STD :: difftime编写调度程序 - 如何在白天检查时间(HH:MM:SS)
- 任务调度程序API错误80041318
- 如何使用 c++ 在任务计划程序中检查任务的触发器
- 如何使用Microsoft PPL轻量级任务调度程序实现后退
- 使用 Boost 协程实现多任务调度程序和执行程序
- 我可以使用cocos2d-x调度程序来延迟一行代码吗
- Qt App在任务调度程序启动时不加载sql驱动程序
- 任务调度程序:从当前时刻开始,每小时运行一次任务
- 应用程序是不可见的,如果没有任何用户登录从任务调度程序启动
- 任务调度程序2.0的任务编辑器对话框
- 以编程方式为任务调度程序创建/删除任务
- Arduino,任务调度程序延迟
- 任务调度程序:如何调度登录时执行的任务
- 任务委派调度程序