UCOS II 中信号量的使用
1、声明信号量
例如:
OS_EVENT * Fun_semp; //声明信号量
2、创建信号量
在使用信号量之前,应用程序必须创建一个信号量,创建信号量使用函数
函数原型:
OS_EVENT * OSSemCreate( INT16U cnt //信号量计数器初值 );
其中函数的参数 cnt 代表信号量的计数值。当任务需要访问一个共享资源时, 先要请求管理该资源的信号量, 这样就可以根据信号当前是否有效( 即信号茧的计数器OSEventCnt 的值是否大于0) 来决定该任务是否可以继续运行。该值就好比上厕所时的剩余坑位,只有剩余坑位大于0,即有坑位了,才能继续,否则只能等待或返回。
例如:
Fun_Semp = OSSemCreate(1); //创建信号量
3、请求信号量
函数原型:
void OSSemPend(OS_EVENT * pevent, //信号量的指针
INT16U timeout, //timeout为等待时限
INT8U * err); //错误信息
注意:若timeout为0,则代表任务的等待时间为无限长
如果不希望任务等待则调用以下函数
INT16U OSSemAccept(OS_EVENT * pevent);
4、发送信号量
INT8U OSSemPost(OS_EVENT * pevent);
5、删除信号量
如果应用程序不需要某个信号量,那么可调用函数OSSemDel() 来删除该信号量。该函数的原型如下
OS_EVENT * OSSemDel(
OS_EVENT * pevent, //信号量的指针
INT8U opt, //删除条件选项
INT8U * err //错误信息
);
其中的参数 opt 用来指明信号量的删除条件。
-
opt = OS_DEL_NO_PEND; //当等待任务表中没有等待任务时才删除
-
opt = OS_DEL_ALLWAYS; //无论等待任务表中有没有等待任务都删除
版权声明:本文为qq_39294918原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。