<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-CN">
		<id>http:///https//wiki.microduino.cn/index.php?action=history&amp;feed=atom&amp;title=%E7%AC%AC%E4%BA%94%E5%8D%81%E5%85%AB%E8%AF%BE--Microduino%E6%89%A7%E8%A1%8C%E5%A4%9A%E7%BA%BF%E7%A8%8B%E4%BB%BB%E5%8A%A1%2Fzh</id>
		<title>第五十八课--Microduino执行多线程任务/zh - 版本历史</title>
		<link rel="self" type="application/atom+xml" href="http:///https//wiki.microduino.cn/index.php?action=history&amp;feed=atom&amp;title=%E7%AC%AC%E4%BA%94%E5%8D%81%E5%85%AB%E8%AF%BE--Microduino%E6%89%A7%E8%A1%8C%E5%A4%9A%E7%BA%BF%E7%A8%8B%E4%BB%BB%E5%8A%A1%2Fzh"/>
		<link rel="alternate" type="text/html" href="https//wiki.microduino.cn/index.php?title=%E7%AC%AC%E4%BA%94%E5%8D%81%E5%85%AB%E8%AF%BE--Microduino%E6%89%A7%E8%A1%8C%E5%A4%9A%E7%BA%BF%E7%A8%8B%E4%BB%BB%E5%8A%A1/zh&amp;action=history"/>
		<updated>2026-04-20T19:02:46Z</updated>
		<subtitle>本wiki的该页面的版本历史</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>https//wiki.microduino.cn/index.php?title=%E7%AC%AC%E4%BA%94%E5%8D%81%E5%85%AB%E8%AF%BE--Microduino%E6%89%A7%E8%A1%8C%E5%A4%9A%E7%BA%BF%E7%A8%8B%E4%BB%BB%E5%8A%A1/zh&amp;diff=7923&amp;oldid=prev</id>
		<title>Radiumray9@gmail.com：Created page with &quot; {| style=&quot;width: 800px;&quot; |- | ==目的==  本教程将向大家介绍如何使Microduino执行多线程任务。  ==设备== *'''Microduino-Core/zh''' *'''Microduino-US...&quot;</title>
		<link rel="alternate" type="text/html" href="https//wiki.microduino.cn/index.php?title=%E7%AC%AC%E4%BA%94%E5%8D%81%E5%85%AB%E8%AF%BE--Microduino%E6%89%A7%E8%A1%8C%E5%A4%9A%E7%BA%BF%E7%A8%8B%E4%BB%BB%E5%8A%A1/zh&amp;diff=7923&amp;oldid=prev"/>
				<updated>2015-03-10T08:09:00Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot; {| style=&amp;quot;width: 800px;&amp;quot; |- | ==目的==  本教程将向大家介绍如何使Microduino执行多线程任务。  ==设备== *&amp;#039;&amp;#039;&amp;#039;&lt;a href=&quot;/index.php/Microduino-Core/zh&quot; title=&quot;Microduino-Core/zh&quot;&gt;Microduino-Core/zh&lt;/a&gt;&amp;#039;&amp;#039;&amp;#039; *&amp;#039;&amp;#039;&amp;#039;Microduino-US...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
{| style=&amp;quot;width: 800px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
==目的==&lt;br /&gt;
&lt;br /&gt;
本教程将向大家介绍如何使Microduino执行多线程任务。&lt;br /&gt;
&lt;br /&gt;
==设备==&lt;br /&gt;
*'''[[Microduino-Core/zh]]'''&lt;br /&gt;
*'''[[Microduino-USBTTL/zh]]'''&lt;br /&gt;
&lt;br /&gt;
*其他硬件设备&lt;br /&gt;
**USB数据连接线   一根&lt;br /&gt;
**面包板跳线        一盒&lt;br /&gt;
**LED灯       		两个&lt;br /&gt;
**1K欧姆电阻       两个&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==介绍==&lt;br /&gt;
&lt;br /&gt;
一般情况下，处理 Microduino的多个任务，是把所有任务放在 void loop() 里，然后用 delay() 控制时间。不过，任务一多，这种方法就不太方便了。&lt;br /&gt;
&lt;br /&gt;
《时间触发嵌入式系统设计模式》，里面介绍的调度器，可以以特定的周期执行特定的任务，值得在 Microduino项目中借鉴。&lt;br /&gt;
&lt;br /&gt;
出处：http://blanboom.org/arduino-task-scheduler-library.html&lt;br /&gt;
&lt;br /&gt;
==原理图==&lt;br /&gt;
&lt;br /&gt;
[[File:MicroduinoMultiThreadSchematic.png|600px|center|thumb]]&lt;br /&gt;
&lt;br /&gt;
==程序==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    // Blink LEDs on digital pin 12 and 13&lt;br /&gt;
&lt;br /&gt;
    #include &amp;quot;TaskScheduler.h&amp;quot;  // include this file to use this library&lt;br /&gt;
&lt;br /&gt;
    // the state of LEDs&lt;br /&gt;
    boolean g_led1State=1;&lt;br /&gt;
    boolean g_led2State=0;&lt;br /&gt;
&lt;br /&gt;
    void setup()&lt;br /&gt;
    {&lt;br /&gt;
        pinMode(13,OUTPUT);&lt;br /&gt;
        pinMode(12,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
        Sch.init();  // Initialize task scheduler&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * use Sch.addTask(task, start_time, period, priority) to add tasks&lt;br /&gt;
         * task - tasks to be scheduled&lt;br /&gt;
         * start_time - when the task starts (ms)&lt;br /&gt;
         * period - repeat period of the task (ms)&lt;br /&gt;
         * priority - 1: mormal priority, 0: high priority&lt;br /&gt;
         */&lt;br /&gt;
        Sch.addTask(led1Update,0,1000,1);  //从第 0 毫秒开始闪烁 LED，每隔 1s, LED 状态改变一次&lt;br /&gt;
        Sch.addTask(led2Update,20,500,1);  //从第 20 毫秒开始闪烁 LED，每隔 0.5s, LED 状态改变一次&lt;br /&gt;
&lt;br /&gt;
        Sch.start();  // Start the task scheduler&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void loop()&lt;br /&gt;
    {&lt;br /&gt;
        Sch.dispatchTasks();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Put task to be scheduled below&lt;br /&gt;
&lt;br /&gt;
    // Blink LED on pin 13&lt;br /&gt;
    void led1Update()&lt;br /&gt;
    {&lt;br /&gt;
        if(g_led1State==0)&lt;br /&gt;
        {&lt;br /&gt;
            g_led1State=1;&lt;br /&gt;
            digitalWrite(13,HIGH);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            g_led1State=0;&lt;br /&gt;
            digitalWrite(13,LOW);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Blink LED on pin 12&lt;br /&gt;
    void led2Update()&lt;br /&gt;
    {&lt;br /&gt;
        if(g_led2State==0)&lt;br /&gt;
        {&lt;br /&gt;
            g_led2State=1;&lt;br /&gt;
            digitalWrite(12,HIGH);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            g_led2State=0;&lt;br /&gt;
            digitalWrite(12,LOW);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==调试==&lt;br /&gt;
&lt;br /&gt;
步骤一：&lt;br /&gt;
&lt;br /&gt;
下载多线程函数库：[[https://github.com/blanboom/Arduino-Task-Scheduler TaskScheduler]] 复制到IDE的libraries文件夹中，重启IDE.&lt;br /&gt;
&lt;br /&gt;
步骤二：&lt;br /&gt;
&lt;br /&gt;
按照原理图搭建电路图&lt;br /&gt;
[[File:MicroduinoMultiThreadConnected.png|600px|center|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
步骤三：&lt;br /&gt;
&lt;br /&gt;
下载代码并运行&lt;br /&gt;
&lt;br /&gt;
==结果==&lt;br /&gt;
&lt;br /&gt;
程序执行后，两个 LED 分别会以程序中指定的周期和时间闪烁。&lt;br /&gt;
&lt;br /&gt;
==更多功能介绍==&lt;br /&gt;
&lt;br /&gt;
1. 添加抢占式任务&lt;br /&gt;
&lt;br /&gt;
抢占式任务，简单说，就是优先级比正常任务（合作式任务）高的任务。在这个调度器中，抢占式任务可以打断正常任务，优先执行。&lt;br /&gt;
&lt;br /&gt;
对于一些对时间精度要求较高的任务，可以将任务模式改为抢占式。&lt;br /&gt;
&lt;br /&gt;
修改方法：&lt;br /&gt;
&lt;br /&gt;
在添加任务的函数 Sch.addTask(任务名称,开始时间,执行周期,1) 函数中，将最后一个参数由 1 改为 0，即：&lt;br /&gt;
&lt;br /&gt;
Sch.addTask(任务名称,开始时间,执行周期,1)&lt;br /&gt;
&lt;br /&gt;
这样，该任务就成了抢占式任务。&lt;br /&gt;
&lt;br /&gt;
2. 添加单次执行的任务&lt;br /&gt;
&lt;br /&gt;
可以添加只执行一次的任务，在一段时间后执行。&lt;br /&gt;
&lt;br /&gt;
只需把 Sch.addTask(任务名称,开始时间,执行周期,1) 中的执行周期改为 0 即可。&lt;br /&gt;
&lt;br /&gt;
3. 删除任务&lt;br /&gt;
&lt;br /&gt;
使用函数 Sch.addTask(任务名称,开始时间,执行周期,1) 时，会返回这个任务的 ID，将这个 ID 赋给一个变量。需要删除任务时，用删除任务函数 Sch.DeleteTask(任务ID) ，就能把任务删除。&lt;br /&gt;
&lt;br /&gt;
4. 调整被调度的任务数量&lt;br /&gt;
&lt;br /&gt;
打开 TaskScheduler.h，找到 #define MAX_TASKS (10) ，将 10 修改为需要被调度的任务的数量。&lt;br /&gt;
&lt;br /&gt;
5. 自动进入空闲模式&lt;br /&gt;
&lt;br /&gt;
这个调度器能在没有任务的情况下自动进入空闲模式，以节省电量。不需要对程序进行其他修改。&lt;br /&gt;
&lt;br /&gt;
6. 错误报告&lt;br /&gt;
&lt;br /&gt;
打开 TaskScheduler.h，找到&lt;br /&gt;
&lt;br /&gt;
//#define REPORT_ERRORS // Remove “//“ to enable error report，&lt;br /&gt;
&lt;br /&gt;
将前面的 // 去掉，打开错误报告功能。&lt;br /&gt;
&lt;br /&gt;
然后，这条语句的下面，定义了相关错误代码，可根据情况修改。&lt;br /&gt;
&lt;br /&gt;
最后，打开 TaskScheduler.cpp，找到函数 void Schedule::_reportStatus(void)，在里面添加合适的错误报告代码即可。&lt;br /&gt;
&lt;br /&gt;
欢迎大家对这个调度器进行测试，找出 bug 和需要优化的地方。&lt;br /&gt;
&lt;br /&gt;
==视频==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Radiumray9@gmail.com</name></author>	</entry>

	</feed>