Ardruino的多速率多传感器读数

时间:2015-08-04 09:12:26

标签: arduino

我刚买了一个新的Arduino来玩几个传感器来获取他们的数据。我从这里得到了这段代码:

typedef void (*command)();

template <unsigned long wait_ms, command c>

void repeat() {
    static unsigned long start = millis();
    if (millis()-start >= wait_ms) {
        start += wait_ms;
        c();
    }
}

void task1()                   
{

}

void task2() 
{

}

void task3() 
{

}

void setup(){

  Serial.begin(4800);

}

void loop(){
  int aba=1000;
  repeat<1000, task2>();
  repeat<5000, task1>();  
  repeat<3000, task3>();    
}

上面的代码完美运行没有任何问题。但是当我像这样做出改变时

void loop(){
      int aba=1000;
      repeat<aba, task2>();
      repeat<5000, task1>();  
      repeat<3000, task3>();    
    }

执行它有问题。

1 个答案:

答案 0 :(得分:0)

局部变量aba不是编译时常量。

如果您之后的内容是wait_ms的变量值(在运行时更改),那么您运气不好。您需要实现一个可以使用运行时值的非模板版本。

将编译时常量与模板一起使用通常会更有效,但是您使用不同的模板参数值复制每个实例的代码。

对于变量等待,您可以执行以下操作:

typedef void (*command)();

void repeat(unsigned long wait_ms, command c, unsigned long &start);
void repeat(unsigned long wait_ms, command c, unsigned long &start) {
    if (millis()-start >= wait_ms) {
        start += wait_ms;
        c();
    }
}

static unsigned long task1Start, task2Start, task3Start;  

void task1() {Serial.println("task 1");}                 
void task2() {Serial.println("task 2");}   
void task3() {Serial.println("task 3");}   

void setup(){
  Serial.begin(9600);
  task1Start = task2Start = task3Start = millis();
}

void loop(){
  int aba=1000;
  repeat( aba, task1, task1Start );
  repeat( random(5000, 10000), task2, task2Start );  
  repeat( random(50, 500), task3, task3Start );    
}

编辑:由于该函数不再是模板,因此该函数仅在每次调用之间共享一个静态start。模板基本上为每组输入复制代码,为每个任务提供唯一的start

这可以通过添加第三个参数来解决,该参数传递对每个特定任务的start变量的引用。

如果您要使用许多任务,则封装每个任务的Task对象可能更有用/更容易处理。