Dette eksempel illustrerer, hvordan man kan bruge function pointers til at køre forskellige opgaver med hvert sit interval, uden at de blokerer for hinanden i længere tid end det tager at eksekvere en enkelt opgave.
typedefstruct MyTask {
void (*handler)();
int intervalMs;
int taskId;
unsignedlong lastRunMs;
} MyTask;
// Forward declaration of the task runner functions
voidtask_main();
voidtask_A();
voidtask_B();
voidtask_C();
MyTask tasks[] = {
{.handler=task_main},
{task_A,300},
{task_B,500},
{task_C,3000}
};
constint arrSize =sizeof(tasks)/sizeof(MyTask);
voidsetup() {
// initialize serial communication at 115200 bits per second:
Serial.begin(115200);
Serial.print("Task count: ");
Serial.println(arrSize);
for(int i=0 ; i<arrSize; i++){
if(tasks[i].intervalMs <=0){
tasks[i].intervalMs = (i+1)*100;
}
String msg ="";
msg ="task id: ";
msg += i;
msg +=", interval ";
msg += tasks[i].intervalMs;
Serial.println(msg);
}
Serial.println("Setup DONE");
}
// example of non-blocking asyncronous wait loop using function pointers
voidloop() {
for(int i=0 ; i<arrSize; i++){
runInterval(&tasks[i]);
}
}
voidrunInterval(struct MyTask *t){
unsignedlong tickMs =millis();
unsignedlong diffMs = tickMs - t->lastRunMs;
// Handle first run
if(0== t->lastRunMs){
t->lastRunMs = tickMs;
}
bool shouldRun = (t->intervalMs < diffMs);
if(!shouldRun){
return;
}
// Store last run
t->lastRunMs = tickMs;
// Perform the process by calling the handler function
(t->handler)();
}
// Create some tasks to run in the example
voidtask_main(){
staticint runCount =0;
Serial.print(".");
if(0== runCount %30){
Serial.println();
Serial.print(runCount);
Serial.print(" : ");
}
runCount++;
}
voidtask_A(){
Serial.print("A");
}
voidtask_B(){
Serial.print("B");
}
voidtask_C(){
Serial.print("C");
}
Når eksemplet køres på en arduino generes dette output på seriel porten.