掌桥专利:专业的专利平台
掌桥专利
首页

一种基于RTX实时系统的共享资源读写互斥方法

文献发布时间:2023-06-19 10:24:22


一种基于RTX实时系统的共享资源读写互斥方法

技术领域

本发明涉及计算机技术领域。更具体地,涉及一种基于RTX实时系统的共享资源读写互斥方法。

背景技术

软件移植技术在跨操作系统或使用环境时应用非常广泛,可以在原有应用程序不做改动或者只做较少改动的情况下适配到新的平台环境下,大大减少不必要的二次开发工作量。

现有技术中从VxWorks软件向RTX系统移植的技术方案已经有所应用,利用中间件形式重新利用RTX系统的用户API封装了部分VxWorks系统的API,实现了基于RTX系统完成了部分VxWorks软件功能函数的移植适配,其中包括消息队列、事件、互斥信号量、计数信号量、二值信号量等。但随着软件版本更新迭代,新版本的基于VxWorks6.8系统编制的软件使用了更多功能而RTX并未提供对应可用API,典型的例如读/写信号量功能。

发明内容

有鉴于此,本发明第一个实施例提供一种基于RTX实时系统的共享资源读写互斥方法,包括:

利用RTX现有API对VxWorks软件的读/写信号量功能进行封装;

创建读/写信号量,通过附加的信号量属性参数将该信号量标记为读写信号量,并创建属性资源的互斥锁,创建完成后函数正常返回;

写者获取信号量,将写者标志置为写状态,阻止其他的读者或者写者请求,等待超时或者获取信号量成功后函数返回;

当写者释放信号量时,同时查询写者标志是否有其他写者在等待信号,若有则函数返回,若没有则同时查询读者标志位是否有读者正在等待,有读者则激活读者状态,若没有则设置信号量初始状态,可以继续被其他申请者申请;

当读者需要获取信号量时,但在此前首先获取是否有写者申请,若有则读者进入等待,否则首个读者可以等待读信号量,当获取信号量之后,将读者标志置为读状态,并记录读者数量,首个读者获取信号量后,后续读者直接返回正常获取,实现读者的并发访问。

当读者释放信号量时,每个读者释放都记录剩余读者数量,最后一个读者释放读信号量,将信号量状态设置为初始状态,可以继续被其他申请者申请。

在一个具体实施例中,采用RTX二值信号量作为读/写信号量的基础信号量。

在一个具体实施例中,读取数据能够多线程并发的访问该数据区,写入数据的线程则独占访问该数据区,只有当前没有读者或者写者占用该资源,写信号量才能被获取实现对数据的互斥保护。

在一个具体实施例中,当调用VxWorks系统下创建读/写信号量的功能函数时通过中间件包装实际调用RTX下的创建读/写信号量的功能函数。

在一个具体实施例中,写者需要获取信号量时调用VxWorks系统下写者获取信号量的功能函数,在中间件内实际调用的是RTX下的写者获取信号量的功能函数。

在一个具体实施例中,当写者释放信号量时调用VxWorks系统下写者释放信号量的功能函数,在中间件内实际调用的是RTX下的写者释放信号量的功能函数。

在一个具体实施例中,当读者需要获取信号量时调用VxWorks系统下读者获取信号量的功能函数,在中间件内实际调用的是RTX下的读者获取信号量的功能函数。

在一个具体实施例中,当读者释放信号量时调用VxWorks系统下读者释放信号量的功能函数,在中间件内实际调用的是RTX下的读者释放信号量的功能函数。

本发明的第二个实施例提供一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如第一个实施例所述的方法。

本发明的第三个实施例提供一种计算设备,包括处理器,其特征在于,所述处理器执行程序时实现如第一个实施例所述的方法。

本发明的有益效果如下:

本发明实施例采用RTX二值信号量作为信号量基础以及读者和写者之间交互逻辑的处理。通过采用RTX二值信号量作为读写信号量的基础信号量,保证了该信号量在等待和获取时的实时性要求,同时兼顾实时系统下对任务优先级的调度策略,进而保证原软件运行时实时性不受影响;经过设计读者标志、写者标志、以及信号量状态等标志位,同时对这些标志位采用互斥锁保护,进而实现了VxWorks下读写信号量应有的逻辑。多个读者并发的对受保护数据访问,写者独占式对受保护数据访问,大大提高共享资源同一时间访问效率。

