用于LTE中RLC与相邻层的数据传输方法与流程

文档序号:11215916阅读:1036来源:国知局
用于LTE中RLC与相邻层的数据传输方法与流程

本发明涉及移动通信技术领域,尤其是涉及一种用于lte移动通信系统(包括tdd-lte和fdd-lte)中两个任务之间消息的发送和接收的无锁机制。



背景技术:

lte的无线接入网协议分为三个层次:物理层(l1)、数据链路层(l2)以及无线资源控制层(l3)。l2进一步分为媒介接入控制层(mac,mediumaccesscontrol)、无线链路控制层(rlc,radiolinkcontrol)、分组数据收敛协议层(pdcp,packetdataconvergenceprotocol)。现有rlc子层属于用户面l2的协议,位于pdcp层和mac层之间。rlc(无线链路控制协议)层主要负责无线接入网络的无线链路控制,为用户面数据和控制面数据提供传输服务,提供am(acknowledgedmode,确认模式)、um(unacknowledgedmode,非确认模式)、tm(transparentmode,透明模式)三种模式的数据传输。其中tm模式的数据是l3不经过pdcp层的处理直接透传给rlc子层,rlc不进行任何加工直接透传给mac,um模式和am模式的数据是pdcp层下发给rlc,rlc再根据调度结果指示对rlcsdu进行分段、级联,最后加上rlc层的头部信息下发给mac。

任务之间可以进行通信,任务之间的通信方式包括:消息队列、共享内存、信号量、信号、管道以及事件等。目前rlc任务与上下层任务之间的数据传输采用前两种方法的实现比较广泛。如果采用消息队列进行数据通信的话,rlc任务与上下层任务会共同访问同一个消息队列,在对消息队列中的消息进行插入和读取时,就要加锁进行保护,这样就会导致一些额外的系统开销。如果采用共享内存的方式进行数据通信的话,就需要一块rlc和上下层都能够访问得到的共享存储区,并设计读写机制,数据发送方在共享内存里面写完数据以后,需要通过发消息或者信号量等方式通知rlc去读取这块数据,来保证两个模块对共享存储区的正确读写,在一定程度上就会影响rlc的处理性能。

在lte大容量、高速通信系统中,rlc是一个半实时性任务,需要根据调度结果按照时序周期进行组帧,这就需要一种机制来保证rlc发送模块在严格按照调度周期规定的时序将数据发出,不能因为与上下层之间的数据传输带来额外的系统开销。综上所述,目前没有一种比较适合移动通信系统数据链路层与上下层之间的利用消息传输数据的方案,以便移动通信系统能够高效、合理的进行数据链路上的数据传输。



技术实现要素:

本发明针对现有技术的问题,结合lte系统数据链路层的架构需求,设计一种方案实现lte中rlc层与上下层之间的数据传输,很好地减小由于层间数据通信带来的额外的系统开销。

本发明的技术方案提供一种用于lte中rlc与相邻层的数据传输方法,所述rlc为无线链路控制层,rlc的数据交互层为相邻的mac层或pdcp层;rlc为发送端时,数据交互层作为接收端;rlc为接收端时,数据交互层作为发送端;数据传输包括以下步骤,

步骤1,初始化过程,包括以下子步骤,

步骤1-1,开辟一块共享内存,该共享内存rlc和数据交互层之间都能够访问;

步骤1-2,初始化ringbuffer,定义参数totringnum、insoff、rmvoff以及msgq[max_ring_num],

其中,

totringnum为ringbuffer中能够缓存的消息的个数max_ring_num;

insoff为写入指针,取值范围为[0,max_ring_num-1];

rmvoff为读取指针,取值范围为[0,max_ring_num-1];

msgq[max_ring_num]为存放数消息的指针数组;

步骤2,发送端对ringbuffer进行写操作,把封装好的消息的首地址放在ringbuffer中;包括以下子步骤,

步骤2-1,发送端封装数据,包括在步骤1-1开辟的共享内存中申请一块共享内存datapnt,并把要传输的数据以及该数据的长度指示msglen封装在共享内存datapnt中;

