文献标识码:A
DOI:10.16157/j.issn.0258-7998.174525
中文引用格式:盛蔚,贺彪,高彤. 基于RT-Thread的无人机数据记录仪设计与实现[J].电子技术应用,2018,44(4):10-13.
英文引用格式:Sheng Wei,He Biao,Gao Tong. Design and implementation of UAV data recorder based on RT-Thread[J].Application of Electronic Technique,2018,44(4):10-13.
传统的无人机数据记录仪仅仅是记录无人机在整个飞行过程中各状态参数的机载电子设备,大多采用FPGA作为控制器,NAND Flash作为存储单元,SRAM作为数据缓存,以并行的方式完成数据的缓存和处理[1-2],虽然也能实现飞行数据的有效存储,但又产生了功耗大和体积大的问题。而且FPGA需要外部存储模块(如EEPROM或Flash)来存储编程文件[2-3],相比于ARM内置SRAM和Flash运行和存储编程文件,这无疑增加了外围电路的复杂性。此外,以NAND Flash作为大容量存储设备,就必须设计相应的坏块管理算法和擦写平衡算法,在实际存储过程中进行实时ECC校验,并实时维护一个NAND Flash坏块表,以防把数据写入坏块造成无法读出[4-5],大大降低了系统的存储效率。
日新月异的无人机应用场合要求数据记录仪不仅要记录飞行器的飞行状态,还要记录各种任务设备的指令、数据和工作信息以便离线使用,功能举例如下:
(1)存储差分GPS基站和移动站的原始星历数据做后差分解算,提高航测作业的位置解算精度;
(2)在静止时和飞行时存储导航传感器的所有高频原始数据,进行离线噪声建模,优化滤波模型;
(3)在地面和机上分别记录数据链上行和下行的指令和数据,离线分析链路可靠性。
除此之外还有诸多功能等待开发和挖掘,但这些功能都要求数据的存储必须满足实时、可靠、低功耗、小型化和易存取等特点。本文结合无人机领域的实际应用需求,设计了一种基于嵌入式实时操作系统RT-Thread的数据记录仪。
1 功能模块选型
为满足实时、可靠、低功耗、小型化、低成本和易存取的无人机数据记录仪设计需求,从低功耗、小型化和低成本的角度考虑,ARM微处理器必然是最优选择;从满足实时性和高可靠的角度考虑,在硬件平台上移植嵌入式实时操作系统,通过线程的时间片轮转来保证无疑是最优选择;从易存取的角度考虑,使用SD卡作为存储介质能够避免系统将CPU资源浪费在擦写平衡和ECC校验等环节,使用USB进行数据读取能提高数据读取效率。
本文所设计的无人机数据记录仪使用的硬件嵌入式平台为STM32F4系列微处理器,使用该微处理器的SDIO模块读写SD卡,接收、缓冲并存储多路串口的输入数据,USB模块读取存储的数据,并移植了嵌入式实时操作系统RT-Thread进行线程调度和文件系统支持,主体架构如图1所示。
RT-Thread相较于?滋C/OS-III和FreeRTOS等嵌入式实时操作系统有很多优点:首先是开源的,且符合POSIX规范,稳定性高;支持Fatfs文件系统,采用多级目录结构,能够对不同类型、不同来源和不同用途的无人机数据进行更科学化的文件管理,且能够与PC端实现文件互传,便于数据导出;采用基于优先级的全抢占式多线程调度算法和基于时间片的轮转调度算法,使用内核对象(包括信号量、互斥量等)进行线程同步,极大地优化了线程的执行和调度效率,提升了微处理器的数据存取性能,在此基础上进行有效的硬件驱动开发和应用程序开发就能够满足无人机行业对数据存取的要求。
2 硬件驱动开发
硬件驱动的开发主要为3部分,包括在嵌入式实时操作系统RT-Thread的架构上进行串口模块、SDIO模块和USB模块的驱动开发。RT-Thread为这些模块定义了中间层框架,这个框架向上和向下各提供一个接口,向下是底层驱动对硬件的接口,这个接口完成对硬件模块的控制并从硬件获得数据,向上是与应用程序交互的接口,通过这个中间层框架,应用程序就可以通过统一的接口访问底层硬件,即使硬件有所改动上层代码几乎不用改动,提高了系统的移植性[6]。
串口驱动主要包括串口的初始化程序以及中断接收程序,以实现对外部输入数据的快速响应。SDIO驱动主要包括SD卡的初始化程序、SD卡的产品信息读取函数和SD卡读写函数,用来实现对SD卡的功能配置,还需要在SD卡上运行Fatfs文件系统,以文件系统的组织形式进行串口数据的快速存储。USB驱动用于实现PC对SD卡中存储数据的拷贝,以便在PC上进行处理和分析,这就需要开发USB的大容量存储设备驱动[7],而USB主要通过描述符(descriptor)进行接口描述,本文按照如下结构配置描述符[8]:一个设备描述符,采用USB2.0协议,并支持一个配置描述符;一个配置描述符,包含一个接口描述符;一个接口描述符,接口设备类为Mass Storage类,下设两个端点;两个端点描述符,一个IN端点和一个OUT端点负责数据接收和发送,并都采用块传输形式,最大传输数据包长度为64 B。描述符配置完毕后,USB就可以响应大容量存储的各类设备请求并按照标准的USB2.0协议进行数据传输了。
最后将这3个模块的底层驱动与RT-Thread中间层框架实现对接,就可以通过调用RT-Thread应用层的标准设备接口进行应用程序开发了。
3 多线程数据缓冲存储策略
在多通道数据量大且复杂度高的应用场合,如果把非周期字节流的接收和存储放在一个线程里去执行,难免会引发存储设备的频繁写入,大容量存储设备大多以块而非字节为最小写入单位,一次只写入几个字节与写入整块的时间相同,一次只写入几个字节必然造成CPU资源的浪费,而存储设备的读取和写入往往是线程中最耗时的环节,这样势必会降低整体系统的存储效率。如果恰巧在线程执行过程中有新的数据到来,CPU就无法及时响应,势必会影响实时性,造成数据损失。
为保证数据存储的完整和可靠,且不过多占用CPU资源影响其他线程调度,本文创新地提出了多线程数据缓冲技术,遵循“先接收后缓冲再存储”的原则,即设计3个线程分别接收数据、缓冲数据和存储数据,并合理分配CPU资源,让接收线程处理的数据最少,缓冲线程处理的数据适中,存储线程处理的数据最多。根据LIU C L和LAYLAND J在文献[9]中提出并证明的结论,在实时操作系统中,单调速率调度(RMS)算法的线程设置必须满足周期越短,优先级越高的规律,因此上述3个线程的优先级设置应满足“执行周期递增,优先级递减”的原则,具体线程设计思路如图2所示。
在实际数据到来后,处于最高优先级的接收线程可以快速响应并将接收到的字节流及时写入一级缓冲区,一级缓冲区的大小可以设置为256 B左右,一级缓冲区存满后则通知缓冲线程执行;处于中等优先级的缓冲线程启动后就迅速把一级缓冲区的数据拷贝到二级缓冲区中,并将一级缓冲区清零,数据指针复位,使其不影响下一次接收任务的正常写入,二级缓冲区的大小可以设置为2 048 B左右,必须显著大于一级缓冲区的大小,二级缓冲区存满后则通知存储线程执行;处于低优先级的存储线程启动后就迅速把二级缓冲区中的数据拷贝到三级缓冲区中,并将二级缓冲区清零,数据指针复位,使其不影响下一次二级缓冲区的正常写入,三级缓冲区设置成一个队列结构,从二级缓冲区拷贝过来的数据就按照队列依次写入三级缓冲区,由于SD卡一次最小写入单位是512 B,为提高对存储设备的写入效率,就必须严格控制写入SD卡的字节数为512的整数倍,写入SD卡完成后再将剩余数据的指针移到三级缓冲区的开头,并将下一次移进来的数据放在这些数据的末尾,保证下一次写入数据的正确性和高效率,而且每个线程执行完成后都同步计算至下次触发的超时时间,保证缓冲区的数据即使不满也能通过触发超时逐步转存最后写入SD卡,程序执行流程如图3所示。
通过以上3个线程和三级缓冲区对数据进行处理后,相较于使用一个单一线程进行数据接收和存储,完全避免了数据丢失问题和SD卡频繁写入的资源浪费问题,拆分后串口3个线程的CPU时间片轮转过程如图4所示。
从操作系统多线程调度的时间片轮转来看[10],接收线程处理的数据量最小,其占用的CPU时间片也很少,即使在缓冲线程和存储线程的执行过程中有数据输入,接收线程也可以抢占较低优先级的缓冲线程和存储线程得以执行,保证不丢失任何输入数据。而且由于接收线程执行时间短,执行完毕后缓冲线程和存储线程也能从之前被抢占的地方继续执行,将数据流汇聚成数据块再进行写入,显著提高数据的存储效率,降低SD卡读写的耗时。
4 系统性能测试
为验证软硬件设计的正确性和高效性,接下来进行了小批量试制,系统实物如图5所示,并在试制完成的数据记录仪上进行系统性能测试。
拟定如下测试方案:连接PC和数据记录仪,通过上位机软件向数据记录仪的3个串口同时以115 200的波特率发送不同数据,频率均为10 Hz,数据量均为1 000 B/次,模仿无人机应用中的高频次连续数据,分别以单线程接收存储和多线程数据缓冲存储两种方法进行测试,在数据记录仪进行数据存储的同时PC上也通过上位机软件进行发送数据的同步存储,连续不间断工作24小时进行压力测试,完成后通过USB口将数据记录仪存储的3个不同文件拷贝到PC上,以上位机存储的发送数据为基准,计算两种方法的数据存储率、CPU实际占用率和SD卡读写次数,结果如图6所示。
通过这个测试方案不仅验证了整个系统软硬件设计的可靠性,还对单线程存储策略和多线程数据缓冲存储策略进行了对比。测试结果表明,多线程数据缓冲存储策略因为增加了线程的调度,虽然增加了CPU的实际占用率,但这与其带来的数据存储率的显著提升相比是微不足道的,而且这种方式大幅降低了存储设备同等数据量下的读写频次,延长了存储设备的使用寿命,明显优于单线程存储策略,且在长时间、大数据输入压力测试的情况下仍能维持很好的数据存储性能,数据存储率为100%,达到了设计的预期效果。最后进行实际应用测试,准备两个数据记录仪,将一个数据记录仪安装在小型四旋翼无人机上,存储无人机飞行数据和差分GPS移动站接收机的后差分数据,另一个在地面存储差分GPS基站接收机的后差分数据,进行实际多频次高强度飞行后利用第三方软件进行后差分解算。经测试,数据均无丢包,工作均正常,能够满足高强度飞行任务的需要。
5 结论
本文以实际无人机行业应用为牵引,设计了一款基于RT-Thread的实时、可靠、低功耗、小型化和易存取的无人机数据记录仪,通过多线程数据缓冲存储策略实现了大量连续数据输入条件下的高效率、高可靠存储,并能通过USB连接线将存储的数据快速导出到PC中进行事后分析,能够满足日益复杂的无人机行业应用对数据记录仪的要求。另外,多线程和多级缓冲区的数据处理模式不仅局限于嵌入式领域,对于需要多通道数据处理的个人计算机和服务器软件开发也有一定的借鉴作用。
参考文献
[1] 韩勇豪.一种大容量无人机飞行数据记录仪的研制[D].南京:南京航空航天大学,2012.
[2] 叶艳.大容量无人机数据记录仪的数据卸载及处理技术研究[D].南京:南京航空航天大学,2014.
[3] 刘光辉,周军,于晓洲.低成本无人飞行器机载数据记录仪的设计与实现[J].测控技术,2011,30(1):10-12.
[4] 张胜勇,高世杰,吴志勇,等.基于FPGA的NAND Flash坏块处理方法[J].计算机工程,2010(6):239-240,243.
[5] 彭卓文,杨新民,王胜红.基于FPGA控制的高速大容量NAND Flash存储模块设计[J].电子设计工程,2017,25(7):111-114,118.
[6] 曹成.嵌入式实时操作系统RT-Thread原理分析与应用[D].济南:山东科技大学,2011.
[7] 薛园园.USB应用开发技术大全[M].北京:人民邮电出版社,2007.
[8] 陆斌.低功耗嵌入式网管系统和USB大容量存储设备的设计和开发[D].北京:北京邮电大学,2013.
[9] LIU C L,LAYLAND J.Scheduling algorithms for multipro-gramming in a hard real time environment[J].Journal of the ACM,1973,20(1):46-61.
[10] 张博.嵌入式实时操作系统中的数据缓冲技术[J].电子世界,2014(4):24-25.
作者信息:
盛 蔚,贺 彪,高 彤
(北京航空航天大学 仪器科学与光电工程学院,北京100191)