一个LED的N种玩法--多线程

Author: chenzhufly

Email: chenzhufly@126.com

2010-05-04


这篇我将来玩玩多线程操作,体会一下其中的乐趣。实际上这也不能严格意义上称为多线程,只不过封装的比较好,感觉和多线程差不多,可以实现多任务而已。不过这还是需要您深入的研究才会明白的。欢迎您深入研究,欢迎您分享您的心得! Let’s  go……………………….




一. 为什么需要用多线程


个人感觉是代码清晰,具有层次感,可读性强,增加任务或删减任务都很方便。JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ




二. 为什么选择Protothreads


Protothrcads是由瑞典计算机科学研究所的科学家Adam Dunkels所创的一种新的线程编程方法。特别适用于资源受限的系统,非常适合我们的LPC1343,呵呵,这也是我选择它的原因。


 


欲了解详情,请访问主页:http://www.sics.se/~adam/pt/  同时可下载相关源码!先介绍一下Protothreads吧,然大家有个直观的认识。




Protothreads具有的特性:


1.    Very small RAM overhead - only two bytes per protothread and no extra stacks


非常少的RAM资源,每个Protothread仅需要2个字节,没有额外的栈


2.    Highly portable - the protothreads library is 100% pure C and no architecture specific assembly code


很强的移植性 -  protothreads库以纯C语言实现,无硬件依赖性


3.    Can be used with or without an OS


可以用于有操作系统或无操作系统的场合


4.     Provides blocking wait without full multi-threading or stack-switching


支持阻塞操作且没有栈的切换




Protothreads的典型应用:


1.    Memory constrained systems


内存紧张的系统


2.    Event-driven protocol stacks


时间驱动型协议栈,比如著名的uIP使用的就是Protothreads协议栈


3.    Small embedded systems


小的嵌入式系统


4.    Sensor network nodes


传感器网络节点


5.    Portable C applications


具有移植性的c应用




接着我们从主页上下载pt-1.4.tar.gz并解压,目录结构如下图所示:




 

 6.1.jpg (28.53 KB)

2010-5-5 00:06


从目录中可以看出,主要是5个h文件:


lc-addrlabels.h : 以字符串方式实现Protothreads系统,占用的ram可能会多些


lc-switch.h :以标准C的switch结构实现Protothreads系统(默认)


lc.h :选择lc-addrlabels.h或lc-switch.h两种实现Protothreads系统


pt.h :在实际应用中一般只包含此文件就行了


pt-sem.h :附加的信号量操作的支持,不需要的话则不必包含他




其他三个是例子程序,可以作为系统设计很好的参考!




我在这里只不过只是点一个LED而已,所以理所当然的只包含了一个pt.h文件,代码结构如图所示:




 

 6.3.jpg (24.43 KB)

2010-5-5 00:06


这个时候如果点编译工程的话,会出错的,如下图所示; 怎么办呢LLLLLL


明明目录底下是有lc.h文件,为什么还说没有包含,气愤啊!!!




 

 6.2.jpg (63.99 KB)

2010-5-5 00:06






研究了半天发现,原来是忘了增加include路径,那么又怎么增加新的include路径呢?看到编译器右下角有个quick setting没?点它,出下以下界面。看到Include Paths没?呵呵,就是在这里设置!然后一切顺利。。。。J


 

 6.4.jpg (35.98 KB)

2010-5-5 00:06


经过简要的修改,编译下载,这个时候你就可以看到LED很欢快的闪起来啦!!


 


到这里还是简要的看看pt.h都实现了啥吧,具体的还是麻烦您自己去看看手册,哈哈!




pt.h中的宏定义:


PT_INIT(pt)     初始化任务变量,只在初始化函数中执行一次就行


PT_BEGIN(pt)   启动任务处理,放在函数开始处


PT_END(pt)     结束任务,放在函数的最后


PT_WAIT_UNTIL(pt, condition) 等待某个条件(条件可以为时钟或其它变量,IO等)如果成立,继续;否则直接退出本函数,下一次进入本 函数就直接跳到这个地方判断。


PT_WAIT_WHILE(pt, cond)    和上面一个一样,只是条件取反了


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-1.4中自带的example-small.c文件的基础上做的一些修改,主要是实现2个线程,一个线程做延时,一个线程做点LED操作。




#include "LPC13xx.h"


#include "gpio.h"


#include "config.h"


#include "pt.h"      //包含的头文件


static int protothread1_flag, protothread2_flag;


int i;


char j=0;




static int


protothread1(struct pt *pt) //线程1,完成LED操作,每进一次,IO取反


{


PT_BEGIN(pt); //开始线程


while(1) {


protothread2_flag = 0;


protothread1_flag = 1;


j= ~j;


GPIOSetValue( LED_PORT, LED_BIT, j );


}


PT_END(pt); //接触线程


}




static int


protothread2(struct pt *pt) //线程2,完成延时操作


{


PT_BEGIN(pt);




while(1) {


protothread2_flag = 1;


PT_WAIT_UNTIL(pt, protothread1_flag != 0); //等待条件


protothread1_flag = 0;


for(i=0;i<500000;i++);


}


PT_END(pt);


}




static struct pt pt1, pt2;


int


main(void)


{


GPIOInit();


GPIOSetDir( LED_PORT, LED_BIT, 1 );


PT_INIT(&pt1);     //初始化线程1


PT_INIT(&pt2);     //初始化线程2


while(1) {


protothread1(&pt1); //调用线程1


protothread2(&pt2); //调用线程2


}


}

