基于DMA和FIFO接收串口不定长数据的方法及装置与流程

文档序号:29409246发布日期:2022-03-26 11:23阅读:763来源:国知局
基于DMA和FIFO接收串口不定长数据的方法及装置与流程
基于dma和fifo接收串口不定长数据的方法及装置
技术领域
1.本发明属于数据传输的技术领域,尤其涉及一种基于dma和fifo接收串口不定长数据的方法及装置。


背景技术:

2.串口因其结构简单,价格低廉被广泛使用,现已有轮询接收,中断接收,dma接收等多种较为成熟的方法可以实现串口数据的接收。
3.然而,轮询接收需要cpu以极短的间隔不断读取串口数据寄存器,当cpu性能较低或有较多其他任务要处理时容易导致数据丢失。中断接收在每次接收到串口数据时都需要进入中断保存数据,当串口数据量较大时,会大量占用cpu处理时间。虽然dma能够快速接收数据且不占用cpu处理时间,但,由于dma只能对内存进行线性访问,如果需要缓存多帧数据就需要至少开辟一个dma缓冲区,和一个数据缓冲区,dma传输完成后将dma缓冲区的数据拷贝到数据缓冲区,空间利用率和时间利用率都较低。
4.此外,现有串口接收不定长数据算法在接收完成一帧完整的数据后,如果不立即处理,需要由cpu将数据拷贝到缓冲区比较占用cpu资源。缓存数据时需要开辟多个独立的缓冲区空间利用率比较低。


技术实现要素:

