OSSemCreate()

    xiaoxiao2021-03-25  7

    程序清单 L6.9是OSSemCreate()函数的源代码。首先,它从空闲任务控制块链表中得到一个事件控制块[L6.9(1)],并对空闲事件控制链表的指针进行适当的调整,使它指向下一个空闲的事件控制块[L6.9(2)]。如果这时有任务控制块可用[L6.9(3)],就将该任务控制块的事件类型设置成信号量OS_EVENT_TYPE_SEM[L6.9(4)]。其它的信号量操作函数OSSem???()通过检查该域来保证所操作的任务控制块类型的正确。例如,这可以防止调用OSSemPost()函数对一个用作邮箱的任务控制块进行操作[6.06节,邮箱]。接着,用信号量的初始值对任务控制块进行初始化[L6.9(5)],并调用OSEventWaitListInit()函数对事件控制任务控制块的等待任务列表进行初始化[见6.01节,初始化一个任务控制块,OSEventWaitListInit()][L6.9(6)]。因为信号量正在被初始化,所以这时没有任何任务等待该信号量。最后,OSSemCreate()返回给调用函数一个指向任务控制块的指针。以后对信号量的所有操作,如OSSemPend(), OSSemPost(), 

    OSSemAccept()和OSSemQuery()都是通过该指针完成的。因此,这个指针实际上就是该信号量的句柄。如果系统中没有可用的任务控制块,OSSemCreate()将返回一个NULL指针。

    值得注意的是,在µC/OS-II中,信号量一旦建立就不能删除了,因此也就不可能将一个已分配的任务控制块再放回到空闲ECB链表中。如果有任务正在等待某个信号量,或者某任务的运行依赖于某信号量的出现时,删除该任务是很危险的。

     

    程序清单 L6.9 建立一个信号量

    OS_EVENT *OSSemCreate (INT16U cnt)

    {

        OS_EVENT *pevent;

     

     

        OS_ENTER_CRITICAL();

        pevent = OSEventFreeList; (1)

        if (OSEventFreeList != (OS_EVENT *)0) { (2)

            OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;

        }

        OS_EXIT_CRITICAL();

        if (pevent != (OS_EVENT *)0) { (3)

            pevent->OSEventType = OS_EVENT_TYPE_SEM; (4)

            pevent->OSEventCnt  = cnt; (5)

            OSEventWaitListInit(pevent); (6)

        }

        return (pevent); (7)

    }

    转载请注明原文地址: https://ju.6miu.com/read-200332.html

    最新回复(0)