附图说明

下面结合附图对本发明的具体实施方式作进一步详细的说明。

图1示出根据本发明一个实施例的读者与写者任务运行时序示意图

图2示出根据本发明一个实施例的读/写信号量交互逻辑设计示意图。

图3示出根据本发明一个实施例的计算机设备的结构示意图。

具体实施方式

为了更清楚地说明本发明,下面结合优选实施例和附图对本发明做进一步的说明。附图中相似的部件以相同的附图标记进行表示。本领域技术人员应当理解,下面所具体描述的内容是说明性的而非限制性的,不应以此限制本发明的保护范围。

实施例1

一种基于RTX实时系统的共享资源读写互斥方法,利用RTX现有API,对VxWorks软件的读/写信号量功能进行封装,在不改变原软件代码调用形式和软件运行逻辑流程的情况下,基于RTX+Windows环境实现读/写信号量应有的功能,使用的RTX版本为RTX64 2014,对应原VxWorks版本为6.8,原软件设计为多核、多线程应用程序,内部逻辑包含有多个读/写信号量进行资源保护。

读/写信号量就是基于VxWorks6.8系统上编写的软件大量使用的功能,该功能保证了在多核多线程同时访问某一数据资源时,如果只是读取数据则可以多线程并发的访问该数据区,提高访问效率,而写入数据的线程则需要独占访问该数据区,只有当前没有读者或者写者占用该资源,写信号量才能被获取实现对数据的互斥保护。

采用RTX二值信号量作为信号量基础以及读者和写者之间交互逻辑的处理。通过采用RTX二值信号量作为读写信号量的基础信号量,保证了该信号量在等待和获取时的实时性要求,同时兼顾实时系统下对任务优先级的调度策略,进而保证原软件运行时实时性不受影响。

当调用VxWorks系统下创建读/写信号量的功能函数时通过中间件包装实际调用RTX下的创建读/写信号量的功能函数。

写者需要获取信号量时调用VxWorks系统下写者获取信号量的功能函数semWTake(),在中间件内实际调用的是RTX下的写者获取信号量的功能函数RtWaitForSingleObject()。在中间件内实际调用的是,且将写者标志置为写状态,阻止其他的读者或者写者请求,等待超时或者获取信号量成功后函数返回。

当写者释放信号量时调用VxWorks系统下写者释放信号量的功能函数semWGive(),在中间件内实际调用的是RTX下的写者释放信号量的功能函数RtReleaseSemaphore()。且同时查询写者标志是否有其他写者在等待信号,若有则函数返回,若没有则同时查询读者标志位是否有读者正在等待,有读者则激活读者状态,若没有则设置信号量初始状态,可以继续被其他申请者申请。

当读者需要获取信号量时调用VxWorks系统下读者获取信号量的功能函数semRTake(),在中间件内实际调用的是RTX下的读者获取信号量的功能函数RtWaitForSingleObject()。但在此前首先获取是否有写者申请,若有则读者进入等待,否则首个读者可以等待读信号量,当获取信号量之后,将读者标志置为读状态,并记录读者数量,首个读者获取信号量后,后续读者直接返回正常获取,实现读者的并发访问。

当读者释放信号量时调用VxWorks系统下读者释放信号量的功能函数semRGive(),在中间件内实际调用的是RTX下的读者释放信号量的功能函数RtReleaseSemaphore()。每个读者释放都记录剩余读者数量,最后一个读者释放时调用释放读信号量,将信号量状态设置为初始状态,可以继续被其他申请者申请。

一个示例如图1,在一个多线程处理过程中,对于同一个读写信号量不同线程间访问的时序:

S1、一开始占用写信号量的是写者任务1,当其资源使用过程中写者任务2开始申请写信号量,但因为任务1占用所以任务2挂起等待写信号量。完成后释放写信号量;

