uCOSV286应用.docx
《uCOSV286应用.docx》由会员分享,可在线阅读,更多相关《uCOSV286应用.docx(11页珍藏版)》请在冰点文库上搜索。
uCOSV286应用
uCOSV2.86应用手册
一、功能简介
1.互斥信号量
2.事件标志组
3.信号量
4.消息邮箱
5.消息队列
6.软件定时器
二、互斥信号量—MUTEX
1.简介
是一种二值信号量,标记着临界资源的独占处理,当有任务独占该资源时,其他任务则必须等待该资源被释放。
2.声明互斥信号量
OS_EVENT*mutex;
3.创建互斥信号量
mutex=OSMutexCreate(5,&err);//5是优先级,err是错误代码返回
4.发送互斥信号量
OSMutexPost(mutex);
5.接收互斥信号量
OSMutexPend(mutex,0,&err);
6.删除互斥信号
OSMutexDel(mutex,OS_DEL_NO_PEND,&err);
7.例程
当Led0Task执行第71行时,放弃cpu控制权,Led1Task也不能执行,因为Led0Task未发送互斥信号量,Led1Task无法执行临界段代码,所以只有当Led0Task执行完毕发送互斥信号量之后,Led1Task接收到才能执行93~97行。
三、事件标志组—FLAG
1.简介
等待多个事件同步或异步的一种方法,事件标志组是一个一个二值信号。
2.声明事件标志组
OS_FLAG_GRP*flag;
3.创建事件标志组
flag=OSFlagCreate(0,&err);//初始值为0
4.发送事件标志组
OSFlagPost(flag,0x01,OS_FLAG_SET,&err);
OSFlagPost(flag,0x02,OS_FLAG_SET,&err);
把bit0(0x01)和bit1(0x02)置位(OS_FLAG_SET或OS_FLAG_CLR)
5.接收事件标志组
OSFlagPend(flag,0x03,OS_FLAG_WAIT_SET_ALL|OS_FLAG_CONSUME,0,&err);
事件标志组指针、等待的位为bit0和bit1(0x03)、同步等待和得到期望的标志位后,恢复相应的标志位、不等待、错误标志。
6.删除事件标志组
OSFlagDel(flag,OS_DEL_ALWAYS,&err);
7.例程
AddTask每过5s发一次事件,KeyTask每次按下按键发送一次事件。
LcdTask等待两个事件都发生时才做出处理。
这里要明白是都发生了,而不是同时发生。
四、信号量—SEM
1.简介
信号量是0~65535的值,每次发送信号量,其信号量值加1,每次接收信号量,则信号量值减1,当信号量值为0、且接收时,则会等待。
2.声明信号量
OS_EVENT*sem;
3.创建信号量
sem=OSSemCreate(0);//0是初值,也可以为1
4.发送信号量
OSSemPost(sem);
5.接收信号量
OSSemPend(sem,0,&err);
6.删除信号量
OSSemDel(sem,OS_DEL_ALWAYS,&err);
7.例程
83、84发送两次信号量,LcdTask和BeepTask先后接收并响应。
如果只发送一次,则先进入运行态的任务接收。
五、消息邮箱—MBOX
1.简介
发送一个unsignedint类型的变量。
2.声明消息邮箱
OS_EVENT*mbox;
3.创建消息邮箱
mbox=OSMboxCreate((void*)0);//初始时消息邮箱值为空,也可不为空。
4.发送消息邮箱
OSMboxPost(mbox,(void*)count);//发送一个uint类型的值
5.接收消息邮箱
tcount=(unsignedint)OSMboxPend(mbox,0,&err);
6.删除详细邮箱
OSMboxDel(mbox,OS_DEL_NO_PEND,&err);
7.例程
太简单,不用多解释。
六、消息队列—Q
1.简介
类似消息邮箱,只不过可以发送多组值,类似发送一个数组指针,可以直接使用。
2.声明消息队列
OS_EVENT*qmsg;
void*qMsgGrp[2];//消息队列指针
3.创建消息队列
qmsg=OSQCreate(&qMsgGrp[0],2);//队列第一个成员的首地址指针和数量
4.发送消息队列
OSQPost(qmsg,(void*)&xyPos[0]);//待发送队列数组第一个成员的首地址。
5.接收消息队列
xyPos=OSQPend(qmsg,0,&err);//指针指向发送过来的消息队列
6.删除消息队列
OSQDel(qmsg,OS_DEL_ALWAYS,&err);
7.例程
类似消息邮箱,简单,不解释。
七、软件定时器
1.简介
和硬件定时器类似,设置周期,回调函数,回调函数内可处理一些用户代码。
2.声明软件定时器
OS_TMR*tmr;//注意要在os_cfg.h最下边使能软件定时器。
3.创建软件定时器
tmr=OSTmrCreate(1,100,OS_TMR_OPT_PERIODIC,(OS_TMR_CALLBACK)timer1CallBack,0,"tmr1",&err);
参数1:
第一次定时的时间。
参数2:
周期循环时的时间间隔。
参数3:
OS_TMR_OPT_PERIODIC周期定时
OS_TMR_OPT_ONE_SHOT单次定时
参数4:
回调函数指针。
参数5:
回调函数参数。
参数6:
定时器名字(启动和停止时需要用到)。
参数7:
返回的错误代码。
4.启动软件定时器
OSTmrStart(tmr1,&err);
5.停止软件定时器
OSTmrStop(tmr1,OS_TMR_OPT_NONE,0,&err);
6.回调函数
voidtimer1CallBack(OS_TMR*ptmr,void*p_arg)
{
tcount++;
}
7.重点讲解
OS_TMR_CFG_TICKS_PER_SEC这个参数
单位是HZ,这里是100,就是100hz,理论上是以10ms为周期乘以软件定时器创建时的前两个参数作为软件定时器的溢出时间。
这里就是10msx100=1000ms=1s。
如果是OS_TMR_CFG_TICKS_PER_SEC是10,那么就是100msx100=10000ms=10s。
但是最大精度是ucos的时钟节拍,这里是200,也就是说即使前两个参数为都为1,最快溢出时间也只能是5ms。