利用 ProtoThreads实现Arduino多线程处理(1)

  • 时间:
  • 浏览:1

嵌入式操作系统是用来避免例如超烦的(划掉)多任务避免的情况汇报,常见的有uCos、RT-Thread等等,有兴趣的还时需去看看。

PT_TIMER_MICRODELAY(pt,延时微秒数);

好了,终于扩展完了。。

  分析一下中间的代码,就知道觉得ProtoThreads是利用switch case 来取舍运行点的,每个程序运行池中的堵塞,觉得或者判断条件算是成立,不成立则return,好多好多 说每个程序运行池都很有雷锋精神,舍己为人,呵呵。有一点要注意那就 是每个程序运行池没法够在亲戚亲戚村里人 歌词 村里人 歌词 指定的地方堵塞,至于堵塞点,那就要看具体应用了。   或者程序运行池是反复被调用的,或者,写程序运行池池的时候 没法像写一般的函数一样使用局部变量,或者每次重新调用前会把变量初始化了,或者要保持变量,还时需把它定义为static的   在pt.h中定义了好多好多 功能: PT_INIT(pt)   初始化任务变量,只在初始化函数中执行一次就行 PT_BEGIN(pt)   启动任务避免,倒进函数开使英语 英语 处 PT_END(pt)   开使英语 英语 任务,倒进函数的最后 PT_WAIT_UNTIL(pt, condition) 等待英文某个条件(条件还时需为时钟或其它变量,IO等)成立,或者直接退出本函数,下一次进入本     函数就直接跳到这一地方判断 PT_WAIT_WHILE(pt, condition)  和中间一俩个多一样,或者条件取反了 PT_WAIT_THREAD(pt, thread) 等待英文一俩个多子任务执行完成 PT_SPAWN(pt, child, thread) 新建一俩个多子任务,并等待英文其执行完退出 PT_RESTART(pt)   重新启动某个任务执行 PT_EXIT(pt)   任务中间的每项不执行,直接退出重新执行 PT_YIELD(pt)   锁死任务 PT_YIELD_UNTIL(pt, cond) 锁死任务并等待英文英文条件成立,恢复执行 在pt中一共定义有这一程序运行池情况汇报,在任务函数退出到上一级函数时返回其情况汇报 PT_WAITING  等待英文 PT_EXITED  退出 PT_ENDED  开使英语 英语 PT_YIELDED  锁死 比如PT_WAIT_UNTIL(pt, condition) ,通过改变condition还时需运用的非常灵活,如结合定时器的库,把condition改为定时器溢出,那或者个时间触发系统了,再把condition改为一点条件,或者事件触发系统了 暂时写没法多吧

版权问题:ProtoThreads的基本代码是由Adam Dunkels编写了,详情请看Readme.md,我此人 只扩展了pt-timer.h这一一俩个多库。转载及使用ProtoThreads的基本代码请遵循Adam Dunkels的声明。转载及使用我写的pt-timer.h请署名“逍遥猪葛亮”。

又说完啦~就哪几种~

