一种基于μC/OS-II系统的信号量机制

文档序号:25279438发布日期:2021-06-01 17:25阅读:84来源:国知局
一种基于μC/OS-II系统的信号量机制

本发明属于嵌入式实时操作系统技术领域,涉及一种基于μc/os-ii系统的信号量机制。



背景技术:

μc/os-ii是一种基于优先级的抢占式硬实时内核,该内核提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。在实时内核中经常有多个任务同时访问同一共享资源的情况,为了防止共享资源被破坏,μc/os-ii采用互斥信号量对其进行保护,但是对于一款实时内核,互斥信号量的实现机制开销是比较大的,即挂起其它任务等操作。任务访问全局变量/竞争资源有两种方式——读/写,如果任务只是在读该全局变量,而并不通过写来改变全局变量的值,那么该全局变量并不需要互斥信号量来保护,只要不改变全局变量的值,那么再多的任务并发访问该全局变量都没关系。因此可以对互斥信号量实现机制进行进一步的细分,即将信号量分为读信号量与写信号量,读信号量允许并发访问而不挂起其它任务。在读/写信号量机制中可能会出现写者等待过久的问题,而互斥信号量机制中处理优先级反转的方法刚好可以缓解这种问题的发生。结合这两种信号量机制的优点可以有效的提高μc/os-ii系统的实时性。



技术实现要素:

本发明的目的在于针对实时操作系统内核μc/os-ii中采用互斥信号量机制对共享资源进行保护时挂起任务开销较大的问题,提供了一种保护共享资源的信号量机制,以提高μc/os-ii系统的实时性。

本发明技术方案如下:为解决上述技术问题,本发明提供一种基于μc/os-ii系统的信号量机制,用于对操作系统中共享资源的保护。该机制在μc/os-ii系统的互斥信号量上进行改进,包括信号量创建模块、读任务申请模块、写任务申请模块、读任务释放模块、写任务释放模块。

其中,所述信号量创建模块设计部分包括对μc/os-ii内核文件和配置文件的修改,为事件控制块、任务控制块添加所需属性;为信号量添加新的状态;初始化事件控制块、事件等待表和读任务表。

其中,所述读任务申请模块设计部分包括更改信号量被占有状态的判断条件;添加读任务申请成功后,其优先级被存入读任务表的功能;更改信号量被占有状态;更改读任务申请失败后被存入事件等待表时任务控制块被挂起的状态。

其中,所述写任务申请模块设计部分包括更改信号量被占有状态的判断条件;更改信号量被占有状态;更改读任务申请失败后被存入事件等待表时任务控制块被挂起的状态。

其中,所述读任务释放模块和写任务释放模块设计部分包括将当前任务的优先级从读任务表中移除;更改信号量被占有状态;添加对读任务表是否为空进行判断的功能;将信号量交给读任务表中优先级最高的任务,并将其优先级与事件等待表中优先级最高任务比较,判断是否需要提升读任务的优先级。在读任务和写任务释放信号量并交给事件等待表中的任务时,更改获得信号量任务被挂起状态。

本发明的有益效果为:使μc/os-ii系统能够实现多个读任务同时持有信号量,读任务与写任务互斥,写任务与写任务互斥,最终避免频繁挂起任务以及写者等待过长时间的情况,加快了任务间通信速度,提高了操作系统的实时性。

附图说明

图1为本发明的信号量原理图。

图2为本发明的读申请模块流程图。

图3为本发明的写申请模块流程图。

图4为本发明的读释放模块流程图。

图5为本发明的写释放模块流程图。

具体实施方式

为事件控制块添加三个成员,包括读请求任务个数osreadcnt、与就续表结构相同的读请求任务表osreadgrp和osreadtbl[os_read_prio_size];在事件控制块的oseventtype中添加两个新状态,读请求任务占有状态ros_event_type_mutex和写请求任务占有状态wos_event_type_mutex;在任务控制块的ostcbstatpend中添加两个新状态,读请求挂起状态ros_stat_pend_ok和写请求挂起状态ros_stat_pend_ok。

原内核采用oseventcnt的低8位来判断互斥信号量是否被占用,无法确定是被读任务占用还是被写任务占用。因此为了达到多个读任务同时占有信号量的目的,本发明采用互斥信号量的状态oseventtype作为判断条件,在互斥信号量状态为ros_event_type_mutex时,读任务可以申请到,写任务会被挂起,在互斥信号量状态为wos_event_type_mutex时,读任务和写任务都会被挂起。

通过上面的改动互斥信号量可以被多个读任务申请到,但是同一时刻互斥信号量的oseventcnt的低8位只能存放最后申请到该信号量的任务优先级,所以使用一个读任务列表来存放占有该信号量的读任务优先级,使得在读任务释放信号量时能够将信号量交给仍占有该信号量的其他读任务。

