μC/OS—II和μC/OS—III中信号量内部结构的差异及新增的特性对比
μC/OS—II和μC/OS—III中信号量内部结构的差异及新增的特性对比
点击数:7836 次 录入时间:03-04 11:33:32 整理:http://www.55dianzi.com 嵌入式系统-技术
在μC/OS—III中每个任务都有内嵌的信号量,当任务被创建时,任务内嵌的信号量会被自动创建,且初始计数为零。在μC/OS—III中,任务内嵌信号量相关的服务函数都是以OSTaskSem???()的形式开头,以区别于普通的信号量。
任务内嵌的信号量相关的API函数如下:

和普通的信号量相比,当调用Pend操作时,无需指定等待的信号量,也无需指定等待的任务,因为默认要等待信号量的就是当前任务,而等待的就是其内嵌的信号量。而opt参数、p_ts参数和普通信号量的调用参数一样。前面提到,对于普通的信号量,任务调用OSSemPend()而被挂起时,内核会新建一个OS_PEND_DATA类型的数据块,然后填写相关的数据域,并根据等待任务的优先级将数据块插入到信号量的等待列表OS_PEND_LIST中对应的位置。任务内嵌的信号量不像普通的信号量那样拥有OS_SEM类型结构体的各个数据域,而是只有信号量计数值SemCTR变量。因为对于任务内嵌的信号量,只有该任务本身能对其进行等待操作,所以不需要普通信号量中的等待列表OS_PEND_LIST。当任务调用OSTaskSemPend()而被挂起时,也不需要OS_PEND_DATA类型的数据块,内核要做的,除了把任务从就绪表中移除外,只需简单地把任务OS_TCB里的PendOn数据域置为OS_TASK_PEND_ON_TASK_SEM就可以了。PendOn数据域用来指示任务在等待什么,如普通信号量、消息队列、事件标志组等,而OS_TASK_PEND_ON_TASK_SEM表示任务等待的是任务内嵌的信号量。
OSTaskSemPost()需要传递一个指向OS_TCB的指针,表示对哪个任务的内嵌信号量进行Post操作。opt参数同样支持“不调度模式”,但与普通信号量的OSSemPost()相比,没有“广播模式”。原因很简单,任务内嵌的信号量最多只有1个任务(就是该任务本身)在等待,因此不存在“广播”的必要性。当别的任务或者中断服务程序调用OSTaskSemPost()对某个任务的内嵌信号量进行“发信号量”操作时,如果该任务在等待其内嵌的信号量,则内核会把其状态改为就绪,这比普通信号量的Post操作又进一步简化了。
结语
μC/OS—III改进了信号量的使用,用户可以使用“非阻塞”方式等待信号量,而释放信号量则可以选择“广播模式”以及“不调度模式”,提高了使用的灵活性。除此之外,每个任务都有一个内部的信号量。和普通信号量相比,任务内部信号量的操作简化了,因此,在只有一个任务等待信号量的情况下使用任务内嵌的信号量,可以大大提高通信效率。
上一页 [1] [2]
本文关键字:暂无联系方式嵌入式系统-技术,单片机-工控设备 - 嵌入式系统-技术