c++ - Arduino,任务调度程序的延迟

标签 c++ arduino embedded interrupt 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 与第二个不同;也许//其他一些函数会澄清?然而,如果它们实际上是相同的,那么代码将很简单:

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/

相关文章:

c++ - 抽象类/函数编译错误

c# - 用 C++ 开发 Win32 应用程序比用 C# 开发 .NET 应用程序有什么优势?

使用带有 Arduino 的瑞士流量计计算脉冲,它是如何完成的?

ubuntu - "ubuntu netbook remix"和 "intel moblin os"是从同一个基础构建的吗?

Renesas RX62N ADC 的配置

gcc - 任天堂 DS Homebrew 程序与 Ada?

c++ - 对二维线对执行操作的最佳方法是什么?

c++ - 你如何让数字在右边排列?

linux - 从 Linux 到 Mac 执行脚本

c++ - Arduino/C++-使用F()宏将PROGMEM字符串传递给类