首页> 中国专利> 基于双缓存机制的实时系统多任务数据共享方法

基于双缓存机制的实时系统多任务数据共享方法

摘要

本发明公开了一种基于双缓存机制的实时系统多任务数据共享方法,包含双缓存结构初始化操作、双缓存写入操作和双缓存读取操作,双缓存初始化操作对双缓存结构进行分配内存、设置初值等初始化活动。双缓存读取操作由读取任务调用对双缓存结构进行数据读取;双缓存写入操作由写入任务调用对双缓存结构进行数据写入。本发明由于使用了双缓存机制,即不影响原有的系统调度,又保证了写入数据的更新率和读取的数据的相对一致性、及时性、不重复性。

著录项

  • 公开/公告号CN105912478A

    专利类型发明专利

  • 公开/公告日2016-08-31

    原文格式PDF

  • 申请/专利权人 中国航空无线电电子研究所;

    申请/专利号CN201610210689.X

  • 发明设计人 徐克;张国全;李奎;

    申请日2016-04-06

  • 分类号

  • 代理机构上海和跃知识产权代理事务所(普通合伙);

  • 代理人杨慧

  • 地址 200233 上海市徐汇区桂平路432号

  • 入库时间 2023-06-19 00:22:08

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2018-11-27

    授权

    授权

  • 2016-09-28

    实质审查的生效 IPC(主分类):G06F12/0877 申请日:20160406

    实质审查的生效

  • 2016-08-31

    公开

    公开

说明书

【技术领域】

本发明涉及一种实时系统任务间数据共享方法,特别是指基于VxWorks653系统的分区内一个任务写入,多个任务读取的数据共享方法。

【背景技术】

VxWorks653系统提供了APEX Buffers(缓存)、Blackboards(黑板)、Semaphores(信号量)等方式进行分区内的任务(进程)间数据通讯。

Buffers(缓存)方式:可以将Buffer看成一个消息队列,先创建Buffer,设定Buffer里消息队列的深度和单个消息的最大字节数。任务(进程)间通过该消息队列以先入先出或者优先级排队方式(视Buffer设置而定)进行数据通讯。每写入一条消息队列深度加一,队列深度达到最大值后,无法写入。每读取一条消息,队列深度减一。该方式在一个任务写入数据,多个任务读取数据的情况下,如果只采用一个Buffer很难保证每个任务都能读到共享数据,因为如果有快速高优先级任务参与读取的话,在低优先级慢速周期任务读取之前,Buffer可能就会被读空。如果要保证每个读取任务都能读到数据就要将队列深度设置足够大,或者单独为每对读写任务分配缓存。这样做会增加内存开销,加重写入任务负担,对分区资源造成一定的浪费、消耗。而且每个读取任务读到数据会有较大差异。即使队列深度足够大,如果读数据的任务没有及时将消息读走,会导致写入数据任务的写入失败,无法保证数据的更新。

Blackboards(黑板)方式:可以将黑板看成一块共享内存区,写入任务执行显示(写入)操作,写入数据。读取任务可以在黑板被擦掉前读取数据。该方式在一个任务执行写入数据,多个任务读取数据的情况下,写入任务如果擦 写黑板过快,则读取任务无法读到数据,如果等待读取所有任务读取完成再写入,无法保证数据的更新。另外,除非将读取到的数据与之前数据做对比,读取任务是无法得知黑板上的内容是否有更新的。这样就存在,写入内容没更新之前,会有读取任务不断读取相同内容的数据,造成时间、资源上的浪费。

Semaphores(信号量)方式:通过对共享内存上锁方式,在任务间进行数据共享。如果负责读取的低优先级任务获取信号量后,共享区被锁,原有任务调度方案将会被改变,高优先级的写入任务将被阻塞,无法写入最新数据,这对数据更新率要求高的环境存在最新数据被丢弃的风险。

上述三种方式还存在一个共同特征:缺乏通用性和可移植性,仅能在分区初始化时事先创建,并用于本分区,而且已分配的内存资源不可删除。

【发明内容】

