Multiple Blinks(多任务调度处理、简单的非抢占式多任务处理)

运行多个函数同时使用调度器库

多任务闪烁实验

运行多个函数同时使用调度器库

作者:Arduino

原链接:Multiple Blinks | Arduino Documentation
最后修订:2024/10/28

翻译:战忆辞

说明:想用rt-thread+arduino写小车代码,但是没找到现成的资源,只能自己整理了,侵权联删


简介

基于SAM和SAMD架构的Arduino板(如Arduino Zero、MKR ZERO、MKR1000 WiFi和Due)可以同时运行多个函数。通过设置多个与`loop()`函数相同方式运行的其他函数,可以在没有专用定时器的情况下实现单独的循环函数。


目标

- 学习如何使用调度器库。
- 实现多个函数同时运行。


硬件与软件需求

硬件需求 

  1. Arduino Zero, MKR ZERO, MKR1000 WiFi 板([商店链接](https://store.arduino.cc/))
  2. 三个LED
  3. 三个220 Ω电阻
  4. 跳线

软件需求

  1. Arduino IDE(在线或离线)
  2. 调度器库

电路连接

        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板同时运行多个函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值