ucos中关于信号量的使用总结 .

在ucos-II中,为了实现任务之间的同步,用到的同步机制有:信号量,邮箱和消息队列。其中这里我主要说下对信号量的使用经验。信号量在创建时,调用OSSemCreate(INT16U cnt)函数。cnt为信号量的初始值。对cnt赋予不同的值,所起到的作用不同。如果Semp = OSSemCreate(0), 该信号量表示等待一个事件或者多个事件的发生。 例如:我们现在想实现这样一个功能:当有按键按下时,PWM蜂鸣器响起;无按键时,蜂鸣器不响。这是我们就可以分别建立两个任务,Task1和Task2,在Task1中处理按键的按下与否,一旦按下,则调用OSSemPost(Semp)发送这里信号量。在Task2中调用OSSemPend(Semp,0,&err)请求此信号量,如果信号量可用,则调用蜂鸣器程序蜂鸣,否则无限等待,任务自动进行切换。

    如果我们想对一个公共资源进行互斥访问,例如:如果我们想让两个任务Task1和Task2都可以调用Fun()函数,但不能同时调用,最好定义Semp = OSSemCreate(1),同理在各自的任务中都需要调用OSSemPend(Semp,0,&err)请求此信号量,如果可用,则调用Fun(),然后再调用OSSemPost(Semp)释放该信号量。这里就实现了一个资源的互斥访问。同理,如果一个任务要等待n个事件发生后才能执行,则应定义为Semp = OSSemCreate(n)。然后在这n个任务分别运行时调用OSSemPost(Semp),直到这n个事件均发生后,这个任务才能运行。

你可能感兴趣的:(ucosii)