步骤2-2,对ringbuffer进行写操作,把封装消息的内存指针写在ringbuffer里,更新insoff;

步骤3,接收端对ringbuffer进行读操作,取出ringbuffer中封装数据的内存指针,处理数据后释放共享内存;包括以下子步骤,

步骤3-1,对ringbuffer进行读操作,从ringbuffer里读取封装消息的内存指针,更新rmvoff;步骤3-2,接收端根据datapnt指针首先读取四字节的数据长度指示msglen,然后根据msglen还原数据,处理数据后释放共享内存。

而且,步骤2-2中,首先判断ringbuffer是否已经被写满,如果ringbuffer已满则丢弃该数据,并释放内存结束这次数据的发送,如果ringbuffer未满则把封装消息的这块内存指针写在ringbuffer里面,更新insoff的值。

而且,判断ringbuffer已满的条件为,

((insoff+1)%max_ring_num)=rmvoff

其中,%为取模运算符;

而且,把封装消息的内存指针写在ringbuffer里面,包括令msgq[insoff]=datapnt。

而且,更新insoff的值为,

insoff=(insoff+1)%max_ring_num

其中,%为取模运算符。

而且,步骤3-1中,首先判断ringbuffer是否为空,若ringbuffer为空,则结束这次读取动作,若ringbuffer是不为空,则从ringbuffer里读取封装消息的内存指针,更新rmvoff的值。

而且,判断ringbuffer为空的条件为,insoff=rmvoff。

而且,从ringbuffer里读取封装消息的内存指针,包括令datapnt=msgq[rmvoff]。

而且,更新rmvoff的值为,

rmvoff=(rmvoff+1)%max_ring_num

其中,%为取模运算符。

针对lte系统高速率、大容量的特点,本发明设计了一种适用lte系统数据链路层的消息收发机制。该方法首先要求开辟一块rlc与数据交互层之间都可以访问得到共享内存来封装消息(数据),然后利用无锁ringbuffer技术,消息(数据)发送端把封装消息(数据)的这块内存指针写入ringbuffer中,消息(数据)接收端从ringbuffer中读出封装消息(数据)的这块内存指针进行处理,减少了消息(数据)传输过程中的内存拷贝以及对消息队列进行操作时锁保护带来的系统开销,实现层与层之间高效数据传输。因此,该方案能够减小rlc与上下层之间的数据传输带来的额外系统开销,提高了基站系统的处理性能,在通信领域具有重要的市场价值。

附图说明

图1是本发明实施例中发送端消息封装示意图;

图2是本发明实施例中rlc作为发送端的ringbuffer初始化示意图;

图3是本发明实施例中rlc作为发送端的ringbuffer读写操作示意图;

图4是本发明实施例中ringbuffer为满的场景示意图;

图5是本发明实施例中ringbuffer为空的场景示意图;

图6是本发明实施例中rlc作为接收端的ringbuffer初始化示意图;

图7是本发明实施例中rlc作为接收端的ringbuffer读写操作示意图。

具体实施方式

本发明针对现有技术的问题,结合lte系统数据链路层的架构需求,设计一种方案实现lte中rlc层与交互层之间的数据传输,减小层与层之间的消息交互带来的额外系统开销。

以下结合附图和实施例详细说明本发明技术方案,提供了对该实施例的全面理解的详细细节。但是,本领域的技术人员应当了解,无需一些所示细节也可以实施本发明。另外,某些公知结构或功能没有进行详细的说明,以免使本发明的实施例相关说明不清楚。

根据本发明的实施例,提出了一种rlc与相互层之间数据传输的新设计,结合共享内存、无锁ringbuffer技术,减小由于层间数据通信带来的额外的系统开销,实现层与层之间高效的数据传输。rlc的数据交互层为相邻的mac层或pdcp层;rlc为发送端时,数据交互层作为接收端;rlc为接收端时,数据交互层作为发送端。