S2、此时写者任务2可以获取写信号量,任务2开始执行,执行过程中读者任务3和读者任务4陆续申请读信号量,但因为写者任务2独占式访问写信号量,读者任务3和读者任务4被挂起等待读信号量。写者任务2执行完成后将释放写信号量;

S3、此时读者任务3和读者任务4将按优先级顺序或者先后顺序获取读者信号量,由于读者任务对读信号量是并发访问,读者任务3和读者任务4都可以获取到读信号量,两个任务分别开始执行。执行过程中写者任务1又一次申请写信号量,但此时由于读者占用,任务1挂起等待读者任务退出,此时虽然读者任务5也在申请读信号,但因为此前已经有写者申请,优先响应写请求,因此任务5挂起等待;

S4、任务3和任务4完成后释放读者信号,写任务1获取写信号,完成后释放,此时读者任务5可以获取信号量,开始执行,至此基本是读者和写者之间交互逻辑的简易时序示意。

实际使用过程的任务逻辑可能比图中复杂也可能简化,本示例只做为读写任务时序正确性的说明。

多个读者并发的对受保护数据访问,写者独占式对受保护数据访问,经过大量测试验证在测试软件22个线程任务,5个读写信号量对不同资源进行保护的情况下,可以做到至少8个读者并发访问数据,其余写者任务独占访问,整个运行流程和实时性与原本Vxworks下软件运行状态完全一致,读写信号量工作逻辑正确,性能优秀。

图2是本发明读写信号量的交互逻辑设计示意图,图中详细展示了读者信号量的获取和释放以及写者信号量的获取和释放相互之间的逻辑关系设计,同时也展示了读写信号量获取和释放功能内部的执行逻辑设计。

读写信号量设计了一个数组用于保存所有创建成功的读写信号量,以及每个信号量对应的标志位和标志位保护锁。

本发明中共使用标志位如下:

wCount:用于记录当前申请写者数量;

rCount:用于记录当前申请读者数量;

waitReaderCount:用于记录等待的读者数量;

Type:用于记录信号量当前状态;

writer:写者占用标志。

使用标志位的互斥锁如下:

wCountMutex:写者数量标志保护锁;

rCountMutex:读者数量标志保护锁;

waitReaderCountMutex:等待读者数量保护锁;

TypeMutex:信号量状态保护锁;

writerMutex:写者占用标志保护锁;

使用的写者激活信号量:

Authsemaphore:RTX计数信号量,有多少个读者初始化时就有多少个计数,用于写者完成时激活等待状态的读者。

用于实现的读写功能基础信号量如下:

sema:RTX创建的最终用来在读者和写者之间同步的二值信号量。

每个标识位都需要在访问和修改时对该变量加锁进行保护,避免多线程同时操作该变量造成系统错误。

读者获取信号量semRTake()

1)首先在读写信号量数组中查找该信号量,获取对应的信号量句柄和标志位状态等;

2)判断写者数量是否大于等于1;

3)若写者数量大于等于1则一直等待读者完成后给写者授权信号量;

4)若写者数量小于1则判断是否该信号量当前的第一个申请的读者;

5)是第一个读者则等待获取二值信号量sema,获取到后修改信号量为“读”状态,记录读者数量加1;

6)不是第一个读者则直接记录读者数量加1;

7)函数返回

读者释放信号量semRGive()

1)首先在读写信号量数组中查找该信号量,获取对应的信号量句柄和标志位状态等;

2)当前读者数量减1;

3)判断是否最后一个读者既rCount是否等于0;

4)若不是最后一个读者,函数直接返回成功;

5)若是最后一个读者,释放二值信号量sema,将信号量状态设置为初始状态;

6)函数返回;

写者获取信号量semWTake()

1)首先在读写信号量数组中查找该信号量,获取对应的信号量句柄和标志位状态等;

2)修改当前申请写者数量加1,即wCount加1;

3)等待获取二值信号量sema;

4)获取到sema后修改信号量状态为写状态,将写者占用标志置为true;

5)函数返回。

写者释放信号量semWGive()

