运行多个函数同时使用调度器库
多任务闪烁实验
运行多个函数同时使用调度器库
作者:Arduino
原链接:Multiple Blinks | Arduino Documentation
最后修订:2024/10/28
翻译:战忆辞
说明:想用rt-thread+arduino写小车代码,但是没找到现成的资源,只能自己整理了,侵权联删
简介
基于SAM和SAMD架构的Arduino板(如Arduino Zero、MKR ZERO、MKR1000 WiFi和Due)可以同时运行多个函数。通过设置多个与`loop()`函数相同方式运行的其他函数,可以在没有专用定时器的情况下实现单独的循环函数。
目标
- 学习如何使用调度器库。
- 实现多个函数同时运行。
硬件与软件需求
硬件需求
- Arduino Zero, MKR ZERO, MKR1000 WiFi 板([商店链接](https://store.arduino.cc/))
- 三个LED
- 三个220 Ω电阻
- 跳线
软件需求
- Arduino IDE(在线或离线)
- 调度器库
电路连接
LED的阳极通过220欧姆电阻串联连接到引脚11、12和13,阴极连接到地。
编程步骤
1. 安装驱动程序:
如果使用在线编辑器,则无需安装任何驱动程序。
如果使用离线编辑器,需要手动安装驱动程序。可以通过导航到`工具 > 板子 > 板子管理器...`,然后搜索并安装`Arduino SAM boards (32-bits ARM Cortex-M3)`。
2. 安装库:
通过`工具 > 管理库...`,搜索并安装`Scheduler`库。
在开始之前,我们先了解一下库的核心函数:
Scheduler.startLoop()
- 将一个函数添加到调度器中,使其与`loop()`函数同时运行。
yield()
- 当调用时,将控制权传递给其他任务。理想情况下,`yield()`应在需要较长时间完成的函数中使用。
.cpp
// 包含调度器库,因为我们希望管理多个任务。
#include <Scheduler.h>
int led1 = 13;
int led2 = 12;
int led3 = 11;
void setup() {
Serial.begin(9600);
// 将3个引脚设置为输出
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
// 将"loop2"和"loop3"添加到调度器中。
// "loop"总是默认启动。
Scheduler.startLoop(loop2);
Scheduler.startLoop(loop3);
}
// 任务1:以1秒延迟闪烁LED。
void loop() {
digitalWrite(led1, HIGH);
// 重要提示:
// 当多个任务运行时,'delay'会在等待时将控制权传递给其他任务,并保证它们得到执行。
delay(1000);
digitalWrite(led1, LOW);
delay(1000);
}
// 任务2:以0.1秒延迟闪烁LED。
void loop2() {
digitalWrite(led2, HIGH);
delay(100);
digitalWrite(led2, LOW);
delay(100);
}
// 任务3:从串行端口接受命令
// '0' 关闭LED
// '1' 打开LED
void loop3() {
if (Serial.available()) {
char c = Serial.read();
if (c == '0') {
digitalWrite(led3, LOW);
Serial.println("Led turned off!");
}
if (c == '1') {
digitalWrite(led3, HIGH);
Serial.println("Led turned on!");
}
}
// 重要提示:
// 我们必须定期调用'yield'以将控制权传递给其他任务。
yield();
}
测试
代码上传后,两个LED应该会亮起。一个LED以1秒延迟闪烁,另一个以0.1秒延迟闪烁。第三个LED可以通过串行监视器打开和关闭。要打开串行监视器,请转到`工具 > 串行监视器`。输入`0`将关闭LED,输入`1`将打开LED。
故障排除
如果代码无法正常工作,可以检查以下常见问题:
- LED和电阻的连接不正确。
- 未安装调度器库。
结论
在本示例中,我们构建了一个项目并学习了调度器库,该库允许基于SAM和SAMD架构的Arduino板同时运行多个函数。