ringbuffer仅适用于单读-单写的场景,即只能一个任务对ringbuffer进行写操作,而且也只能有一个任务对ringbuffer进行读操作,这样才能利用ringbuffer实现无锁设计。因此,本发明针对rlc与上下层之间的数据传输,基于这种特性,提出了结合共享内存的解决方案:

首先,规划出一块共享内存,这块内存在rlc与其数据交互层之间都可以访问得到。

rlc给其它层发送消息时:rlc申请一块共享内存,并把要传输的数据(消息)以及该数据(消息)长度指示封装在这块共享内存里面;rlc层对ringbuffer进行写操作,把封装好的消息的首地址放在ringbuffer中;接收层对ringbuffer进行读操作,取出ringbuffer中封装数据(消息的)的内存指针;接收层根据封装在共享内存中的数据(消息)长度指示访问及处理共享内存中的数据(消息),然后释放共享内存。

rlc接收发送层所发消息时:发送端申请一块共享内存,并把要传输的数据(消息)以及该数据(消息)长度指示封装在这块共享内存里面;发送端层对ringbuffer进行写操作,把封装好的消息的首地址放在ringbuffer中;rlc层对ringbuffer进行读操作,取出ringbuffer中封装数据(消息)的内存指针;rlc层根据封装在共享内存中的数据(消息)长度指示访问及处理共享内存中的数据(消息),然后释放共享内存。

具体实施时可参考软件技术实现自动运行流程,下面结合附图以rlc作为发送端对实施例进行详细说明,rlc作为接收端的实施是下面步骤的逆过程,rlc作为发送端的实施流程包括以下步骤:

步骤1:初始化过程

1-1,开辟一块共享内存,该共享内存rlc和数据交互层(记为层n,可为mac层或pdcp层)之间都可以访问得到;

1-2,如图2所示,初始化环形缓冲区ringbuffer,定义下面几个参数:totringnum、msgq[max_ring_num]、insoff以及rmvoff,其中totringnum为ringbuffer中可以缓存的消息的个数,即环形缓冲区最大缓存个数max_ring_num;msgq[max_ring_num]为存放数据(消息)的指针数组;insoff为对ringbuffer进行写操作时要写入的指针数组的下标,取值范围为[0,max_ring_num-1];rmvoff为对ringbuffer进行读操作时要读取的指针数组的下标,取值范围为[0,max_ring_num-1]。在初始化时,totringnum、insoff以及rmvoff全初始化为0,环形缓冲区最大缓存个数max_ring_num可由本领域技术人员根据系统数据处理速度预先定义。

步骤2:rlc作为发送端,对ringbuffer进行写操作,如图3所示:

2-1,rlc封装数据:如图1所示,rlc申请一块共享内存,并把要传输的数据(消息)以及该数据(消息)长度指示封装在这块共享内存里面

rlc层在1-1中开辟的共享内存中申请一块适合数据大小的共享内存datapnt,然后把数据(消息)以及数据(消息)长度指示msglen封装在这块共享内存里,其中共享内存的大小不能小于数据(消息)+4字节数据长度指示msglen的总大小,数据长度指示在本实施例中的数据类型为无符号整形,可以指示数据的最大长度为2g字节。具体实施时也可设置为其他数据类型、长度。

2-2,对ringbuffer进行写操作,把封装消息的这块内存指针(即封装好的消息的首地址)写在ringbuffer里。

2-2-1,首先判断ringbuffer是否已经被写满,如图4所示,rlc已经在ringbuffer里写了max_ring_num-1个消息指针,且这些写入的消息指针都未被接收层读取。如果ringbuffer已满则丢弃该数据,并释放内存结束这次数据的发送,如果ringbuffer未满则跳到步骤2-2-2。其中判断ringbuffer为full的判断条件为:

((insoff+1)%max_ring_num)=rmvoff

其中%为取模运算符。

本步骤提出,在对ringbuffer进行写操作时,把封装消息的这块内存指针写在ringbuffer里,首先根据以上条件判断ringbuffer是否已经被写满。

