在创建一个信号量时,查找ECB映射表,判断是否有为0的位置。如果没有则返回申请失败;否则寻找一个为0的位置,生成ECB的地址,返回给创建该信号量的任务。在映射表中相应位置写1表明该ECB已经被占用,下一时钟对申请到的ECB进行初始化,写入信号量初始值。在删除一个信号量时,首先根据信号量的ECB地址查询映射表中对应位置是否为0,如果为0,则表示该信号量已经被其他任务删除,返回删除错误;否则清除该信号量在映射表中的记录,通知ECB管理模块将等待该信号的所有任务置为就绪态,触发一次任务调度,清除ECB中的该信号量的所有信息。以上过程中不需要频繁地去ECB管理模块中进行整体查询,因此节省了大量的通信时间。

2.3 申请/释放一个信号量(P/V操作)

信号量管理中的主要操作就是P/V操作,P/V操作实现的RTL图如图4所示。

嵌入式μC/OS-II系统中基于ECB基本存储单元实现信号量管理的设计

(1)P操作(申请某个信号量)。令pend_sem有效,首先应判断申请信号量的任务是否为中断服务程序(在μC/OS-II中,中断服务程序不允许申请一个信号量),如果是则返回申请错误信息(pend_err为高),否则进行以下操作:令read_cnt有效去ECB管理模块读Cnt值;读回后判断Cnt的值。如果Cnt》0,当前申请任务获得该信号量,任务继续执行,返回申请成功信号pend_err为低;否则pend_err为高阻,根据申请类型Pend_type(申请类型在μC/OS-II中分为有等待申请和无等待申请)来决定是否修改Cnt值,是否将申请信号量的任务置为等待态。

(2)V操作。令post_sem有效,通过硬件电路使read_cnt有效,同时给出信号量的ECB地址,下一时钟读出Cnt值,并判断;如果Cnt》0则表示没有任务等待当前信号量,修改Cnt值;如果Cnt《0则表示当前有任务等待该信号量,修改Cnt值,令select_h有效,从ECB任务等待表中找出优先级最高的任务,通知任务管理器将该任务置为就绪态,触发一次任务调度。3 功能仿真