任务的状态-挂起和恢复

任务可以通过等待信号量和消息、延时函数使自己挂起,系统开始调度运行其它任务OSTaskSuspend(5)。当然也可以通过相应的函数是自己恢复OSTaskResume(5)

延时函数:通过短延时OSTimeDly(n)和长延时函数OSTimeDlyHMSM(h,m,s,m)(最长11天)系统进入调度,延时完成后返回继续执行,也可通过STimeDlyResume(n)不经过延时完成随时恢复执行。

信号量:

1创建:OS_EVENT *sem=OSSemCreate(n) //参数n(0~65535的值,不同的值代表不同的意义)

2等待: value=OSSemAccept(sem);   //查看资源是否可以使用,返回信号量的值
       OSSemPend(sem,timeout,&err);//等待接收信号 才往下执行.任务timeout代表等待timeout个信号量后还没得到信号量,自动恢复运行状态,如果    timeout=0,表示无限等待信号量;   

3发送:OSSemPost(sem);//发送信号量

邮箱:用于任务间大数据量(共享数据)的数据传输。把一个指针定义的变量从一个任务传递到另一个或多个任务中去,等待邮箱的任务也是可以设置无限等待和等待若干个时钟节拍后任务自动恢复执行。

1创建:OS_EVENT * Come=OSMboxCreate((void *)0);//建立邮箱

2发送: u16 buffer="0x0FFF";//要发送的信息

    OSMboxPost(Come,&buffer);//通过邮箱发送信息(指针)给任务

3接收:u16 msg=OSMboxPend(Come,timeout,&err);//从指定邮箱com中获得信息指针即(指针msg指向buffer),若timeout=0为阻塞式,非0表示等待固定时钟周期后自动运行。

消息队列:其实是多个邮箱的数组,可以看做是个指针数组。用于处理有序的事件。

OS_EVENT *Com1 //定义一个指针

void *ComMsg1[3]; //定义一个指针数组

1创建:Com1=OSQCreate(&ComMsg1[0],3);//建立一个消息队列,即创建一个指针数组。(将数组指针的首地址赋值给com1) ,队列的个数为3

2发送: OSQPost(Com1,(void*)&st[0]);          //发送到队列即 *ComMsg1[0]指向数组st的首地址,同时队列消息数加一
       OSQPost(Com1,(void*)&aa[0]);         //发送到队列 
       OSQPost(Com1,(void*)&a1);             //发送到队列 

2接收: void *msg1=OSQPend(Com1,0,&err);获得指针数组里的第一个指针ComMsg1[0],该指针指向st[0].每调用一次OSQPend函数,该函数会将队列的消息减1,Com1指向下一个消息指针*ComMsg1[i++]。

 

posted on 2015-03-19 16:40  杰瑞鼠  阅读(712)  评论(0编辑  收藏  举报