uCOS-II之信号量

来源:互联网 发布:大非农数据白银 编辑:程序博客网 时间:2024/04/29 20:39

信号量是一类时间,使用信号量的最初目的是,为了给共享资源设立一个标志,该标志表示该共享资源的占用情况,这样,当一个任务在访问共享资源之前,就可以先对这个标志进行查询,从而在了解资源被占用的情况后,再来决定自己的行为。距离来讲,信号量就相当于停车场入口的停车位剩余标志,只有场内有多余停车位时,外面的车才能进入停车场停车。

信号量分为两种:二值型信号量,N值信号量。二值就只有0和1两种状态,类似于家里的固话,而N值则类似于公共电话。

二值信号量又叫做互斥型信号量,而N值信号量则称之为计数型信号量,也就是普通信号量。

创建信号量函数:

OS_EVENT *OSSemCreate(INT16U cnt);该函数返回值为已创建的信号量的指针,而参数cnt则是信号量计数器(OSEventCnt)的初始值。该函数的实现过程为:先判断调用该函数的环境是否是在中断中,如果是在中断中调用,则立即返回,即在中断中是不能穿件信号量的,因为中断与信号量调度理念是冲突的,就不“实时”了。然后就是创建一个指向空的ECB结构指针。其中ECB(event control block)为事件控制块,包含事件类型,计数变量,指针,任务等待组,任务等代表。

请求信号量函数:

void OSSemPend(OS_EVENT *pevent,INT16U timeout,INT8U *err),其中pevent是被请求的信号量指针,timeout为等待实现,err为错误信息。该函数的实现过程为,先判断信号量是否有效,如果有效则信号量计数器减1后立即返回执行后续程序,这也是最快执行的方式;如果信号量无效,则判断该调用是否来自于中断,在中断中不能调用该函数,因为这样就与中断的思想冲突了。然后判断调度器是否上锁,如果上锁也不能调用该函数。信号量无效的情况下,将任务置于睡眠状态,等待时间也同时开始计时,如果等待超时,则唤醒该任务,重新运行,如果超时时间设定为0,即无限,则该任务就一直处于睡眠状态。

释放信号量函数:

INT8U OSSemPost(OS_EVENT *pevent),函数返回是否发送成功状态。该函数的实现过程为在对信号量的计数器操作之前,首先检查是否还有等待该信号量的任务。如果没有,就把信号量计数器OSEventCnt加1,如果有,则设定等待该信号量的任务状态为就绪状态,然后调用调度器OS_Sched()去运行等待任务中优先级别最高的任务后就直接return返回,而不对OSEventCnt再加1。

0 0
原创粉丝点击