发明目的:为了解决现有技术资源消耗大、可能会改变任务调度方案、数据更新效率低、缺乏通用性和可移植性的问题,本发明提供一种基于双缓存机制的实时系统多任务数据共享方法,可以高效完成VxWorks653系统分区内多任务间数据共享,特别是一个任务写入,多个任务读取的情况。并且该方法可扩展应用到其他多任务系统中。

本发明的发明目的通过以下技术方案实现:

一种基于双缓存机制的实时系统多任务数据共享方法,包含双缓存结构初始化操作、双缓存写入操作和双缓存读取操作;

所述双缓存结构初始化操作完成缓存区A和缓存区B的内存分配,以及缓存区A的可写入标志、缓存区B的可写入标志、缓存区可读取标志、缓存区写入次数、缓存区A的更新标志、缓存区B的更新标志、读取任务更新标志、缓 存区A的地址、缓存区B的地址的设置;

所述双缓存写入操作包含以下步骤:

步骤2.1、判断待写入数据是否超出单个缓存区能处理的最大值,若超出则返回错误代码,否则根据缓存区可读取标志执行下一步:

步骤2.2、如果是第一次写入,则将数据写入缓存区A;如果不是第一次写入,判断非上一次写入的缓存区的可写入标志是否代表可以写入,如何可以写入则将数据写入非上一次写入的缓存区,如果非上一次写入缓存区不可写入,判断上一次写入的缓存区的可写入标志,如果也不可写入,返回错误代码,如果上一次写入缓存区可以写入,先将缓存区可读取标志指向非上一次写入缓存区,然后将数据写入上一次写入缓存区;

步骤2.3、更新缓冲区写入次数,将本次写入的缓存区的更新标志设置为更新后的缓冲区写入次数,将缓存区可读取标志指向本次写入的缓存区,返回写入字节数,写入完成;

所述双缓存读取操作包含以下步骤:

步骤3.1、判断待读取数据是否超出单个缓存区能处理的最大值,若超出则返回错误代码,否则执行下一步;

步骤3.2、判断读取任务与写入任务的优先级高低,若读取任务优先级高于或等于写入任务,则判断缓存区可读标志所指向的缓存区的更新状态是否大于本次读取任务id对应的读取更新标志判断数据是否有更新,若大于先更新读取更新标志,然后读取缓存区可读标志所指向的缓存区的数据,返回读取字节数;

若读取任务优先级低于写入任务,先通过缓存区A的可写入标志判断缓存区A是否正在被其他任务读取,如果是,根据缓存区A的更新状态是否大于本 次读取任务id对应的读取更新标志判断数据是否有更新,若大于先更新读取更新标志并且缓存区A的可写入标志加1,然后读取缓存区A中的数据,读取完成后,缓存区A的可写入标志减1,返回读取字节数;如果缓存区A没有正在被其他任务读取,则再通过缓存区B的可写入标志判断缓存区B是否正在被其他任务读取,如果是,则根据缓存区B的更新状态是否大于本次读取任务id对应的读取更新标志判断数据是否有更新,若大于先更新读取更新标志并且缓存区A的可写入标志加1,然后读取缓存区A中的数据,读取完成后,缓存区A的可写入标志减1,返回读取字节数。

依据上述特征,所述步骤3.2中还包含如果缓存区没有数据更新,则返回0。

依据上述特征,所述步骤3.2中还包含若读取任务优先级低于写入任务时,如果两个缓存区都没有被其他任务读取,则判断缓存区可读标志所指向的缓存区的更新状态是否大于本次读取任务id对应的读取更新标志判断数据是否有更新,若大于先更新读取更新标志,然后读取缓存区可读标志所指向的缓存区的数据,返回读取字节数。

进一步,所述的实时系统多任务数据共享方法还包含双缓存删除操作,所述双缓存删除操作用于释放缓存区A、缓存区B的已分配内存,将单个缓冲区能处理的最大字节数置0。

本发明基于双缓存机制的实时系统多任务数据共享方法主要应用于VxWorks653系统。