当任务申请互斥信号量失败时,任务都会被挂起,放入到事件等待表中。这里将任务被挂起的状态存入任务控制块中,因读/写请求而被挂起的任务分别标记为ros_stat_pend_ok和ros_stat_pend_ok。这样做是因为当事件等待表中的任务有条件获得信号量时,需要知道该任务当时是因为读请求还是写请求被挂起的,才能将互斥信号量改为相应的占有状态。

在读任务释放互斥信号量时,需将读任务计数器减一,并将该任务从读任务表中移除。

在读任务释放互斥信号量后,不进行事件等待表是否有任务等待的判断,因为读任务表中可能还有读任务占有信号量,所以这里先判断读任务数是否为零的判断,如果为零,就按照原内核互斥信号量机制继续执行,反之将互斥信号量交给读任务表中优先级最高的任务。

由于先前占有互斥信号量的任务可能因为某种原因被挂起,所以当前占有互斥信号量的任务不一定比先前占有该互斥信号量的任务的优先级高,而且在当前任务占有信号量期间可能有比当前任务优先级高或低的任务因请求不到信号量被放入到事件等待表中,这样在当前任务释放信号量并将其交给读任务表中优先级最高的读任务时,可能出现优先级反转的情况。所以这里要分别获取读任务表和事件等待表中的最高优先级进行比较,通过结果来决定是否进行提升优先级的操作。

在任务从事件等待列表中重新获取到信号量时,通过任务被挂起的状态来判断互斥信号量即将被读任务还是写任务占有,修改其被占有的状态。若为读任务,还需将该任务存入读任务表中。

本发明未尽事宜为公知技术。上述实施例只为说明本发明的技术构思及特点,其目的在于让熟悉此项技术的人士能够了解本发明的内容并据以实施,并不能以此限制本发明的保护范围。凡根据本发明精神实质所作的等效变化或修饰,都应涵盖在本发明的保护范围之内。



技术特征:

1.一种基于μc/os-ii系统的信号量机制,用于对操作系统中共享资源的保护,其特征在于:包括信号量创建模块、读任务申请模块、写任务申请模块、读任务释放模块、写任务释放模块。

2.如权利要求1所述的一种基于μc/os-ii系统的信号量机制,其特征在于,所述信号量创建模块为事件控制块初始化读任务表和读任务计数器,在μc/os-ii系统配置文件中为事件控制块添加读任务表和读任务计数器两个属性,在μc/os-ii系统内核文件中为事件控制块提供读任务等待表初始化函数。

3.如权利要求1所述的一种基于μc/os-ii系统的信号量机制,其特征在于,在μc/os-ii系统配置文件中为时间控制块的信号量状态属性添加读任务占有和写任务占有两种属性。

4.如权利要求3所述的一种基于μc/os-ii系统的信号量机制,其特征在于,在任务申请信号量时,将信号量被占有状态作为信号量是被读任务占有还是被写任务占有的判断条件。

5.如权利要求1所述的一种基于μc/os-ii系统的信号量机制,其特征在于,所述读任务申请模块中,读任务列表存放成功申请到信号量的任务优先级;读任务申请失败时该任务的任务控制块被挂起状态被标成读请求挂起,若是写任务申请失败时该任务的任务控制块被挂起状态被标成写请求挂起,以此作为判断条件来决定该任务获取到该信号量时,该信号量事件控制块被占有的状态。

6.如权利要求5所述的一种基于μc/os-ii系统的信号量机制,其特征在于,所述信号量被挂起状态用来判断在事件等待列表中的任务重新获取到该信号量时,信号量被占有的状态应改为读任务占有还是写任务占有。

7.如权利要求1所述的一种基于μc/os-ii系统的信号量机制,其特征在于,所述读任务释放模块中,读任务释放的信号量交给读任务列表中优先级最高的任务,更改事件控制块属性eventcnt后8位。

8.如权利要求7所述的一种基于μc/os-ii系统的信号量机制,其特征在于,当有写任务申请信号量失败,且该任务优先级大于占有信号量任务的优先级时,将事件控制块属性eventcnt后8位与写任务优先级的比较结果作为是否提升优先级操作的条件。


技术总结
本发明公开了一种基于μC/OS‑II系统的信号量机制,其中,所述信号量机制对共享资源进行保护,将信号量划分为读和写两种机制。在创建信号量时为其分配读任务表,事件等待表和信号量状态等属性。在一个读任务占有信号量时,该任务的优先级被存入读任务表中,更改信号量被占有状态,其它想读共享资源的任务依然可以申请到读信号量,而想要写共享资源的任务申请不到信号量,这样就实现了读读共享、读写互斥和写写互斥,并且可以为读任务表中的任务提升优先级来避免优先级反转的状况,从而解决μC/OS‑II系统中互斥信号量机制经常挂起任务开销较大以及读/写信号量机制中写者等待过久的问题,进一步提高任务之间通信的执行效率。

技术研发人员:丁宇涛;徐江;李纯锋
受保护的技术使用者:哈尔滨理工大学
技术研发日:2021.03.19
技术公布日:2021.06.01
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1