一种环式链表DMA的传输方法及系统与流程

文档序号:21030926发布日期:2020-06-09 20:11阅读:867来源:国知局
一种环式链表DMA的传输方法及系统与流程

本发明涉及数据传输及存储领域,具体涉及一种环式链表dma的传输方法及系统。



背景技术:

网络设备对数据传输速率的要求日益增高,利用dma(directmemoryaccess,直接内存存取)来传输数据有效提高了cpu的效率。但是dma的配置和中断处理依然会占用cpu资源。

目前dma有两种实现方式,一种是块式dma,一种是链式dma。块式dma可将多个数据包一次传输,减少中断处理。但cpu处理数据时需将数据包从整块数据中解析出来并拷贝到相应缓存,增加了cpu的工作。链式dma可将不同数据包的传输地址记录在链表中,dma通过读取链表信息进行传输,当链表表项全部处理完后才上报中断。若数据包连续,链表表项越多dma效率越高,若数据包不连续,表项过多会增加等待链表完成时间,降低cpu对数据的处理效率。如果链表表项较少,中断会增多,中断处理将会占用大量cpu资源。

以上两种dma的实现方式各有利弊,其应用于不同场景中时,无法根据实际数据传输的情况灵活调整,无法平衡cpu处理速度与网络传输速度不同导致的无效等待和中断处理。使得在短包,大数据流量的应用场景下,完成dma数据传输和数据包处理时,cpu资源占用率会较高。



技术实现要素:

针对现有技术中存在的缺陷,本发明的目的在于提供一种环式链表dma的传输方法,其能减少上报中断次数,从而减少了cpu响应中断的时间,降低了cpu的资源占用。

为达到以上目的,本发明采取的技术方案是:

一种环式链表dma的传输方法,该方法包括以下步骤:

cpu在内存中设置表项链接地址首尾相连的环式链表,并为环式链表的每个表项配置传输状态标志位后开启直接内存存取dma;

dma控制器循环读取每个表项的传输状态标志位的状态,以确定是上报dma中断至cpu,还是进行dma传输,并更改传输状态标志位的状态以和cpu进行信息交互;

cpu在接收到dma中断时处理中断信息,在处理完中断信息或空闲时循环读取每个表项的传输状态标志位的状态,以确定是离开dma任务,并在预设时间后返回,还是处理dma传输的数据,并更改传输状态标志位的状态以和dma控制器进行信息交互。

在上述技术方案的基础上,所述传输状态标志位包括第一状态和第二状态,所述cpu将环式链表的每个表项的传输状态标志位初始化为第一状态后开启dma。

在上述技术方案的基础上,dma控制器循环读取每个表项的传输状态标志位的状态,以确定是上报dma中断至cpu,还是进行dma传输,并更改传输状态标志位的状态以和cpu进行信息交互,具体包括:

s21.dma控制器判断读取的一表项的传输状态标志位的状态是第一状态还是第二状态,若是第二状态,则执行步骤s22,若是第一状态,则执行步骤s23;

s22.dma控制器判断cpu未及时处理dma传输的数据,上报中断至cpu;

s23.dma控制器进行dma传输,且将传输状态标志位从第一状态更改为第二状态以通知cpu传输完成,并读取下一表项的传输状态标志位,返回步骤s21。

在上述技术方案的基础上,当dma控制器判断读取的一表项的传输状态标志位的状态是第二状态时,设定一延时时间,在延时时间过后再次读取该表项的传输状态标志位,若仍是第二状态,则上报中断至cpu。

在上述技术方案的基础上,cpu循环读取每个表项的传输状态标志位的状态,以确定是离开dma任务,并在预设时间后返回,还是处理dma传输的数据,并更改传输状态标志位的状态以和dma控制器进行信息交互,具体包括:

s31.cpu判断读取的一表项的传输状态标志位的状态是第一状态还是第二状态,若是第一状态,则执行步骤s32,若是第二状态,则执行步骤s33;

s32.cpu判断dma控制器未传输完对应的数据,离开dma任务,并在预设时间后返回;

s33.cpu处理dma控制器传输的数据,且将传输状态标志位从第二状态更改为第一状态以告知dma控制器可传输数据,并读取下一表项的传输状态标志位,返回步骤s31。

