Chinaunix首页 | 论坛 | 博客
  • 博客访问: 135194
  • 博文数量: 35
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 289
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-21 20:39
文章分类

全部博文(35)

文章存档

2010年(35)

我的朋友

分类: 嵌入式

2010-07-10 21:47:14

操作系统中一般都有一个延时函数,例如 os_delay(int cunts).
在protothreads如何实现和操作系统中的延时函数类似的函数呢。
/***************************************************************************/
//定时到返回0,否则返回1
unsigned int delay_expired(DELAY_STRUCT *t)
{
 if(t->start)
 {
  if(!(t->interval))
   t->start = 0;
 }
 return t->start;
}
/*---------------------------------------------------------------------------*/
void delay_set(DELAY_STRUCT *t, int usecs)
{
 t->start = 1;
 t->interval = usecs;
}
/***************************************************************************/
 
在使用定时之前要用delay_set()来初始化。其中参数DELAY_STRUCT *t是定义线程用的结构体,
int usecs为需要延时的节拍数。在定时中断程序中加入对t->interval进行递减的函数,
之后调用protothreads宏PT_WAIT_WHILE(pt,delay_expired(&led_delay));来判断时间是否到?
判断的依据就是t->interval是否递减到0,时间到了就继续向下执行程序,否则阻塞(也就是函数返回了)
闪烁LED的线程如下:
static int thread_led(struct pt *pt)
{
  PT_BEGIN(pt);
 //-------------------------------------------------------------------------
 delay_set(&led_delay,500);
 PT_WAIT_WHILE(pt,delay_expired(&led_delay));
 
 LPC_GPIO0->DATA |=  0x08;
 delay_set(&led_delay,500);
 PT_WAIT_WHILE(pt,delay_expired(&led_delay)); 
 
 LPC_GPIO0->DATA &=  ~0x08;
 
 //-------------------------------------------------------------------------
  PT_END(pt);
}
编译->debug,呵呵,LED灯闪起来了。不错!
阅读(1298) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~