2-2-2,如果ringbuffer未满,则把封装消息的这块内存指针写在ringbuffer里面,即

msgq[insoff]=datapnt

2-2-3,更新insoff的值为

insoff=(insoff+1)%max_ring_num

其中%为取模运算符。

使用ringbuffer设计时,如果写操作任务对报文的处理速度若大于读操作任务对报文的处理速度,就可能出现ringbuffer被写满而被丢包的情况。为了减少这种情况的发生,max_ring_num的值可根据应用场景定义的略大一些,给读操作的任务多一些缓冲时间。进一步地,由于rlc层pdu(protocoldataunit,协议数据单元)sn(sequencenumber,序列号)的取值范围为0~1023,pdcp层pdusn的取值范围为0~4095,所以优先地,在rlc与pdcp层进行数据传输时建议max_ring_num的取值不小于2048,rlc与mac层进行数据传输时建议max_ring_num的取值不小于512。在具体实现时,本领域技术人员可以根据系统测试情况定义一个比较合理的数值。

步骤3:接收层对ringbuffer进行读操作,取出ringbuffer中封装数据(消息的)的内存指针;接收层根据封装在共享内存中的数据(消息)长度指示访问及处理共享内存中的数据(消息),然后释放共享内存。

3-1,对ringbuffer进行读操作,从ringbuffer里读取封装消息的这块内存指针

实施例中层n(pdcp层或者mac层)作为接收端,对ringbuffer进行读操作,如图3所示:

3-1-1,首先判断ringbuffer是否为空,如图5所示,即ringbuffer里没有可以读取的消息指针;若ringbuffer为空,则结束这次读取动作,若ringbuffer是不为空,则跳到步骤3-1-2。其中,判断ringbuffer为empty的判断条件为:

insoff=rmvoff

本发明提出,在对ringbuffer进行读操作,从ringbuffer里读取封装消息的这块内存指针时,首先根据以上条件判断ringbuffer是否为空。

3-1-2,如果ringbuffer不为空,则从ringbuffer里读取封装消息的内存指针,即

datapnt=msgq[rmvoff]

3-1-3,更新rmvoff的值为

rmvoff=(rmvoff+1)%max_ring_num

其中%为取模运算符。

3-2,接收层处理完消息封装的数据后,释放共享内存。

3-2-1,根据datapnt指针首先读取四字节的数据长度指示msglen,然后根据msglen还原出整个数据

3-2-2,接收端对还原后的数据进行相应的处理后,释放改共享内存

步骤2和步骤3中,在对ringbuffer进行读写操作时,写入和读出的都是封装消息(数据)的这块内存指针,而不是消息(数据)本身。

rlc作为接收端的实施步骤是rlc作为发送端对ringbuffer操作实施步骤的逆过程。

步骤1,初始化过程,发送端申请一块共享内存,并把要传输的数据(消息)以及该数据(消息)长度指示封装在这块共享内存里面,包括开辟一块共享内存,该共享内存rlc和数据交互层之间都可以访问得到,并totringnum、insoff、rmvoff以及msgq[max_ring_num]相关参数,如图6所示。

步骤2,发送端对ringbuffer进行写操作。如图7所示,操作步骤参考rlc作为接收端的实施例说明的步骤2,包括由发送端对ringbuffer进行写操作,把封装好的消息的首地址放在ringbuffer中。

步骤3,rlc层对ringbuffer进行读操作。如图7所示,操作步骤参考rlc作为接收端的实施例说明的步骤3,包括rlc层对ringbuffer进行读操作,取出ringbuffer中封装数据(消息)的内存指针;rlc层根据封装在共享内存中的数据(消息)长度指示访问及处理共享内存中的数据(消息),然后释放共享内存。

以上内容是结合具体的实施方式对本发明所作的进一步详细说明,不能认定本发明的具体实施只局限于这些说明。对于本发明所属技术领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干简单推演或替换,都应当视为属于本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1