目录

Table of Contents

Introduction

使用方法

示例1:SCoop-example

示例2:测试程序



Introduction

在Arduino实际开发中我们可能遇到这样的问题:

  • arduino需要不断的读取外部管脚所输入的传感器数值;

  • 于此同时,要产生PWM方波来控制步进电机;

  • 如果有上位机,则还需要完成数据的收发工作;

  • 按键key输入时需要消抖延时delay(30),但是这样的延时30ms等会导致整个Arduino硬件处于闲置状态,而后台需要完成的任务也被搁置。

针对此类多任务同时处理的工作场景,解决方法有多种,第一:使用计时器或外部中断机制,完成多任务处理;第二:使用Arduino 多线程技术,本质上也是中断机制。

于是,Github上的牛人们帮我们写好了一个Scoop多线程库,传送门:

https://github.com/fabriceo/SCoop/tree/master/SCoop


使用方法

  1. Github链接下载或克隆文件夹到本地;
  2. 解压文件,找到SCoop文件夹,将其重新压缩成.zip 文件,另存;
  3. 打开Arduino IDE 在【项目】选项中找到加载项目库选项,然后找到刚才压缩的SCoop.zip文件;
  4. 成功添加库文件之后,可以在【文件】-【示例】中找到【SCoop】-example1 等例子程序。
  5. 选择新建项目,实际测试Arduino多线程。

示例1:SCoop-example


// EXAMPLE 1
/* VERSION 1.2  NEW YEAR PACK 10/1/2013                                       */#include <SCoop.h>     //包含SCoop头文件
#define led1 LED_BUILTINdefineTaskLoop(myTask1)    //创建线程myTask1
{ Serial.println("hello from task1"); sleep(1000);
}
defineTask(myTask2);   //创建线程myTask2void myTask2::setup() { //设定线程myTask2trace("task2setup"); pinMode(led1, OUTPUT);
}void myTask2::loop()  { //设定线程myTask2循环Serial.println("led1 HIGH"); digitalWrite(led1, HIGH); sleepSync(500);Serial.println("led1 LOW");  digitalWrite(led1, LOW);  sleepSync(500);
}defineTimerRun(Timer1,100)
{ if (Serial.available()) { char c = Serial.read(); Serial.print(c);Serial.println(" key pressed"); if (c=='a') myTask1.pause();if (c=='b') myTask1.resume();} }void setup() { Serial.begin(57600); while (!Serial); mySCoop.start(); }void loop()  { Serial.println("do whatever you want here also");
mySCoop.sleep(500); }

示例2:测试程序

测试完整代码及子线程完整定义,注意延迟函数使用sleep(),不要使用delay(); sleep()只在当前线程进行延迟,delay()则会在全局进行延迟。

/*实现线程1以1s的频率闪烁,线程2以2s的频率闪烁*/#include <SCoop.h>defineTask(TaskTest1);//创建子线程1
defineTask(TaskTest2);//创建子线程2
void TaskTest1::setup()//线程1设定
{pinMode(2, OUTPUT);
}
void TaskTest1::loop()//线程1循环
{digitalWrite(2, HIGH);sleep(1000);digitalWrite(2, LOW);sleep(1000);
}void TaskTest2::setup()//线程2设定
{pinMode(3, OUTPUT);
}
void TaskTest2::loop()//线程2循环
{digitalWrite(3, HIGH);sleep(2000);digitalWrite(3, LOW);sleep(2000);
}
void setup() {mySCoop.start();
}void loop()
{yield();
}

最后想说一下,毕竟这个只是 arduino ,虽然这个可以实现并发处理,但最多只能支持两三个并发任务,再多就不行可能报错了,如果还想处理更多并发任务,推荐用 stm32。

