UCOS II 中信号量的使用

  • Post author:
  • Post category:其他




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 版权协议,转载请附上原文出处链接和本声明。