一个LED的N种玩法--多线程相关推荐

  1. java编写一个彩票开奖的模拟程序.游戏共有两种玩法,一种是21选5,即玩家输入5个1到21内的不重复的数。另外一种玩法是6+1玩法,即要求玩家输入7个整数,代表所购买的彩票号码,最后一个是特码。

    java编写一个彩票开奖的模拟程序.游戏共有两种玩法,一种是21选5,即玩家输入5个1到21内的不重复的数.另外一种玩法是6+1玩法,即要求玩家输入7个整数,代表所购买的彩票号码,最后一个是特码. 具 ...

  2. jeecg集成积木报表错误_6688种玩法的电子积木,是什么体验?「中外玩具网测评」...

    听说聪明的孩子都玩过电子积木?一款玩具真的能有几千种玩法?你相信吗?让我们一起来寻找答案吧~ 大家好,中外玩具网编辑部开始做玩具测评啦~ 上个星期,我们收到了这款"电学小子"电子积 ...

  3. 【Microsoft Azure 的1024种玩法】二十九.基于Azure VM快速实现网络入侵检测 (IDS) 及网络安全监视 (NSM)

    [简介] 数据包捕获是一个重要组件,可以实施网络入侵检测系统 (IDS) 并执行网络安全监视 (NSM). 我们可以借助开源 IDS 工具来处理数据包捕获,并检查潜在网络入侵和恶意活动的签名. 使用网 ...

  4. 超级智能玩具《小小机器人》|全新50种玩法,创造力之源

    致砖<小小机器人>全新套装 电动+机械的完美结合 先来看看视频过过眼瘾吧 来自美国STEAM教育 让孩子跨学科学知识 积木向来是STEAM教育很重要的一部分,因为它涉及到了多种学科: 要搭 ...

  5. 超级智能玩具《小小机器人》首发|全新50种玩法,创造力之源

    致砖<小小机器人>套装全新首发 电动+机械的完美结合 先来看看视频过过眼瘾吧 来自美国STEAM教育 让孩子跨学科学知识 积木向来是STEAM教育很重要的一部分,因为它涉及到了多种学科: ...

  6. 【云计算的1024种玩法】10分钟轻松设置出 A+ 评分的 HTTP/2 网站

    前言 其实 HTTP/2 应该是 2015 年的老话题了(2015 年 5 月 14 日 HTTP/2 协议正式版的发布),但是 2018 年都到了很多网站依旧没有使用,作为新一代互联网协议,HTTP ...

  7. 线代中最基础的两种玩法

    线代中最基础的两种玩法 @(线性代数) 加法 乘法 由这两种最基础的做法可以发展出许多有意思的解题思路. 以可交换矩阵的论证为例. 可交换矩阵:AB=BA 一般有三类: 单位矩阵,或零矩阵 AE = ...

  8. 【kali Linux 的1024种玩法】一.在VMware Workstation上安装Kali Linux 2020.1(超详细!)

    [kali Linux 的1024种玩法]一.在VMware Workstation上安装Kali Linux 2020.1 一.下载Kali linux 2020.1 1.1 下载Kali Linu ...

  9. GPT-3的50种玩法告诉你,它很酷,但是没有通过图灵测试

    2020-07-31 01:42:19 作者 | 青 暮 编辑 | 丛 末 自从OpenAI开放GPT-3的API以来,不少人争相申请试用后获得了"门票",并相继在社交网络上推送自 ...

最新文章

  1. 查询服务器上几张显卡命令
  2. python中from import用法_python学习--Python之import与from...import的区别与用法
  3. 库克:到2030年苹果要实现整个供应链的碳中和
  4. python的线程组怎么写_Python高级——多任务编程之线程
  5. nas存储服务器 文件夹加密,NAS网络存储服务器储备数据的安全性怎么样?
  6. python获取类函数的变量-python 动态获取当前运行的类名和函数名的方法
  7. 关于浮动-float
  8. Delphi 实现多国语言
  9. Excel如何合并两个单元格内容
  10. 本地计算机如何使用代理服务器,自动设置代理ip
  11. 就业季必看的职业规划
  12. 手机无线如何共享给台式计算机,怎么把电脑网络共享给手机上网
  13. win10+RTX3050ti+TensorFlow+cudn+cudnn配置深度学习环境
  14. 计算机组成原理——计算机系统概述
  15. 苏大计算机学院在哪,苏州大学计算机技术学院导师介绍:纪其进
  16. 推荐几个经常发干货的公众号
  17. ai人工智能软件开发模式介绍
  18. Cisco Catalyst 3560-E系列交换机
  19. html 中的空格和nbps;
  20. html锚点定位不准确问题

热门文章

  1. (六) Linux的权限管理操作详细学习笔记
  2. C语言入门——阶乘运算(for循环)
  3. Linux系统调用:使用int 0x80
  4. 第1章 初识Photoshop
  5. 标签打印软件如何实现防伪标签套标排版
  6. flask上传文件至服务器,flask服务器文件上传云
  7. SVM支持向量机-核函数(6)
  8. 痞子衡嵌入式:我的博客园积分排名终于挤进了前3000名榜单
  9. Unity甜品消消乐--核心原理
  10. 基础模拟——花生问题 The Peanut