本发明的另一个目的在于提供一种环式链表dma的传输系统,其能减少上报中断次数,从而减少了cpu响应中断的时间,降低了cpu的资源占用。

为达到以上目的,本发明采取的技术方案是:

一种环式链表dma的传输系统,包括cpu和dma控制器;

所述cpu用于在内存中设置表项链接地址首尾相连的环式链表,并为环式链表的每个表项配置传输状态标志位后开启直接内存存取dma;

所述dma控制器用于循环读取每个表项的传输状态标志位的状态,以确定是上报dma中断至cpu,还是进行dma传输,并更改传输状态标志位的状态以和cpu进行信息交互;

且所述cpu还用于在接收到dma中断时处理中断信息,在处理完中断信息或空闲时循环读取每个表项的传输状态标志位的状态,以确定是离开dma任务,并在预设时间后返回,还是处理dma传输的数据,并更改传输状态标志位的状态。

在上述技术方案的基础上,所述传输状态标志位包括第一状态和第二状态,所述cpu将环式链表的每个表项的传输状态标志位初始化为第一状态后开启dma。

在上述技术方案的基础上,

所述dma控制器用于判断读取的一表项的传输状态标志位的状态是第一状态还是第二状态;

若是第二状态,所述dma控制器判断所述cpu未及时处理dma传输的数据,上报中断至所述cpu;

若是第一状态,所述dma控制器进行dma传输,且将传输状态标志位从第一状态更改为第二状态以通知cpu传输完成,并读取下一表项的传输状态标志位,再次判断下一表项传输状态标志位的状态,以循环判断环式链表的每个表项。

在上述技术方案的基础上,当所述dma控制器判断读取的一表项的传输状态标志位的状态是第二状态时,设定一延时时间,在延时时间过后再次读取该表项的传输状态标志位,若仍是第二状态,则上报中断至cpu。

在上述技术方案的基础上,

所述cpu用于判断读取的一表项的传输状态标志位的状态是第一状态还是第二状态;

若是第一状态,所述cpu判断所述dma控制器未传输完对应的数据,离开dma任务,并在预设时间后返回;

若是第二状态,所述cpu处理所述dma控制器传输的数据,且将传输状态标志位从第二状态更改为第一状态以告知dma控制器可传输数据,并读取下一表项的传输状态标志位,以循环判断环式链表的每个表项。

与现有技术相比,本发明的优点在于:

本发明的环式链表dma的传输方法,其利用带有传输状态标志位的环式链表,使得dma控制器可自主从环式链表中循环取走配置信息,并通过传输状态标志位告知cpu传输完成的信息。cpu在处理完传输数据后接着读取下一个链表状态标志位,并根据标志位状态配置新的表项。避免了dma控制器每完成一次传输就上报中断,大大减少了上报中断次数,使得cpu不会频繁被dma中断所干扰,减少了cpu响应中断的时间,大大降低了cpu的资源占用。

附图说明

图1为本发明实施例中环式链表dma的传输方法的流程图;

图2为本发明实施例中环式链表的结构示意图;

图3为图1中步骤s2的流程图;

图4为图1中步骤s3的流程图;

图5为本发明实施例中环式链表dma的传输系统的结构框图。

具体实施方式

以下结合附图及实施例对本发明作进一步详细说明。

参见图1所示,本发明实施例提供一种环式链表dma的传输方法,该方法包括以下步骤:

s1.cpu在内存中设置表项链接地址首尾相连的环式链表,并为环式链表的每个表项配置传输状态标志位后开启直接内存存取dma。

具体而言,本实施例中的环式链表包括多个表项,表项的个数可以根据实际情况来进行配置,参见图2所示,表项链接地址首尾相连成环,在每个表项的内容用于配置dma传输特性,其内容包括数据传输源地址、数据传输目的地址,数据传输长度,下一个表项的链接地址,传输状态标志位。

在本实施例中,传输状态标志位包括第一状态和第二状态,处于第一状态时,传输状态标志位被配置为1,处于第二状态时,传输状态标志位被配置为0。

具体而言,cpu将dma传输配置信息填入表项时,将传输状态标志位配置为1,表示该表项待进行传输处理。当dma控制器完成该表项的数据传输后,将标志位配置为0,表示该表项已传输完成。

在本实施例中,cpu将环式链表的每个表项的传输状态标志位初始化为第一状态后开启dma,也就是说每个表项都待进行传输处理。

