硬件实时操作系统信号量管理的设计与实现
在创建一个信号量时,查找ECB映射表,判断是否有为0的位置。如果没有则返回申请失败;否则寻找一个为0的位置,生成ECB的地址,返回给创建该信号量的任务。在映射表中相应位置写1表明该ECB已经被占用,下一时钟对申请到的ECB进行初始化,写入信号量初始值。在删除一个信号量时,首先根据信号量的ECB地址查询映射表中对应位置是否为0,如果为0,则表示该信号量已经被其他任务删除,返回删除错误;否则清除该信号量在映射表中的记录,通知ECB管理模块将等待该信号的所有任务置为就绪态,触发一次任务调度,清除ECB中的该信号量的所有信息。以上过程中不需要频繁地去ECB管理模块中进行整体查询,因此节省了大量的通信时间。
2.3 申请/释放一个信号量(P/V操作)
信号量管理中的主要操作就是P/V操作,P/V操作实现的RTL图如图4所示。
(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 功能仿真
为验证设计对系统性能的影响,采用ISE 8.2软件对各个模块进行时序仿真。P/V操作仿真结果如图5所示。P/V操作需要在两个模块之间进行读写数据,操作过程中,P/V信号始终有效。
(1)pend_sem有效(P操作)。申请信号量任务的优先级为01,申请信号量的地址为05。pend_sem有效,令read_cnt为高,根据地址pend_addr读当前信号量的值Cnt,下一个时钟返回数值Cnt_in为0002,大于0;任务获得信号量继续执行,wr_cnt为高,Cnt值进行减1操作后送Cnt_out写回ECB。
(2)post_sem有效(V操作)。根据地址读Cnt值,Cnt值为FFFE<0(Cnt值以补码形式存储)。下一个时钟Cnt进行加1操作后写回ECB,同时Select_h为高,从等待该信号量的任务列表中选择出优先级最高的任务设置为就绪态,触发一次任务调度。
(3)申请一个信号量。申请信号量任务的优先级为03,申请的信号量的地址为09。如果下一个时钟读回的Cnt值为FFFD<0,并且申请类型为高(有等待申请),则修改Cnt值写回,令wr_sid为高,将当前申请任务的优先级送pend_prio_out写入等待该信号的任务列表中。如果pend_err为高,则通知任务管理器将当前申请信号量的任务阻塞,并触发一次任务调度。
(4)申请一个信号量,读回的Cnt值为FFFA<0,但当前申请类型为低(无等待申请),不进行任何操作,返回申请失败,通知任务管理器将当前任务阻塞。
用户程序在创建、删除一个信号量以及申请某类共享资源进行P/V操作时,用软件实现信号量管理中,一般先从用户态转到系统态,然后进行基本数据的查询、读出、比较、判断等,再转相应的程序入口,最后还要从系统态转回用户态。而用硬件实现信号量管理后进行以上操作只需一条读或写指令,并且这条指令在用软件实现的信号量管理中也是必须的,其他操作都由硬件逻辑来实现,简化了操作过程。从仿真结果看,进行P/V操作时只需要3个时钟节拍,整体的执行速度远远高于软件。同时,RTOS中信号量的个数为多个,信号量管理在RTOS中频繁运行。因此,硬化信号量管理后对整个机器速度的提高是非常明显的,特别是对资源种类多、数量大的计算机系统,速度的提高就会更加明显。另一方面,由于硬件的可靠性远超过软件的可靠性,所以硬化后可提高RTOS的可靠性。
- Linux超线程感知的调度算法研究(11-03)
- 基于μC/OS-II的时间片调度法设计(01-10)
- 台达IED电梯一体机并联控制(02-16)
- 嵌入式Linux发展 谈Montavista Linux(04-15)
- 利用MLD自动化操作系统移植降低 Linux成本(05-04)
- 嵌入式实时系统中的优先级反转问题(06-10)