公开/公告号CN107368374A
专利类型发明专利
公开/公告日2017-11-21
原文格式PDF
申请/专利权人 广州路派电子科技有限公司;
申请/专利号CN201710620299.4
申请日2017-07-26
分类号G06F9/52(20060101);G06F9/54(20060101);G06F11/07(20060101);
代理机构11516 北京文苑专利代理有限公司;
代理人王炜
地址 510663 广东省广州市萝岗区科学大道中路99号科汇金谷园区科汇二街十九号六楼自编A1栋602房
入库时间 2023-06-19 03:47:06
法律状态公告日
法律状态信息
法律状态
2023-07-11
专利权的转移 IPC(主分类):G06F 9/52 专利号:ZL2017106202994 登记生效日:20230628 变更事项:专利权人 变更前权利人:广州路派电子科技有限公司 变更后权利人:广州路派流马科技有限公司 变更事项:地址 变更前权利人:510663 广东省广州市萝岗区科学大道中路99号科汇金谷园区科汇二街十九号六楼自编A1栋602房 变更后权利人:510000 广东省广州市黄埔区科学城天泰一路2号自编六栋三楼301
专利申请权、专利权的转移
2023-05-30
专利权质押合同登记的注销 IPC(主分类):G06F 9/52 授权公告日:20190806 申请日:20170726 专利号:ZL2017106202994 登记号:Y2021980001501 出质人:广州路派电子科技有限公司 质权人:中国银行股份有限公司广州开发区分行 解除日:20230515
专利权质押合同登记的生效、变更及注销
2019-08-06
授权
授权
2017-12-15
实质审查的生效 IPC(主分类):G06F9/52 申请日:20170726
实质审查的生效
2017-11-21
公开
公开
技术领域
本发明涉及一种用于嵌入式系统基于同步机制下的环形数据缓冲实现方法。
背景技术
嵌入式通信程序中,经常有这样一个情景:需要程序一边从通讯接口接收数据,一边解析接收的数据。具体情景为:嵌入式系统在采集并解析汽车数据的系统应用中,系统必须采集数据的同时根据这些实时数据以一定的形式向用户表达出来,或者根据数据做出一些逻辑运算等一系列可能比较耗时的工作。这样的情景一般存在以下约束:
1)由于实时性要求,必须边读取数据,边对数据进行解析,不能等数据全部接收完整后才能开始解析,同时也不能等解析完一帧数据后才开始接收下一帧数据;
2)数据的解析需要兼容性能和内存空间的利用效率,特别是应用在内存等资源比较有限的嵌入式系统环境中,所以要做到减少内存之间的直接拷贝,分配适当大小的缓存空间。
以上背景应用场景通常会使用环形缓冲方法来实现。
一般环形缓冲区的实现方法为:环形缓冲区通常有一个读指针和一个写指针,读指针指向环形缓冲区中可读的数据,写指针指向环形缓冲区中可写的缓冲区,通过移动读指针和写指针就可以实现缓冲区的数据读取和写入。
图1、图2和图3是一个环形缓冲区的运行示意图。图1是环形缓冲区的初始状态,可以看到读指针和写指针都指向第一个缓冲区处;图2是向环形缓冲区中添加了一个数据后的情况,可以看到写指针已经移动到数据块2的位置,而读指针没有移动;图3是环形缓冲区进行了读取和添加后的状态,可以看到环形缓冲区中已经添加了两个数据,已经读取了一个数据。
以上是现有技术的环形缓冲的基本实现原理和模型,在实际应用中存在诸多的问题:1)读指针和写指针会出现重叠的情况,这可能导致读取的数据不准确;2)当外部模块从缓存中读取数据的速度跟不上向该缓存写数据速度时,会出现读取的数据帧的前后不连续问题,例如引用上面图3中的环形缓冲区,假设读指针保持在2号位置,把这一刻时间定义为T0,而写指针不断向前递增,当写指针已经从6号位置跳到1号时,把这一刻时间定义为T1,然后继续递增到4号位置,这时T1时刻3号位置的数据已经不是T0时刻的数据;这种情况在对于要求保持采集数据帧连续性要求较高的场合下的应用是不允许出现的;例如,在两个相对独立的模块或系统之间的通讯的应用中,为了确保数据的准确性和安全性,通常会把通讯数据定义为“帧头+数据+校验和”的格式,而且这里的“帧头”通常会分拆到两个或多个联系的数据上发送到另外一个系统,而“校验和”则要根据一帧数据来计算,数据发送端和接收端都要根据“帧头”和“校验和”来判断数据的有效性,并且排除干扰数据;假如把这类通讯方式使用了上述带有缺陷的环形缓冲区,则很多数据帧及数据之间原有的前后连续性都有可能被破坏而导致数据接收端的系统不能正确有效地分析通讯数据。
目前有文献提出使用软件计数器的方法来实现对环形缓冲的读写数据,其基本实现原理是这样的:在读数据和写数据时同时判断读指针和写指针的位置,为保证读写数据不发生上述的冲突,由这两个位置差可以得出还剩余多少空间可以写入数据的;但这样的结构会比较耗CPU资源,因为其要不断进行逻辑判断的操作。
发明内容
针对上述现有技术中存在的问题,本发明的目的在于提供一种可避免出现上述技术缺陷的用于嵌入式系统基于同步机制下的环形数据缓冲实现方法。
为了实现上述发明目的,本发明提供的技术方案如下:
一种用于嵌入式系统基于同步机制下的环形数据缓冲实现方法,包括四个工作状态的切换;所述四个工作状态,分别是:
工作状态一:环形缓冲区里面没有可读的数据;
工作状态二:环形缓冲区里面有充足的内存可以储存更多的数据;
工作状态三:环形缓冲区里缓存了充足的数据;
工作状态四:环形缓冲区里面没有可写的缓存空间;
所述四个工作状态的切换过程为:
在工作状态一写入数据时,就切换到工作状态二;
在工作状态二继续写入数据时,如果缓冲区被新增加的数据写满,就进入工作状态四,如果新增的数据没能使缓冲区填满,则还是保持在工作状态二;
在工作状态二下,读取缓冲区的数据,如果读取的数据大小小于缓冲区缓冲好的数据大小,就进入工作状态三,如果读取的数据大小超出或者等于缓冲区所缓存的数据,就进入工作状态四;
在工作状态三,读取数据时,当缓冲区没有数据可读时,就进入工作状态一,向缓冲区写入数据时,如果缓冲区被写满了数据,则进入工作状态四。
进一步地,在工作状态一下的环形缓存区中读取数据时,环形缓冲区会根据实际使用需求分两种情况来处理:
1)直接返回一个带有错误标志位的数据给调用该环形缓冲区的程序;
2)程序在这里挂起一段时间,在这时间段内有数据被写入到该环形缓冲区时,该环形缓冲区会立即返回一个单位大小的缓存数据给调用该环形缓冲区的程序;如果等待了这段时间仍然没有数据被写入到该环形缓冲区,则该环形缓冲区返回一个带有错误标志位的数据给调用该环形缓冲区的程序。
进一步地,在工作状态四下,继续向环形缓存区中写入数据时,该结构会根据实际使用需求分两种情况来处理:
1)直接返回一个带有错误标志位的数据给调用该环形缓冲区的程序;
2)程序在这里挂起一段时间;在这时间段内有其他缓存的数据从该环形缓存空间取出时,该形缓冲结构会立刻保存这个数据并返回不带有错误标志位的数据给调用该环形缓冲区的程序;如果等待了这段时间仍然没有其他缓存的数据从环形缓冲区中被取出,该环形缓冲区返回一个带有错误标志位的数据给调用该环形缓冲区的程序。
进一步地,所述环形数据缓冲实现方法嵌入有嵌入式系统的同步机制,所述同步机制在环形缓冲区上实现,分为三个步骤:初始化、写缓冲和读缓冲。
进一步地,初始化的输入有Max_Index和Unit_Size两参数;Max_Index定义了写信号量和读信号量的最大信号标量值;Unit_Size定义的是每次读缓存区或写缓存区的字节数大小。
进一步地,写缓冲的输入参数有Block、TimeOut和Value;Block决定是否使用挂起的模式,TimeOut决定挂起的时间,Value为要写入环形缓冲区内的数据。
本发明提供的用于嵌入式系统基于同步机制下的环形数据缓冲实现方法,使用了嵌入式操作系统自带的信号量同步机制,原有的环形缓冲区更加强壮,采用可配置和可移植的环形缓冲区,适用于不同的软件系统和不同的硬件体系,在不管是单个硬件系统的应用或是不同硬件系统之间的通讯上的应用,都能取得很好的效果,可以很好地满足实际应用的需要。
附图说明
图1为现有技术的环形缓冲区的初始状态示意图;
图2为现有技术的向环形缓冲区中添加了一个数据后的状态示意图;
图3为现有技术的环形缓冲区进行了读取和添加后的状态示意图;
图4为本发明的四个工作状态的切换过程示意图;
图5为同步机制的初始化流程图;
图6为同步机制的写缓冲流程图;
图7为同步机制的读缓冲流程图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,下面结合附图和具体实施例对本发明做进一步说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图4所示,用于嵌入式系统基于同步机制下的环形数据缓冲实现方法,包括四个工作状态的切换;
所述四个工作状态,分别是:
1.工作状态1:环形缓冲区里面没有可读的数据;在工作状态1下的环形缓存区中读取数据时,该环形缓冲区会根据实际使用需求分两种情况来处理:
1)直接返回一个带有错误标志位的数据给调用该环形缓冲区的程序;
2)程序在这里挂起(阻塞)一段时间,在这时间段内有数据被写入到该环形缓冲区时,该环形缓冲区会立即返回一个单位大小的缓存数据给调用该环形缓冲区的程序;如果等待了这段时间仍然没有数据被写入到该环形缓冲区,则该环形缓冲区返回一个带有错误标志位的数据给调用该环形缓冲区的程序。
2.工作状态2:环形缓冲区里面有充足的内存可以储存更多的数据;在工作状态2下向该环形缓冲区写入数据不会出现任何错误,并且有效数据写入缓存中。
3.工作状态3:环形缓冲区里缓存了充足的数据;在工作状态3下在该环形缓冲区读取数据不会出现任何错误,并且返回有效的缓存的数据。
4.工作状态4:环形缓冲区里面没有可写的缓存空间;在工作状态4下,继续向环形缓存区中写入数据时,该结构会根据实际使用需求分两种情况来处理:
1)直接返回一个带有错误标志位的数据给调用该环形缓冲区的程序;
2)程序在这里挂起(阻塞)一段时间;在这时间段内有其他缓存的数据从该环形缓存空间取出时,该形缓冲结构会立刻保存这个数据并返回不带有错误标志位的数据给调用该环形缓冲区的程序;如果等待了这段时间仍然没有其他缓存的数据从环形缓冲区中被取出,该环形缓冲区返回一个带有错误标志位的数据给调用该环形缓冲区的程序。
四个工作状态的切换过程为:
在工作状态1写入数据(例如5个单位数据)时,就切换到工作状态2;
在工作状态2继续写入数据时,如果缓冲区被新增加的数据写满,就进入工作状态4,如果新增的数据没能使缓冲区填满,则还是保持在工作状态2;
在工作状态2下,读取缓冲区的数据,如果读取的数据大小(例如4个单位数据)小于缓冲区缓冲好的数据大小,就进入工作状态3,如果读取的数据大小(例如7个单位数据)超出或者等于缓冲区所缓存的数据,就进入工作状态4;
在工作状态3,读取数据时,当缓冲区没有数据可读时,就进入工作状态1,向缓冲区写入数据时,如果缓冲区被写满了数据,则进入工作状态4。
从上述四个工作状态的切换效果来看,该环形缓冲区的缓存的可写空间和可读数据是互斥的,也就是当每向该环形缓冲区写入一个单位数据,该环形缓冲可再写入的环形缓冲空间就减少一个单位,同时可读的缓存数据的就会多一个单位大小;相反,每当从该环形缓冲区取出一个单位的数据,该能从该环形缓冲读取的缓存数据就减少一个单位大小,同时该环形缓冲就会多一个单位大小空间来储存新写入的数据。
上述环形缓冲区中有个关键的技术是可写入数据的空间大小和可读出缓存数据大小之间的同步关系。一般嵌入式操作系统都会带有同步机制的组件(API),而且不同嵌入式操作系统中的同步机制实现原理及使用方法基本类似。可以充分利用这些系统自带的同步机制嵌入到上述的环形缓冲区中。
本发明的用于嵌入式系统基于同步机制下的环形数据缓冲实现方法,嵌入有嵌入式系统的同步机制,所述同步机制在环形缓冲区上实现,分为三个步骤:初始化、写缓冲和读缓冲;
如图5所示,初始化的输入主要有Max_Index和Unit_Size两参数。Max_Index定义了写信号量(Write_Sem)和读信号量(Read_Sem)的最大信号标量值。Unit_Size定义的是每次读缓存区或写缓存区的字节数大小(一单元数据大小)。Write_Sem初始值定义为Max_Index,因为刚开始缓存区的数据为空,即可以写入Max_Index次数据(假如一直不读取数据或清空缓冲区),同样原理Read_Sem初始值定义为0(刚开始没数据可读)。初始化数据缓冲区大小为Unit_Size x Max_Index(Max_Index个单元数据)。Write_Pointer和Read_Pointer都被初始化为0,代表向该环形缓冲中读取数据和写数据刚开始都指向于缓冲数据的首地址。
如图6所示,写缓冲的输入参数有Block,TimeOut和Value这三个。Block决定是否使用挂起(阻塞)的模式,TimeOut决定挂起(阻塞)的时间。Value为要写入环形缓冲区内的数据。图6上Pend(x,x)和Accept(x)分别为阻塞型信号量获取或非阻塞型信号量获取的函数。阻塞型信号量获取函数:获取不到特定信号量(图6上为Write_Sem信号量为0时)则会阻塞,在阻塞时算起TimeOut时间段内依然获取不到特定的信号量,则退出阻塞状态并且返回带有错误标志位的数据(err=1),若获取到则返回,特定的信号量自减1,并且返回的数据(err=0)中不含有错误标志;非阻塞型信号量获取函数:如果获取到特定信号量(上图为Write_Sem)返回一不带有错误标志位的数据(err=0),否则返回带有错误标志位的数据(err=1)。非阻塞型信号量获取函数调用过程都不会有阻塞的情况发生。接着根据这个数据err来判断是否进一步向数据缓冲Buffer特定位置写入用户数据(Value),当写入数据后,将Read_Sem进行递增在这里用函数Add(x)所表示,当递增到大于信号量最大标量值Max_Index时,Read_Sem不会再被递增。相应的写指针进行循环递增,递增到大于或等于Max_Index时,写指针又再指向缓冲数据的首地址处。最后返回获取特定信号量时所得到的返回值err。
如图7所示,读缓冲与写缓冲区的区别主要是这里要获取的特定的信号量是读信号量(Read_Sem),而成功读取数据后,要递增的是写信号量(Write_Sem),循环递增的是读指针,返回的是带有或不带有错误标志位的数据err和从缓冲区特定位置所读取的数据。
在上述的读缓冲和写缓冲中提及到的阻塞型信号量获取函数Pend(x,x),非阻塞型信号量获取函数Accept(x),x信号量递增函数Add(x),在各个带有信号量的嵌入式操作系统都有自己相应的原型,如UCOS操作系统中的函数:OSSemPend(),OSSemAccept(),OSSemPost();Linux操作系统中的函数:sem_wait(),sem_trywait(),sem_post()。这些函数的好处在于减轻软件编写的压力和有效地利用资源。
本发明提供的用于嵌入式系统基于同步机制下的环形数据缓冲实现方法,使用了嵌入式操作系统自带的信号量同步机制,原有的环形缓冲区更加强壮,采用可配置和可移植的环形缓冲区,适用于不同的软件系统和不同的硬件体系,在不管是单个硬件系统的应用或是不同硬件系统之间的通讯上的应用,都能取得很好的效果,可以很好地满足实际应用的需要。
以上所述实施例仅表达了本发明的实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。
机译: 嵌入式系统基于同步机制的环形数据缓冲实现方法
机译: 用于特别是在嵌入式系统中的类型化数据语言的方法以及用于实现该方法的嵌入式系统
机译: 基于移动通信的基于交叉开发环境的嵌入式系统实现方法