Arduino学习笔记(7)- 多线程技术相关推荐

  1. PE病毒学习笔记——初识感染技术 (转自看雪学院)

    [分享]PE病毒学习笔记--初识感染技术 <script type="text/javascript"></script>   标 题: [分享]PE病毒学 ...

  2. Arduino学习笔记2

    一.蜂鸣器输出实验 1.源代码 int buzzer=2;//设置控制蜂鸣器的数字口对应板子上2口 void setup() { pinMode(buzzer,OUTPUT);//设置对应的输出模式 ...

  3. Arduino学习笔记(1):太极创客 第一部分

    Arduino学习笔记 太极创客 第一部分 笔记 1-5 变量 1-6 程序结构 1-7 变量操作 1-8/1-9 程序函数 1-10/1-11 数字输出 1-12 面包板 1-13/1-14 数字输 ...

  4. Java之多线程学习笔记五 —— 多线程模拟龟兔赛跑

    Java之多线程学习笔记五 -- 多线程模拟龟兔赛跑 参考教程B站狂神https://www.bilibili.com/video/BV1V4411p7EF package pers.ylw.less ...

  5. arduino 学习笔记及课件01基础入门

    arduino 学习笔记及课件01基础入门 以下学习笔记中图片部分由太极创客视频截图所得 概论 一. 引脚及信号 1.1引脚模式 INPUT:当Arduino没有使用上拉电阻或下拉电阻而直接与开放的开 ...

  6. 冰冰学习笔记:多线程

    欢迎各位大佬光临本文章!!! 还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正. 本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位大佬.帅哥.美女点点支 ...

  7. java同步锁售票_Java基础学习笔记: 多线程,线程池,同步锁(Lock,synchronized )(Thread类,ExecutorService ,Future类)(卖火车票案例)...

    学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程:线程是 ...

  8. Java学习笔记5-1——多线程

    目录 前言 核心概念 线程创建 继承Thread类 实现Runnable接口 上述两个方法小结 实现Callable接口 并发问题简介 静态代理模式 线程状态 线程停止(stop) 线程休眠(slee ...

  9. java多线程学习笔记--一.多线程的基础知识

    需要学习的知识 多线程基础知识讲解 参考索隆和jim的视频,以及自己做的笔记 导读 为了充分利用CPU资源,人们发明了线程和进程 进程 由来:在单核cpu的时期,为了方便操作把一系列的操作的指令写下来 ...

最新文章

  1. RHCE认证培训+考试七天实录(二)
  2. 《LeetCode力扣练习》第338题 比特位计数 Java
  3. 用Latex做介绍自己和团队科研的网页
  4. 桥接模式 - 设计模式学习
  5. python(十):模块相关、操作Redis、操作Excel
  6. 基于SSM的灾情发布平台
  7. 正方教务系统一键教学评价
  8. 联想服务器无线网卡被禁用,win10系统联想笔记本禁用无线网络适配器的处理技巧...
  9. 什么是微信公众号矩阵模式?
  10. wzoi‘‘买苹果‘‘
  11. GCPC 2013_A Boggle DFS+字典树 CSU 1457
  12. 四心圆法画椭圆原理_四心圆法画椭圆的解析画法
  13. ARP(地址解析协议)和RARP(逆地址解析协议)
  14. 代谢组学——最接近生物表型的组学
  15. 阿里云centos6静默安装oracle11G
  16. 英语基础不好可以学会编程吗?
  17. Java扫雷游戏心得体会总结_扫雷心得 - stme - BlogJava
  18. 自动驾驶技术综述1:自动驾驶算法软件架构介绍
  19. 转:黑阔之超级约会学
  20. 逻辑回归模型在R中实践

热门文章

  1. AMD处理器安装CentOS 64的注意事项
  2. Ubuntu desktop amd64 安装及简单配置
  3. vscode设置将英文界面设置为中文?
  4. Docker学习(一)华为云耀云Ubuntu 7.4.0安装Docker
  5. Java常见的设计模式整理
  6. oppo C++软件开发2021暑期实习一面+HR面(已offer)
  7. 两点之间的距离c语言
  8. 移动端开发touchstart,touchmove,touchend事件详解使用
  9. 【疑难杂症】外置USB无线网卡信号差
  10. 配置虚拟主机和https