5.本发明的目的是提供一种基于dma和fifo接收串口不定长数据的方法及装置,解决现有串口数据接收方法中cpu占用率较高,空间利用率较低的问题。
6.为解决上述问题,本发明的技术方案为:
7.一种基于dma和fifo接收串口不定长数据的方法,包括:
8.初始化串口,创建存储串口接收数据帧长度的变量rxlen及串口接收数据帧的是否有效标记framevalid,创建fifo缓存队列并清空;
9.初始化dma,开启串口空闲中断及dma传输完成中断,注册串口接收完成回调函数和dma传输完成回调函数;
10.cpu发起首次dma请求后,等待串口接收完成中断触发或dma传输完成中断触发,进行相应的中断处理;
11.应用层读取数据,判断fifo缓存队列是否已满,若是,则获取接收数据帧长度rxlen的值,读取fifo缓存队列中rxlen个数据,cpu再次发起dma请求;若否,则获取接收数据帧长度rxlen的值,读取fifo缓存队列中rxlen个数据。
12.根据本发明一实施例,所述等待串口接收完成中断触发或dma传输完成中断触发,进行相应的中断处理进一步包括:
13.若dma传输完成中断触发,则获取dma的传输长度,fifo缓存队列中的写指针右移所述传输长度个字节,接收数据帧长度rxlen的值增加所述传输长度,判断fifo缓存队列是否已满;
14.若串口接收完成中断触发,则判断串口接收数据帧是否有效标记framevalid是否有效,若有效,则获取dma的传输长度,fifo缓存队列中的写指针右移所述传输长度个字节,接收数据帧长度rxlen的值增加所述传输长度,调用串口接收完成回调函数,并将接收数据帧长度rxlen作为参数传递给所述串口接收完成回调函数;将当前接收数据帧长度rxlen清零,判断fifo缓存队列是否已满;
15.若无效,则将当前接收数据帧长度rxlen清零,设置串口接收数据帧是否有效标记framevalid为有效,cpu再次发起dma请求。
16.根据本发明一实施例,在dma传输完成中断触发阶段,判断fifo缓存队列是否已满进一步包括:
17.若已满,则调用fifo满回调函数,设置串口接收数据帧是否有效标记framevalid为无效,fifo缓存队列中的写指针左移rxlen长度个字节,丢弃当前数据帧已收到的数据,将当前接收数据帧长度rxlen清零,cpu再次发起dma请求;
18.若未满,则再次发起dma请求。
19.根据本发明一实施例,在串口接收完成中断触发阶段,判断fifo缓存队列是否已满进一步包括:
20.若已满,则调用fifo满回调函数;若未满,则再次发起dma请求。
21.一种基于dma和fifo接收串口不定长数据的装置,包括:
22.fifo模块,用于初始化串口,创建存储串口接收数据帧长度的变量rxlen及串口接收数据帧的是否有效标记framevalid,创建fifo缓存队列并清空;
23.dma模块,用于初始化dma,开启串口空闲中断及dma传输完成中断,注册串口接收完成回调函数和dma传输完成回调函数;
24.中断模块,用于cpu发起首次dma请求后,判断是否触发了串口接收完成中断或dma传输完成中断;
25.数据读取模块,用于应用层读取数据,判断fifo缓存队列是否已满,若是,则获取接收数据帧长度rxlen的值,读取fifo缓存队列中rxlen个数据,cpu再次发起dma请求;若否,则获取接收数据帧长度rxlen的值,读取fifo缓存队列中rxlen个数据。
26.根据本发明一实施例,装置还包括中断处理模块,所述中断处理模块包括第一中断处理单元、第二中断处理单元;
27.所述第一中断处理单元用于当dma传输完成中断触发后,获取dma的传输长度,fifo缓存队列中的写指针右移所述传输长度个字节,接收数据帧长度rxlen的值增加所述传输长度,判断fifo缓存队列是否已满;
28.所述第二中断处理单元用于当串口接收完成中断触发后,判断串口接收数据帧是否有效标记framevalid是否有效,若有效,则获取dma的传输长度,fifo缓存队列中的写指针右移所述传输长度个字节,接收数据帧长度rxlen的值增加所述传输长度,调用串口接收完成回调函数,并将接收数据帧长度rxlen作为参数传递给所述串口接收完成回调函数,将当前接收数据帧长度rxlen清零,判断fifo缓存队列是否已满;若无效,则将当前接收数据帧长度rxlen清零,设置串口接收数据帧是否有效标记framevalid为有效,cpu再次发起dma请求。
29.本发明由于采用以上技术方案,使其与现有技术相比具有以下的优点和积极效
果:
30.本发明一实施例中的基于dma和fifo接收串口不定长数据的方法,针对现有串口数据接收方法中cpu占用率较高,空间利用率较低的问题,通过dma配合单个fifo接收数据,可根据接收帧的大小自动分配每个帧的缓冲区的大小,空间利用率极高;接收完整的一帧数据只需要进入两次中断,cpu占用率极低;并且,在接收缓存多帧数据的过程中不需要由cpu进行拷贝,cpu占用率低。
附图说明
31.图1为本发明一实施例中的基于dma和fifo接收串口不定长数据的方法流程图;
32.图2为本发明一实施例中的fifo缓存队列的结构示意图;
33.图3为本发明一实施例中的基于dma和fifo接收串口不定长数据的装置框图。
具体实施方式
34.以下结合附图和具体实施例对本发明提出的一种基于dma和fifo接收串口不定长数据的方法及装置作进一步详细说明。根据下面说明和权利要求书,本发明的优点和特征将更清楚。
35.本实施例针对现有串口数据接收方法中cpu占用率较高,空间利用率较低的问题,提供了一种基于dma和fifo接收串口不定长数据的方法,用于需要使用mcu进行串口通信的设备。该方法采用dma配合fifo接收数据,dma直接将数据存储在fifo中,不需要由cpu进行拷贝,cpu占用率低。
36.在具体介绍本发明之前,对以下专业用语进行说明:
37.fifo:遵循数据先进先出的环形数据缓冲队列。
38.mcu:微控制单元(microcontroller unit;mcu),又称单片微型计算机(single chip microcomputer)或者单片机,是把中央处理器(central process unit;cpu)的频率与规格做适当缩减,并将内存(memory)、计数器(timer)、usb、a/d转换、uart、plc、dma等周边接口,甚至lcd驱动电路都整合在单一芯片上,形成芯片级的计算机,为不同的应用场合做不同组合控制。诸如手机、pc外围、遥控器,至汽车电子、工业上的步进马达、机器手臂的控制等,都可见到mcu的身影。
39.cpu:mcu中主要负责运算、程序执行的单元。
40.dma:直接存储器访问技术,是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于cpu的大量中断负载。否则,cpu需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。在这个时间中,cpu对于其他的工作来说就无法使用。
41.串口/uart:一种通用外设,用于数据通信。
42.内存:mcu中用于暂存数据的数据存储单元
43.中断:中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。
44.缓冲区:从内存中划分出来为了缓存某些特定数据的区域。
45.帧:数据链路层的协议数据单元。
46.下面结合附图对本发明基于dma和fifo接收串口不定长数据的方法做详细介绍。
47.该基于dma和fifo接收串口不定长数据的方法,包括以下步骤:
48.初始化串口,创建存储串口接收数据帧长度的变量rxlen及串口接收数据帧的是否有效标记framevalid,创建fifo缓存队列并清空;
49.初始化dma,开启串口空闲中断及dma传输完成中断,注册串口接收完成回调函数和dma传输完成回调函数;
50.cpu发起首次dma请求后,判断是否触发了串口接收完成中断或dma传输完成中断;
51.应用层读取数据,判断fifo缓存队列是否已满,若是,则获取接收数据帧长度rxlen的值,读取fifo缓存队列中rxlen个数据,cpu再次发起dma请求;若否,则获取接收数据帧长度rxlen的值,读取fifo缓存队列中rxlen个数据。
52.具体的,请参看图1,该基于dma和fifo接收串口不定长数据的方法包括以下步骤:
53.1.初始化串口;
54.2.创建存储串口接收数据长度的变量rxlen,并设置初始值为0;
55.3.创建串口接收数据帧是否有效标记framevalid,并设置初始值为true,true代表当前接收数据帧有效,false代表当前接收数据帧无效;
56.4.创建fifo并清空;
57.5.初始化dma;
58.6.打开串口空闲中断和dma传输完成中断;
59.7.注册串口接收完成回调函数和dma传输完成回调函数;
60.8.cpu发起首次dma请求,方向为外设至存储器,地址为图2所示w所在地址,长度为图2所示wlinelen长度;图2中的r为读指针,w为写指针,len为fifo的长度(即能写入数据的总长度,比整个缓冲区长度少一个字节),freelen为空闲长度(当前最多还能写入的数据个数),fulllen为填充区长度(当前已写入数据个数),wlinelen为写线性区长度(写指针右侧地址连续的空闲区长度),rlinelen为读线性区长度(读指针右侧地址连续的填充区长度)。
61.9.等待中断触发:
62.a)dma传输完成中断触发,则
63.i.获取dma传输长度;
64.ii.图2所示fifo写指针右移dma传输长度个字节,需要注意的是当写指针到达最右端时,将从最左侧开始右移剩余字节数的长度;
65.iii.rxlen加上dma传输长度;
66.iv.判断fifo是否满,如图2所示当fifo满时fifo内数据个数为len,即当fifo内数据个数小于len时fifo未满;
67.1.fifo满,则
68.a)fifo不足以接收接下来的数据,调用fifo满回调函数;
69.b)设置framevalid为false,标记当前接收数据为无效数据;
70.c)图2所示fifo写指针左移rxlen,即丢弃当前帧已收到的数据;
71.d)设置rxlen为0;
72.e)因为dma传输完成时,串口可能依然在接收数据,所以需要再次发起dma请求,防
止串口内数据阻塞,dma请求方向为外设至存储器,地址为图2所示w所在地址,长度为图2所示wlinelen长度。
73.2.fifo未满,则
74.a)再次发起dma请求,dma请求方向为外设至存储器,地址为图2所示w所在地址,长度为图2所示wlinelen长度。
75.b)串口空闲中断触发
76.i.判断framevalid是否为有效
77.1.有效,则
78.a)获取dma传输长度;
79.b)图2所示fifo写指针右移dma传输长个字节,需要注意的是当写指针到达最右端时,将从最左侧开始右移剩余字节数的长度;
80.c)rxlen加上dma传输长度;
81.d)调用串口接收完成回调函数,并将rxlen作为参数传递给串口接收完成回调函数,以便告知用户应用程序当前接收帧的长度;
82.e)设置rxlen为零为接收下一帧数据做准备;
83.f)判断fifo是否为满:
84.i.满,则
85.1.调用fifo满回调函数。
86.ii.未满,则
87.iii.再次发起dma请求,dma请求方向为外设至存储器,地址为图2所示w所在地址,长度为图2所示wlinelen
88.长度。
89.2.无效,则
90.a)设置rxlen为零为接收下一帧数据做准备;
91.b)无效帧已接收完成,设置framevalid为true,准备重新开始接收新的一帧数据;
92.c)再次发起dma请求,dma请求方向为外设至存储器,地址为图2所示w所在地址,长度为图2所示wlinelen长度。
93.10.应用层读取数据
94.a)判断fifo是否满
95.i.满,则
96.1.获取接收数据帧长度rxlen的值;
97.2.读取fifo缓存队列中的rxlen个数据;
98.3.再次发起dma请求,dma请求方向为外设至存储器,地址为图2所示w所在地址,长度为图2所示wlinelen长度。
99.ii.未满,则
100.1.获取接收数据帧长度rxlen;
101.2.读取fifo中的rxlen个数据。
102.上述基于dma和fifo接收串口不定长数据的方法采用dma配合单个fifo接收数据,可根据接收帧的大小自动分配每个帧的缓冲区的大小,空间利用率极高;接收完整的一帧
数据只需要进入两次中断,cpu占用率极低;并且,在接收缓存多帧数据的过程中不需要由cpu进行拷贝,cpu占用率低。
103.本发明还提供了一种基于dma和fifo接收串口不定长数据的装置,包括:
104.fifo模块1,用于初始化串口,创建存储串口接收数据帧长度的变量rxlen及串口接收数据帧是否有效标记framevalid,创建fifo缓存队列并清空;
105.dma模块2,用于初始化dma,开启串口空闲中断及dma传输完成中断,注册串口接收完成回调函数和dma传输完成回调函数;
106.中断模块3,用于cpu发起首次dma请求后,判断是否触发了串口接收完成中断或dma传输完成中断;
107.中断处理模块4,所述中断处理模块包括第一中断处理单元、第二中断处理单元;
108.其中,第一中断处理单用于当dma传输完成中断触发后,获取dma的传输长度,fifo缓存队列中的写指针右移所述传输长度个字节,接收数据帧长度rxlen的值增加所述传输长度,判断fifo缓存队列是否已满;
109.第二中断处理单元用于当串口接收完成中断触发后,判断串口接收数据帧是否有效标记framevalid是否有效,若有效,则获取dma的传输长度,fifo缓存队列中的写指针右移所述传输长度个字节,接收数据帧长度rxlen的值增加所述传输长度,调用串口接收完成回调函数,并将接收数据帧长度rxlen作为参数传递给所述串口接收完成回调函数,将当前接收数据帧长度rxlen清零,判断fifo缓存队列是否已满;若无效,则将当前接收数据帧长度rxlen清零,设置串口接收数据帧是否有效标记framevalid为有效,cpu再次发起dma请求。
110.数据读取模块5,用于应用层读取数据,判断fifo缓存队列是否已满,若是,则获取接收数据帧长度rxlen的值,读取fifo缓存队列中rxlen个数据,cpu再次发起dma请求;若否,则获取接收数据帧长度rxlen的值,读取fifo缓存队列中rxlen个数据。
111.本实施例中的基于dma和fifo接收串口不定长数据的装置是与上述基于dma和fifo接收串口不定长数据的方法相对应的装置,可实现上述基于dma和fifo接收串口不定长数据的方法。上述fifo模块1、dma模块2、中断模块3、中断处理模块4及数据读取模块5的功能及实现方法均如上述基于dma和fifo接收串口不定长数据的方法所述,在此不再赘述。
112.上面结合附图对本发明的实施方式作了详细说明,但是本发明并不限于上述实施方式。即使对本发明作出各种变化,倘若这些变化属于本发明权利要求及其等同技术的范围之内,则仍落入在本发明的保护范围之中。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1