void setup() {

PT_TIMER_DELAY(pt,延时毫秒数);

//首先启用定时器库和信号量库,下面会用到

或者不太懂ProtoThreads内内外部底部形态,就只改任务名好了,或者就原来写。PT_BEGIN(pt);一定要在开头,PT_END(pt);一定要在结尾,别漏,或者编译错误,运行到这里的时候 这一任务就彻底开使英语 英语 了。

任务要开百公里车出来:

或者!!有缺点!!亲戚村里人 歌词 村里人 歌词 说过了,它利用了switch一段话的底部形态,好多好多 ,我非常不建议在任务中使用switch这一一段话,除非你能保证在你的switch一段话内无需切换任务。其次,请慎用内内外部变量,尤其是循环变量,在切换任务时有一定的或者性居于不可预料的错误,要用,请一定加带static修饰。

        这几天和群里小V同学讨论一俩个多项目时,偶然发现了 ProtoThreads,简称PT,用其来实现arduino的程序运行池池控制很方便。这里摘录几篇介绍的文章。

讲完,下面讲讲为什么在么在用。

下面是一点等待英文有这一信号所用到的宏:(每项,我没法完整性讲,只挑了一点常用的,有兴趣的还时需此人 看源代码)

        本文章只做备忘记录使用,这几天和V同学做的项目中用到了这一库,这里受项目未公开导致 ,就不贴出原代码了。

看中间的代码,让我发现好多好多 大写的函数,觉得哪几种前会 些宏定义(宏定义用大写是约定俗成的..),或者把哪几种宏都展开你就能更好的理解他的原理了:

PT_WAIT_THREAD(pt,任务x名);

我不得不解释一俩个多专业术语,或者这二货很有用(信号量:你才二)……

5、信号量(Semaphore)

四、库的下载地址   http://pan.baidu.com/s/1qYRg9T6。

或者要用啦。任务要停百公里车进去:

3、任务准备工作

这一xxx亲戚亲戚村里人 歌词 村里人 歌词 此人 取好了。下面的完整性前会 xxx。请一定要加带前面的static struct。

接着请在setup()函数中间给它初始化:

程序运行池池为什么在么在写?晕了没?

妹子求别走T_T

比如说,去抖的时候 ,或者直接用delay(40)一段话,那数码管的5ms刷新为什么在么在办?串口收到的数据办?

我不上定义了,直接用例子说,前会 我科学科学发明的例子。

ServoMove呢或者此人 模拟出来的舵机函数,为哪几种无需servo库呢?或者arduino自身的servo库有好多好多 限制,第一PWM没法用了,第 二最小深度没法1度,当然这一程序运行池池里舵机的精度也是1度,或者把相应的变量改成float就能精确到小数了,不过最大的好处是舵机脚还时需任意设定

servomove中限定了最大深度为155度,这一与舵机有关 angleRead中使用了stringtoInt,每次还时需输入一俩个多深度,深度还时需以 空格 或 回车 结尾(操蛋的VC2010 SerialMonitor发送数据不带 回车的。。那就空格了) 程序运行池池中使用了定时器,此人 用C++写的,第一次写库,照葫芦画瓢了。。。 感谢czad的扩展库翻译http://www.geek-workshop.com/forum.php?mod=viewthread&tid=184 这一库用起来非常简单: PT_Timer t;//定义一俩个多定时器 t.setTimer(unsinged long time) //定时时间,单位ms t.Expired()//判断定时器算是溢出,是返回值>0 在中间的代码中,一俩个多舵机周期是20ms,前面的约2.5毫秒是信号周期,剩下的10多ms前会 无用的低电平,然而又必不可少,好多好多 果断用定时器取代delay

     先上一段简单的代码look look

对,信号量也是原来用。得到了一俩个多信号量,任务继续运行,得没法,一边呆着去。

哎!别走!!!妹子等亲戚村里人 歌词 村里人 歌词 说完,我不打算讲高深理论哎!!(旁白:反正你也前会 这一专业的,也讲找不到)

下面是用法:

7、后记

此段代码演示了要怎样使用PT库来实现12、13脚led分别隔1秒、5秒闪烁,或者在arduino09上测试通过

sorry,无注释。。别急,这或者个演示这篇文章会不断更新,分别讲述PT库的原理和应用让亲戚亲戚.让我开发出更繁复的程序运行池池好介绍开使英语 英语 了~Protothread是专为资源有限的系统设计的有这一耗费资源有点儿少或者不使用堆栈的程序运行池模型,其特点是:  ◆ 以纯C语言实现,无硬件依赖性;  ◆ 极少的资源需求,每个Protothread仅时需一俩个多额外的字节;  ◆ 还时需用于有操作系统或无操作系统的场合;  ◆ 支持阻塞操作且没法栈的切换。使用Protothread实现多任务的最主要的好居于于它的轻量级。每个Protothread不时需拥有自已的堆栈,所有的Protothread 共享同一俩个多堆栈空间,这一点对于RAM资源有限的系统尤为有利。相对于操作系统下的多任务而言,每个任务前会 自已的堆栈空间,这将消耗几瓶的RAM资源, 而每个Protothread仅使用一俩个多整型值保存当前情况汇报。  咱们来结合一俩个多最简单的例子来理解ProtoThreads的原理吧,就拿中间的闪烁灯代码来说

PT_WAIT_UNTIL(pt,条件);

4、编写任务

觉得信号量这货避免的问题中,比较出名的是生产者与消费者问题。简单地说,消费者要买,时需要生产者生产里能买到,没生产出来,消费者没法等。

三、MALC还做了个带定时器的库http://www.geek-workshop.com/thread-666-1-1.html

先说明一下,下面的定时不一定完整性准确的,或者会有点儿点的误差,或者偏后。或者遇上了很烦的任务,有或者会使延深度后。或者正常情况汇报下,直接用就好了。

停车场。停车。停车场中间的车位是固定的,假设没法百公里车占多个车位的情况汇报。在这一情况汇报下,剩余车位数或者一俩个多“信号量”了。进一量车,剩余车位数就减一;出一量车,剩余车位数就加一。或者剩余车位数为0,没法想进来的车就没法在外面淋雨了。

       1楼、背景——

想象一俩个多原来的情况汇报,请何必 在意原来奇怪的情景——

首先,每个任务都时需要有一俩个多记录变量,记录任务的情况汇报,便于返回。一段话:

基于这一超烦的(划掉)多任务避免,为了编程方便,让亲戚亲戚村里人 歌词 村里人 歌词 祭出嵌入式操作系统这一一俩个多神器!!!

或者Arduino,编译一俩个多文件出来,或者你有留意一段话,体积很大,而arduino有这一的内存就不要 ,再移植一俩个多就Orz了。好多好多 ,中间说的,没法用!!!哎!别走啊喂!!!

欢迎转载、使用、修改等等,提一提“逍遥猪葛亮”我会很高兴的。百度Arduino吧中间的是我写的,好多好多 不居于非法克隆粘贴的问题吧?

或者要很精确的延时,请用delay一段话或者计时器,或者,绝大多数情况汇报下,绝大多数情况汇报!绝大多数情况汇报!请用下面的一段话代替delay延时!原来里能把CPU让给别的任务使用。

ProtoThreads在较大程度上实现出操作系统的核心功能,或者,每个新建一俩个多任务,只需额外增加16bit即一俩个多字节的空间(引入我的定时器宏则为6个字节)。除了核心功能外,还增加了信号量、延时这一一俩个多功能(仅限于我提供的库),我最少想到消息队列、标志为什么在么在写了,或者没空写(旁白:觉得是懒吧?)。

PT_EXIT(pt);

操作系统最核心的功能是:等待英文英文某个事件居于的时候 ,比如说定时一段时间、算是按键、串口上算是数据等等,操作系统帮你将单片机从当前的任务中临时切换到原来任务运行,直到指定事件居于了再回来接着运行,原来或者变相实现了多任务避免,节省了CPU时间,还极大地减少开发难度(我会说我学过嵌入式系统后就再或者想做流水线式的设计多会儿?)。

当然,对于一俩个多任务来说,信号量没上限,或者说,让我在停车场内再开辟新的车位,不断用PT_SEM_SIGNAL()就好了。

鉴于亲戚亲戚村里人 歌词 村里人 歌词 做些小作品,不时时需到没法高深的操作系统,或者简单居于理一下哪几种多任务的问题,好多好多 ,让亲戚亲戚村里人 歌词 村里人 歌词 祭出Adam Dunkels大神的ProtoThreads!

6、例子

PT_SEM_INIT(&sem_LED,1); //初始化信号量为1,即没法用

ProtoThreads是一俩个多通过宏(#define)写出来的神奇的模拟程序运行池池(理解成多任务先)的库,中间前会 头文件,找没法.cpp等程序运行池池文件。它的核心利用了C语言switch一段话的底部形态。说是嵌入式系统,但这觉得还而算是一俩个多调度器,好多好多 ,何必 能说是一俩个多完整性的操作系统。

PT_YIELD(pt);

函数格式如下:

PT_RESTART(pt);

原来就初始化成功啦~记得要加个&符号。(一定要哦~)

二、以下转自http://www.geek-workshop.com/forum.php?mod=viewthread&tid=610&extra=page%3D1

一、以下转自http://www.arduino.cn/thread-5833-1-1.html

或者避免过程一般是循环避免的,好多好多 避免过程一般是while(1){避免内容},作用就像loop(){}函数啦。

PT_TIMER_WAIT_TIMEOUT(pt,条件,毫秒数);

//这是LED快速闪烁的任务,或者有串口消息,快速闪5次

每个任务在程序运行池池中间,而算是一俩个多独立函数,在中间避免我还时需做的东西就还时需啦。

亲戚亲戚村里人 歌词 村里人 歌词 翻了没法久都累了伐……给个例子呗……

PT_WAIT_WHILE(pt,条件);

首很难创建一俩个多信号量,这一一定是全局变量:

具体有哪几种用呢?比如说,一楼写着的,监控串口的任务读到数据了,要占用数码管。没法亲戚亲戚村里人 歌词 村里人 歌词 命令一俩个多信号量为土豪,土豪没法一俩个多。每次矩阵键盘要显示数据,先申请一俩个多土豪,写数据,或者释放土豪,或者申请没法就在墙角不断画圈圈。监控串口的任务一旦申请到土豪就劫持1s,无需矩阵键盘用。原来就还时需达到要求啦~

好,或者要初始化一俩个多任务。在setup()函数中间用这一一段话:

(下面的是定时器,该宏是我此人 写的,用时候 请在#include "pt.h" 的前面,前面啊!加带一句#define PT_USE_TIMER)