当前位置: 代码迷 >> 单片机 >> 基于uc/os2的ARM7讯息队列多任务实现
  详细解决方案

基于uc/os2的ARM7讯息队列多任务实现

热度:39   发布时间:2016-04-28 15:52:33.0
基于uc/os2的ARM7消息队列多任务实现
想请教一下,LED这个任务,在接收到第一次消息以后LED开始闪烁,他是闪烁一次等待下一次消息然后熄灭呢,还是一直闪烁等待下一次消息然后熄灭呢,麻烦给解释一下;如果是只闪烁一次,而我要它在下次消息到来之前一直闪烁,应该怎么去改呢
void TaskLED(void *pdata)
{
INT8U err;
INT16U *pd;
pdata=pdata;
TargetInit();
q=OSQCreate(msg,QSIZE);//创建消息队列
IO0DIR |=LED1;
While(1)
{
pd=( INT16U *)OSQPend(q,0,&err);//等待消息
IO0CLR=LED1;//LED亮
OSTimeDly(*pd/2);
IO0SET=LED1;//LED灭
OSTimeDly(*pd/2);
pd=( INT16U *)OSQPend(q,0,&err);//等待消息
IO0SET=LED1;//LED灭
OSTimeDly(*pd/2);
}
}

------解决方案--------------------
1、目前是等待消息闪烁一次,再等待消息熄灭,如何循环;
2、要实现循环闪烁的话,最好不要用OSQPend的写法,改用OSQAccept不会阻塞。
------解决方案--------------------
我没有认真看你的代码,但是感觉你的做法并不好。

UCOSII里面有可以传递消息内容的方式,我觉得传递消息内容过来比较好,比如希望LED闪烁,传递1,停止闪烁传递0.
LED任务接收到消息内容,软件识别,看看发过来的是什么,如果1启动LED闪烁,如果0,停止闪烁。
------解决方案--------------------
给个伪码:

LEDSTATE{FLASH, CLOSE}

任务里的
while (1)
{
if (Accept)
{
//有消息来
LEDSTATE = CLOSE;
}
ELSE
{
;
}

SWITCH (LEDSTATE)
{
CASE FLASH:
{
//闪
}
CASE CLOSE:
//你懂的

DEFAULT:
}
}