问题背景
有两块RK3568作为核心板,分别作为Master 和 Slave ,分别分发PTP,NTP作授时功能等。在服务器使用的过程中,远程程序升级功能必不可少,在客户使用过程中对服务器进行升级。远程升级流程:登录Telnet or 登录管理网页,上传firmware.tar.gz 也就是软件压缩包 内含程序软件eddas。故Master在升级的同时,需要将firmware.tar.gz文件通过串口传输给Slave,对其进行升级(虽然也可以通过网络的方式)。firmware.tar.gz文件较大,21M,RK3568串口支持1500000的波特率进行传输,然后在升级文件传输过程中,会莫名其妙在接收端收到0x00。
升级流程
搭建一个简易FTP平台,共享文件夹,通过Master登录telnet,输入升级命令,Master通过Ftp下载升级压缩包,Master下载升级压缩包后,对压缩包解密,解压,得到升级文件;与此同时,Master通过串口发送升级指令至Slave,开启ymodem协议,send压缩文件firmware.tar.gz,Slave收到升级指令,进入ymodem recv模式,开启传输frimware.tar.gz;接收完毕后,对其进行解压解密,从而获得升级文件。
解决方法
在传输过程中,串口触发使用中断方式处理数据,由于文件较大(21M)并且波特率较高1500000.所以在每一次接收一个字节触发中断的时候,都会打断CPU,造成CPU无法处理其他事务。或者可能是因为较高的波特率,导致了串口在传输过程中受到了干扰,又或者是传输速率过快,导致寄存器内已经为空,读到了空数据0x00。
然后在经过学习后发现传输数据量较大,且通信波特率较高(大于38400)时,在批量数据传输,通信波特率较高时,建议采用DMA方式。
串口通信的三种工作方式:
- 轮询方式 : cpu不断的检测串口传输标志位的变化;特点:程序简单,但是cpu在检测串口传输标志位的时候,cpu会被占用,无法处理其他事务。
- 中断方式: 使能中断后,接收一字节数据或者发送一字节数据后申请中断,在ISR中完成后续处理,在数据收发期间,cpu可以处理其他事务,cpu利用率高。
- DMA方式: 初始化设置相关参数,启动DMA传输后,数据传输过程不需要cpu干预。传输完成后,再使能DMA中断,由CPU处理后续。传输效率高。
DMA概述:直接存储访问器DMA的概念
用于外设与存储器之间的数据传输以及存储器与存储器之间进行高速数据传输。DMA传输过程的初始化和启动由CPU完成,传输过程由DMA控制器(独立的DMA通道)来执行,无需cpu参加,从而节省了CPU资源,提高利用率。