1)首先在读写信号量数组中查找该信号量,获取对应的信号量句柄和标志位状态等;

2)判断写者占用标志;

3)若非写者占用则函数抛异常返回;

4)若写者未占用则释放二值信号量sema;

5)当前写者数量减1,即Wcount减1;

6)判断写者数量Wcount是否大于等于1,即是否有等待的写者;

7)若有等待写者则函数直接返回;

8)若没有等待写者,释放授权读者信号量Authsemaphore,激活所有等待的读者;

9)每激活一个读者waitReaderCount等待读者数减1;

10)修改信号量为初始状态;

11)函数返回;

至此本发明的RTX环境下读/写信号量的功能模拟已经完成。

实施例2

一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现实施例1所述的方法。

在实际应用中,所述计算机可读存储介质可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本实施例中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。

计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。

计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于无线、电线、光缆、RF等等,或者上述的任意合适的组合。

可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。

实施例3

如图3所示,本发明的另一个实施例提供的一种计算机设备的结构示意图。图3显示的计算机设备12仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。

如图3所示,计算机设备12以通用计算设备的形式表现。计算机设备12的组件可以包括但不限于:一个或者多个处理器或者处理单元16,系统存储器28,连接不同系统组件(包括系统存储器28和处理单元16)的总线18。

总线18表示几类总线结构中的一种或多种,包括存储器总线或者存储器控制器,外围总线,图形加速端口,处理器或者使用多种总线结构中的任意总线结构的局域总线。举例来说,这些体系结构包括但不限于工业标准体系结构(ISA)总线,微通道体系结构(MAC)总线,增强型ISA总线、视频电子标准协会(VESA)局域总线以及外围组件互连(PCI)总线。

计算机设备12典型地包括多种计算机系统可读介质。这些介质可以是任何能够被计算机设备12访问的可用介质,包括易失性和非易失性介质,可移动的和不可移动的介质。

系统存储器28可以包括易失性存储器形式的计算机系统可读介质,例如随机存取存储器(RAM)30和/或高速缓存存储器32。计算机设备12可以进一步包括其它可移动/不可移动的、易失性/非易失性计算机系统存储介质。仅作为举例,存储系统34可以用于读写不可移动的、非易失性磁介质(图3未显示,通常称为“硬盘驱动器”)。尽管图3中未示出,可以提供用于对可移动非易失性磁盘(例如“软盘”)读写的磁盘驱动器,以及对可移动非易失性光盘(例如CD-ROM,DVD-ROM或者其它光介质)读写的光盘驱动器。在这些情况下,每个驱动器可以通过一个或者多个数据介质接口与总线18相连。存储器28可以包括至少一个程序产品,该程序产品具有一组(例如至少一个)程序模块,这些程序模块被配置以执行本发明各实施例的功能。

具有一组(至少一个)程序模块42的程序/实用工具40,可以存储在例如存储器28中,这样的程序模块42包括但不限于操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。程序模块42通常执行本发明所描述的实施例中的功能和/或方法。

计算机设备12也可以与一个或多个外部设备14(例如键盘、指向设备、显示器24等)通信,还可与一个或者多个使得用户能与该计算机设备12交互的设备通信,和/或与使得该计算机设备12能与一个或多个其它计算设备进行通信的任何设备(例如网卡,调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口22进行。并且,计算机设备12还可以通过网络适配器20与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。如图3所示,网络适配器20通过总线18与计算机设备12的其它模块通信。应当明白,尽管图3中未示出,可以结合计算机设备12使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。

处理器单元16通过运行存储在系统存储器28中的程序,从而执行各种功能应用以及数据处理,例如实现本发明实施例1所提供方法。

显然,本发明的上述实施例仅仅是为清楚地说明本发明所作的举例,而并非是对本发明的实施方式的限定,对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动,这里无法对所有的实施方式予以穷举,凡是属于本发明的技术方案所引伸出的显而易见的变化或变动仍处于本发明的保护范围之列。

相关技术
  • 一种基于RTX实时系统的共享资源读写互斥方法
  • 一种对共享资源互斥访问的同步方法、装置和网络设备
技术分类

06120112533615