arduino scoop多线程
实际上arduino没有多线程,所谓的多线程可能只是多任务。在同时运行两个较为简单的或者是执行周期很短的程序时应该是没问题的。程序较为复杂,或者需要放到某一线程中的程序所需的执行周期较长时,scoop的优势可能就没有了,两个线程的程序执行时可能会时序冲突,就需要再考虑cpu时序的问题。反而不如用中断库了。
scoop库下载资源:arduino scoop库
我用这个scoop库在程序里建了两个线程(两对setup+loop()),其中一个里面运行一个HX711模拟量+重量传感器的采集程序,另一个里面运行一个电磁阀控制的程序(其中采集程序运行一周期通过millis()函数测量需要大约138ms)
当这个scoop多线程开始运行时,传感器受力时,采集程序进行运算执行,使得控制程序频率被拖慢。并且当其中一个多线程中用到while()死循环时,另一个线程也不能执行(即被while卡住),由此也证明是假的多线程。
scoop库再使用时需要在主程序的Setup函数中写入以下代码:
#include <SCoop.h>
void setup() {
mySCoop.start();
}
void loop()
{
yield();
}
下面是简单使用scoop库的例子:线程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();
}
需要注意的是,分线程中的delay()要改成sleep(),而delay()为全局