您当前的位置:五五电子网电子知识单片机-工控设备嵌入式系统-技术μC/OS—II和μC/OS—III中信号量内部结构的差异及新增的特性对比 正文
μ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函数如下:
    g.jpg
    和普通的信号量相比,当调用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] 


本文关键字:暂无联系方式嵌入式系统-技术单片机-工控设备 - 嵌入式系统-技术