与现有技术相比较,本发明在多任务间共享数据时,只需根据共享数据大小,通过初始化操作建立一个与之匹配的双缓存结构,动态分配所需内存,最大值是待共享数据的一倍,不会消耗过多系统资源。读取任务和写入任务使用相关的读写操作可以完成数据读写功能,由于使用了双缓存机制,即不影响原 有的系统调度,又保证了写入数据的更新率和读取的数据的相对一致性、及时性、不重复性。另外,如果开发语言使用得当,比如用C语言等实现本发明,可以具有非常好的通用性和可移植性。

【附图说明】

图1为实施本发明的双缓存数据结构内存模型图。

图2为实施本发明的双缓存初始化操作流程。

图3为实施本发明的双缓存写入操作流程。

图4为实施本发明的双缓存读取操作流程。

图5为实施本发明的双缓存删除操作流程。

【具体实施方式】

下面通过具体实施方式对本发明作进一步详细说明。

本发明首先设计了一种双缓存数据结构、所述双缓存数据结构包括:单个缓存区最大值(字节数)、缓存区A可写入标志、缓存区B可写入标志、缓存区可读取标志、缓存区写入次数、缓存区A更新标志、缓存区B更新标志、读取任务更新标志、缓存区A地址、缓存区B地址。

双缓存数据结构用来作为任务间数据共享的载体,图1为双缓存数据结构的内存模型。以C语言实现为例,其中:

1)单个缓冲区可处理最大字节数以下简称singleBufferSize,做为对缓存区A、B动态分配内存的依据。

2)缓存区A可写入标志以下简称writeA,用来判断当前缓存区A是否可以写入,如果大于0,说明有任务在读取缓存区A所以,当前A不可写入。如果为0则可以写入。

3)缓存区B可写入标志B以下简称writeB,用来判断当前缓存区B是否可以写入。原理用法同writeA。

4)缓存区可读取标志以下简称canRead,用来告知比写入任务优先级高的读取任务当前可以读取哪个缓存区,0为缓存区A可读,1为缓存区B可读,初始化为0xFE,缓存区A、缓存区B中均没有数据。

5)缓存区写入次数以下简称writeTimes,用来记录缓存区有效写入次数。

6)缓存区A更新标志以下简称bufAupdate,用来记录缓存区A的数据更新情况。

7)缓存区B新标志以下简称bufBupdate,用来记录缓存区B的数据更新情况。

8)读取任务更新标志以下简称update[i],i=[0,255],用来表示id号为i的读取任务读到的缓存区A或B的数据更新情况。

9)缓存区A地址以下简称dataA,用来指向动态分配的缓存区A内存地址。

10)缓存区B地址以下简称dataB,用来指向动态分配的缓存区B内存地址。

双缓存数据结构运用时,主要包含双缓存初始化操作、双缓存写入操作、双缓存读取操作,双缓存删除操作。双缓存初始化操作对双缓存结构进行分配内存、设置初值等初始化活动。双缓存读取操作由读取任务调用对双缓存结构进行数据读取。双缓存写入操作由写入任务调用对双缓存结构进行数据写入。

所述双缓存初始化操作通过输入参数:待初始化双缓存结构地址和该缓存结构单个缓存区最大值(字节数)对双缓存结构进行初始化,完成相关标志初始值设置、缓存区内存动态分配等工作。

所述双缓存写入操作通过输入参数:待写入目的双缓存结构地址、待写入数据源地址、待写入数据字节数,将相应字节数的待写入数据写入双缓存结构中并返回写入的字节数。根据返回值可以判断是否写入成功。

所述双缓存读取操作通过输入参数:读出数据目的缓存地址、被读取源双缓存结构地址、拟读取数据字节数、读取任务与写入任务优先级关系、读取任务id标识。从被读取源双缓存结构中读取相应字节数的数据,存放到读出数据目标缓存区,返回读取字节数。根据返回值可以判断读取是否成功,数据是否更新。

下面是各个操作过程作详细说明。

双缓存区初始化流程:

图2为双缓存区初始化流程:分配内存,完成相关变量初值设定,任意一个缓存区分配内存不成功,视为初始化失败,返回-1。如果内存分配成功,返回单个缓存区最大字节数,初始化完成。

双缓存写入操作:

图3为双缓存的写入操作流程,包含以下步骤;

