初级会员
- 积分
- 50
- 金钱
- 50
- 注册时间
- 2013-5-30
- 在线时间
- 0 小时
|
楼主 |
发表于 2013-12-26 20:23:46
|
显示全部楼层
回复【4楼】冰封嗜魔:
---------------------------------
你好!我有个疑问,刚才试了下用删除创建任务来达到我的目的,我是 把 你用的flag 更改成了消息邮箱,每次删除的时候 ,第一次按下按键,led灯不闪烁,按下第二次时候才闪烁,不知道为什么,用 flag 就可以了,我把代码贴下,麻烦你你帮我看下,
//控制DS0的亮灭.
void TaskLed(void *pdata) //优先级为6
{ u8 result=0;
while(1)
{ result= *((u8 *)OSMboxPend(Str_Box,0,&err)); //请求消息邮箱
if(result ==3)
{
LED0=!LED0;
OSTaskDel(LED1_TASK_Prio); //删除那个闪烁的任务
LED1=1; //让闪烁的那个LED灭掉
}
OSTimeDlyHMSM(0,0,0,2);
}
}
//任务2
//控制DS1的亮灭.
void TaskLed1(void *pdata) //优先级 为5
{ u8 result=0;
u8 i;
while(1)
{ // result= *((u8 *)OSMboxPend(Str_Box,0,&err));//请求消息邮箱
// if(result ==2)
if(flag) //在这里如果要是用 上面的消息邮箱的话,第一次按下按键不闪烁
{
for(i=0;i<6;i++)//led闪烁三次
{
LED1=!LED1;
OSTimeDlyHMSM(0,0,0,400);
}
flag = 0;
}
OSTimeDlyHMSM(0,0,0,1);
}
}
//任务3
//按键检测
void TaskKey(void *pdata)
{
u8 key=0,i=0;
while(1){
key=KEY_Scan();
if(key==1)
{
i=1;
OSMboxPost(Str_Box,&i); //发送消息1
}
else if(key==2)
{
i=2;
OSTaskCreate(TaskLed1, (void * )0, (OS_STK *)&TASK_LED1_STK[LED1_STK_SIZE-1], LED1_TASK_Prio);
flag = 1;
// OSMboxPost(Str_Box,&i); //发送消息2
}
else if(key==3)
{
i=3;
OSMboxPostOpt(Str_Box,&i,OS_POST_OPT_BROADCAST); //向所有任务广播消息3
}
OSTimeDlyHMSM(0,0,0,20);
}
}
这是为什么呢?像传输按键这种信息,是不是没必要 用消息邮箱呢?
还有个问题就是 在原子这个例程里,当有两个任务在等待消息邮箱时候,为什么只让高优先级的任务收到消息,低优先级和高优先级里等待的内容不一样,像上面那个例子一个i = 1,一个i=2,为什么这块要这样设计呢? |
|