s2.dma控制器循环读取每个表项的传输状态标志位的状态,以确定是上报dma中断至cpu,还是进行dma传输,并更改传输状态标志位的状态以和cpu进行信息交互。

具体而言,参见图3所示,步骤s2包括:

s21.dma控制器判断读取的一表项的传输状态标志位的状态是第一状态还是第二状态,若是第二状态,则执行步骤s22,若是第一状态,则执行步骤s23;

s22.dma控制器判断cpu未及时处理dma传输的数据,上报中断至cpu;

s23.dma控制器进行dma传输,且将传输状态标志位从第一状态更改为第二状态以通知cpu传输完成,并读取下一表项的传输状态标志位,返回步骤s21。

在本实施例中,dma控制器上报中断至cpu是极为罕见的,因为,dma控制器在完成每一次dma传输后,并不会上报中断,而是将传输状态标志位从第一状态更改为第二状态,即将传输状态标志位从1更改为0,来告诉cpu当前表项已经传输完毕,随后dma控制器就会处理下一个表项,由于环式链表包括多个表项,只要dma控制器还有待处理的表项,就能够容忍cpu暂时不处理已经传输完的数据。只有在dma控制器完成了一个循环,即将环式链表的所有表项均处理完成时,此时dma控制器回到起点,读取该表项的传输状态标志位,若仍然为0,则表示cpu并没有处理该表项中的数据,在这种情况下,dma控制器才会上报中断至cpu,通知cpu来进行处理。

由此可知,本实施例中的传输方法可以大大减少上报中断的次数,为尽可能提升cpu效率,在内存应用允许的范围内,cpu应根据系统数据传输速率和自身处理能力,配置合理的环式链表的表项数量。这样,当cpu在其它任务中无暇处理dma传输数据时,dma控制器会自动读取环式链表的表项配置信息进行数据传输,表项数越多,能容忍cpu处理其它事务的时间越长,但也会占用更多的内存资源,可以通过具体的情况来找到一个较好的平衡点。

作为一个较好的实施方式,为了进一步减少上报中断的次数,当dma控制器判断读取的一表项的传输状态标志位的状态是第二状态时,设定一延时时间,在延时时间过后再次读取该表项的传输状态标志位,若仍是第二状态,则上报中断至cpu。也就是说,在dma控制器在处理完所有表项的传输后,仍然会给cpu一定的处理时间,只有在延时时间过后,才会上报中断至cpu。

优选地,本实施例中的cpu将环式链表的首地址写入dma控制器,dma控制器获取环式链表首地址后,从首地址对应的表项开始处理,比如可以从第一个表项开始处理。

s3.cpu在接收到dma中断时处理中断信息,在处理完中断信息或空闲时循环读取每个表项的传输状态标志位的状态,以确定是离开dma任务,并在预设时间后返回,还是处理dma传输的数据,并更改传输状态标志位的状态以和dma控制器进行信息交互。

具体而言,参见图4所示,步骤s3包括:

s31.cpu判断读取的一表项的传输状态标志位的状态是第一状态还是第二状态,若是第一状态,则执行步骤s32,若是第二状态,则执行步骤s33;

s32.cpu判断dma控制器未传输完对应的数据,离开dma任务,并在预设时间后返回;

在本实施例中,cpu可以是经过一个任务调度时间后返回。

s33.cpu处理dma控制器传输的数据,且将传输状态标志位从第二状态更改为第一状态以告知dma控制器可传输数据,并读取下一表项的传输状态标志位,返回步骤s31。

下面对cpu和dma控制器之间的信息交互做出进一步介绍:

cpu在内存中分配一个链表存储空间,并配置好表项数为n的环式链表,启动dma。

dma被启动后,从环式链表的起始位置读取表项1的传输的配置信息,开始等待业务接口(源地址)的数据包,当数据包准备好后,dma控制器将数据包传输至系统内存(目的地址)。传输完成后,dma控制器将环式链表对应表项的传输状态标志位置为0。

dma控制器根据表项1记录的表项2的链接地址去读取表项2的配置信息,开始第二次数据包传输,当第二次传输完成后将表项2的传输标志位置为0,然后依次顺序取走后续表项信息进行数据传输。

