一个LED的N种玩法--多线程
一个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并解压,目录结构如下图所示:
从目录中可以看出,主要是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文件,代码结构如图所示:
这个时候如果点编译工程的话,会出错的,如下图所示; 怎么办呢LLLLLL
明明目录底下是有lc.h文件,为什么还说没有包含,气愤啊!!!
研究了半天发现,原来是忘了增加include路径,那么又怎么增加新的include路径呢?看到编译器右下角有个quick setting没?点它,出下以下界面。看到Include Paths没?呵呵,就是在这里设置!然后一切顺利。。。。J
经过简要的修改,编译下载,这个时候你就可以看到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种玩法--多线程相关推荐
- java编写一个彩票开奖的模拟程序.游戏共有两种玩法,一种是21选5,即玩家输入5个1到21内的不重复的数。另外一种玩法是6+1玩法,即要求玩家输入7个整数,代表所购买的彩票号码,最后一个是特码。
java编写一个彩票开奖的模拟程序.游戏共有两种玩法,一种是21选5,即玩家输入5个1到21内的不重复的数.另外一种玩法是6+1玩法,即要求玩家输入7个整数,代表所购买的彩票号码,最后一个是特码. 具 ...
- jeecg集成积木报表错误_6688种玩法的电子积木,是什么体验?「中外玩具网测评」...
听说聪明的孩子都玩过电子积木?一款玩具真的能有几千种玩法?你相信吗?让我们一起来寻找答案吧~ 大家好,中外玩具网编辑部开始做玩具测评啦~ 上个星期,我们收到了这款"电学小子"电子积 ...
- 【Microsoft Azure 的1024种玩法】二十九.基于Azure VM快速实现网络入侵检测 (IDS) 及网络安全监视 (NSM)
[简介] 数据包捕获是一个重要组件,可以实施网络入侵检测系统 (IDS) 并执行网络安全监视 (NSM). 我们可以借助开源 IDS 工具来处理数据包捕获,并检查潜在网络入侵和恶意活动的签名. 使用网 ...
- 超级智能玩具《小小机器人》|全新50种玩法,创造力之源
致砖<小小机器人>全新套装 电动+机械的完美结合 先来看看视频过过眼瘾吧 来自美国STEAM教育 让孩子跨学科学知识 积木向来是STEAM教育很重要的一部分,因为它涉及到了多种学科: 要搭 ...
- 超级智能玩具《小小机器人》首发|全新50种玩法,创造力之源
致砖<小小机器人>套装全新首发 电动+机械的完美结合 先来看看视频过过眼瘾吧 来自美国STEAM教育 让孩子跨学科学知识 积木向来是STEAM教育很重要的一部分,因为它涉及到了多种学科: ...
- 【云计算的1024种玩法】10分钟轻松设置出 A+ 评分的 HTTP/2 网站
前言 其实 HTTP/2 应该是 2015 年的老话题了(2015 年 5 月 14 日 HTTP/2 协议正式版的发布),但是 2018 年都到了很多网站依旧没有使用,作为新一代互联网协议,HTTP ...
- 线代中最基础的两种玩法
线代中最基础的两种玩法 @(线性代数) 加法 乘法 由这两种最基础的做法可以发展出许多有意思的解题思路. 以可交换矩阵的论证为例. 可交换矩阵:AB=BA 一般有三类: 单位矩阵,或零矩阵 AE = ...
- 【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 ...
- GPT-3的50种玩法告诉你,它很酷,但是没有通过图灵测试
2020-07-31 01:42:19 作者 | 青 暮 编辑 | 丛 末 自从OpenAI开放GPT-3的API以来,不少人争相申请试用后获得了"门票",并相继在社交网络上推送自 ...
最新文章
- 查询服务器上几张显卡命令
- python中from import用法_python学习--Python之import与from...import的区别与用法
- 库克:到2030年苹果要实现整个供应链的碳中和
- python的线程组怎么写_Python高级——多任务编程之线程
- nas存储服务器 文件夹加密,NAS网络存储服务器储备数据的安全性怎么样?
- python获取类函数的变量-python 动态获取当前运行的类名和函数名的方法
- 关于浮动-float
- Delphi 实现多国语言
- Excel如何合并两个单元格内容
- 本地计算机如何使用代理服务器,自动设置代理ip
- 就业季必看的职业规划
- 手机无线如何共享给台式计算机,怎么把电脑网络共享给手机上网
- win10+RTX3050ti+TensorFlow+cudn+cudnn配置深度学习环境
- 计算机组成原理——计算机系统概述
- 苏大计算机学院在哪,苏州大学计算机技术学院导师介绍:纪其进
- 推荐几个经常发干货的公众号
- ai人工智能软件开发模式介绍
- Cisco Catalyst 3560-E系列交换机
- html 中的空格和nbps;
- html锚点定位不准确问题