步骤2.1、写入任务每个周期进行一次写入操作。根据输入参数,判断待写入数据大小是否合理。如果超出单个缓存区能处理的最大值,返回错误代码-1,写入操作失败。

步骤2.2,读取canRead,如果canRead=0xFE,执行步骤2.2.1,如果canRead=1执行步骤2.2.2,如果canRead=0执行步骤2.2.3。

步骤2.2.1,canRead=0xFE表明是第一次写入,将待写入数据写入缓存区A。缓存区的写入次数writeTimes加1,更新缓存区A的更新标志bufAupdate等于 更新后的writeTimes,设置缓存区可读标志canRead为0。返回写入字节数,写入完成。

步骤2.2.2,canRead=1表明上一次写入为缓存区B,本次优先写入缓存区A,若缓存区A可写入标志为0,则将待写入数据写入缓存区A,缓存区的写入次数writeTimes加1,更新缓存区A的更新标志bufAupdate等于更新后的writeTimes,返回写入字节数,写入完成。如果缓存区A可写入标志大于0,判断缓存区B可写入标志,如果也不可写入,返回错误代码-2,表明写入锁死,异常出现。如果缓存区B可以写入,为防止被高优先级读取任务打断,先临时设置缓存区A可读,canRead=0,待写入数据写入缓冲区B,缓存区的写入次数writeTimes加1,更新缓存区B的更新标志bufBupdate等于更新后的writeTimes,恢复缓存区B的可读状态canRead=1,返回写入字节数,写入完成。

步骤2.2.3,canRead=0的表明上一次写入为缓存区A,情况判断和操作逻辑与canRead=1相同。

双缓存读取操作:

图4为双缓存的读取操作流程,包含以下步骤:

步骤3.1、读取任务每个周期进行一次读取操作。根据输入参数首先判断待读取数据大小是否合理。如果超出单个缓存区能处理的最大值,返回错误代码-1,读取失败。

步骤3.2、根据读取任务与写入任务的优先级高低,分成两种操作方式,若读取任务优先级高于或等于写入任务的读取操作,执行步骤3.2.1,否则执行步骤3.2.2。

步骤3.2.1,先判断缓存区可读标志canRead,如果canRead=0xFE,缓存区 为空,返回0。如果canRead=1缓存区B可读,根据缓存区B的更新状态是否大于本次读取任务id对应的读取更新标志update[i],判断本次读取的数据是否有更新,如果有更新,先记录更新标志update[i],然后读缓存区B,返回读取字节数。如果没有更新,返回0。如果canRead=0缓存区A可读,判断操作逻辑与B可读相同。

步骤3.2.2、先读取writeA,若writeA大于0,执行步骤3.2.2A,若writeA等于0,writeB大于0,执行步骤3.2.2B,若writeA和writeB都等于0,执行步骤3.2.2C。

步骤3.2.2A、若writeA大于0表明缓存区A正在被其他任务读取,当前任务也去应该读取缓存区A,根据缓存区A的更新状态是否大于本次读取任务id对应的读取更新标志update[i],判断本次读取的数据是否有更新,如果有更新,先记录更新标志update[i],writeA加1,然后读缓存区A,writeA减1,返回读取字节数,完成本次读取。如果没有更新返回0。

步骤3.2.2B、若writeB大于0表明缓存区B正在被其他任务读取,当前任务也去应该读取缓存区B,根据缓存区B的更新状态是否大于本次读取任务id对应的读取更新标志update[i],判断本次读取的数据是否有更新,如果有更新,先记录更新标志update[i],writeB加1,然后读缓存区B,writeB减1,返回读取字节数,完成本次读取。如果没有更新,返回0。

步骤3.2.2C如果writeA和writeB同时为0,两个缓存区都没有被其他任务读取,根据canRead的值按步骤3.2.1执行。

双缓存删除操作

释放指定双缓存结构的缓存区A、缓存区B的已分配内存,将单个缓冲区 能处理的最大字节数置0。

可以理解的是,对本领域普通技术人员来说,可以根据本发明的技术方案及其发明构思加以等同替换或改变,而所有这些改变或替换都应属于本发明所附的权利要求的保护范围。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号