cpu启动dma后,查看表项1的传输状态标志位,如果为0,则开始处理传输完成的数据,并将更新的传输信息配置到表项1中,并将状态标识位置为1。依次顺序读取下一个表项,直至某一表项状态标识位为1时,cpu离开处理其它事务。

dma控制器读取表项n的信息并完成传输后,表项n的下一个表项链接地址会指向表项1。dma控制器读取表项1状态标志位,如果为1,进行上述传输;如果标志位为0,则代表cpu还未来得及处理已经传输完成的数据,此时dma将上报中断,告知cpu需处理dma数据。

可以理解的是,若dma数据传输速率和cpu处理数据的速率一致,dma控制器读取表项传输状态标识为1,就会取走表项信息,持续传输数据,由于链表是环式的,dma控制器可连续读取表项信息,不会产生中断,从而减轻了cpu的资源消耗,提高了cpu的利用率。

若cpu无法及时处理传输完成的数据,dma控制器读取表项传输状态标识为0时,dma控制器停止传输数据,上报中断。若cpu处理传输数据较快而网络传送包的速率较慢,当cpu读到环式链表表项的状态标志位为1时,会结束此次dma任务,而去执行其它任务,不会浪费等待时间。

本发明实施例提供一种环式链表dma的传输系统,其包括cpu和dma控制器。

其中,cpu用于在内存中设置表项链接地址首尾相连的环式链表,并为环式链表的每个表项配置传输状态标志位后开启直接内存存取dma。

所述dma控制器用于循环读取每个表项的传输状态标志位的状态,以确定是上报dma中断至cpu,还是进行dma传输,并更改传输状态标志位的状态以和cpu进行信息交互。

且所述cpu还用于在接收到dma中断时处理中断信息,在处理完中断信息或空闲时循环读取每个表项的传输状态标志位的状态,以确定是离开dma任务,并在预设时间后返回,还是处理dma传输的数据,并更改传输状态标志位的状态。

进一步地,所述传输状态标志位包括第一状态和第二状态,所述cpu将环式链表的每个表项的传输状态标志位初始化为第一状态后开启dma。

进一步地,所述dma控制器用于判断读取的一表项的传输状态标志位的状态是第一状态还是第二状态;

若是第二状态,所述dma控制器判断所述cpu未及时处理dma传输的数据,上报中断至所述cpu;

若是第一状态,所述dma控制器进行dma传输,且将传输状态标志位从第一状态更改为第二状态以通知cpu传输完成,并读取下一表项的传输状态标志位,再次判断下一表项传输状态标志位的状态,以循环判断环式链表的每个表项。

进一步地,当所述dma控制器判断读取的一表项的传输状态标志位的状态是第二状态时,设定一延时时间,在延时时间过后再次读取该表项的传输状态标志位,若仍是第二状态,则上报中断至cpu。

进一步地,所述cpu用于判断读取的一表项的传输状态标志位的状态是第一状态还是第二状态;

若是第一状态,所述cpu判断所述dma控制器未传输完对应的数据,离开dma任务,并在预设时间后返回;

若是第二状态,所述cpu处理所述dma控制器传输的数据,且将传输状态标志位从第二状态更改为第一状态以告知dma控制器可传输数据,并读取下一表项的传输状态标志位,以循环判断环式链表的每个表项。

参见图5所示,作为一个优选地实施方式,本实施例中的dma控制器包括链表解析单元、寄存器配置单元和数据传输单元。

链表解析单元根据表项存放的位置依次读取环式链表表项信息,将表项信息按照规定的映射关系分解为数据传输源地址、数据传输目的地址,数据传输长度,下一个表项的链接地址,传输状态标志位的寄存器值,对寄存器配置单元进行配置,并开启一次dma传输。当dma传输完成后,链表解析单元将该传输信息对应的链表表项中的传输状态标志位配置为0,结束此次dma传输,并根据下一个表项的链接地址读取表项配置信息,开启再一次dma传输。

寄存器配置单元用于为dma传输提供配置信息,将链表解析单元的配置信息保存下来并对数据传输单元进行配置。保存数据传输单元的状态信息,以便链表解析单元和cpu查询。

数据传输单元,用于根据寄存器配置单元的配置信息将业务接口的网络数据包传输到内存中的目的地址,或者将内存中源地址的数据包传输到业务接口,并发送出去。数据传输单元可根据系统实际要求调整传输的颗粒度,以保证数据包的传输效率。

本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。

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