管文辉,苏永亮
(总参谋部第六十研究所, 江苏 南京 210016)
摘要:针对DSP具有浮点运算单元,运算能力强的特点,提出了一种将复杂的报靶算法移植到DSP中进行计算的软件设计方法,并在此过程中通过移植μCOSII操作系统,对任务间进行合理调度。优化报靶算法等措施有效提高了多靶标同时报靶的实时性和可靠性。
关键词:DSP28335;μCOS-II移植;超声报靶;程序优化
中图分类号:TP311.1文献标识码:ADOI: 10.19358/j.issn.1674-7720.2017.09.025
引用格式:管文辉,苏永亮.基于DSP28335的超声报靶器软件程序优化设计[J].微型机与应用,2017,36(9):85-87,91.
0引言
目前针对大口径直瞄火炮射击进行报靶的设备主要采用开放式激波报靶技术和光幕报靶技术。激波报靶技术由于其布设简便、野外适应性强、报靶精度较高的特点目前已在不少部队和基地中推广使用。但由于开放式激波报靶算法较为复杂,目前常用的做法是将传感器采集的时差数据通过单片机及通信链路上传至上位机进行计算,计算完成后再对照实际使用的靶型确认命中位置与效果,最终再将命中结果反馈给靶标终端。当多台靶标组成的靶标系统同时进行射击训练时,短时间内会产生大量时差数据需要上传与计算。而靶标系统中的主控计算机同时还负责控制靶标的功能,此时容易造成主控计算机端负荷迅速增大,还易导致报靶时间延迟甚至报靶数据丢失的风险。为了提高激波报靶的实时性和可靠性,需要将算法下移,在靶标终端中完成计算,并判断命中效果。
1硬件平台设计
以往的靶标中多采用ARM处理器或单片机将FPGA采集的时差数据打包上传,经过上位机计算命中位置后再将命中数据下发到靶标端的方法。在开放式激波检靶算法中通过几何法推导了激波到达时间与弹丸速度、水平入射角、高低入射角、着靶位置等待求量的约束关系,然后将激波传递时间表示为包含待求量的显式方程,最后通过最小二乘法求解着靶参数。由于算法中存在有浮点数的运算,有必要在新的设计中选择具有浮点运算单元的DSP来代替原来的处理器,这里选择TI公司的TMS320F28335芯片,它釆用高性能静态CMOS技术,具有150 MHz 的高速处理能力,具备32位浮点运算单元,6个DMA 通道支持ADC、McBSP 和EMIF,片内集成有34 K×16 bit的RAM和256 K×16 bit的Flash,程序在Flash中直接运行时代码执行性能大致为90~100 MIPS[1]。报靶电路中激波采集部分电路将采集到的时差信号送到FPGA,经过FPGA采集各路信号的时差后将该数据经串口送至DSP28335。同时系统配合外围电路还要完成与无线电台的无线通信、靶标起倒控制、指示灯状态指示、命中效果触发等任务。系统硬件平台框图如图1所示。
2系统任务规划及μCOS-II移植
根据软件整体结构的特点,在本设计应用中既需要进行较复杂的浮点运算,又需要对多个控制对象进行统筹控制。单一的DSP芯片运行前后台操作系统可以进行复杂的浮点运算但很难同时兼顾多个任务间的统筹调度。而如果使用ARM+DSP的方式进行配合处理,产品的成本和系统的复杂程度都将大大提高。因此将μCOS-II移植到DSP等高性能处理器上对于提高产品的质量,缩短开发周期和拓展DSP应用范围有着重要的意义。
μCOS-II作为一个源代码公开的多任务实时操作系统,最多可支持63个任务,其内核为占先式,支持信号量、邮箱、消息队列等多种进程间通信机制。同时用户可以根据需求对内核中的功能模块裁剪。由于在μCOS-Ⅱ设计时就已经充分考虑了可移植性,所以它的移植相对来说比较容易。移植工作包括以下几个方面内容:(1)了解所采用的系统核心;(2)编写移植代码;(3)测试移植代码。这里主要阐述编写移植代码过程中的几个关键文件,即OS_CPU.H、OS_CPU_C.C以及OS_CPU_A.ASM这三个文件[2]。
其中OS_CPU.H文件,其主要作用是声明与硬件相关的数据类型,定义与中断有关的宏定义, 定义堆栈增长方向宏定义。OS_CPU_C.C文件中需要编写简单的C函数,其中1个是任务堆栈初始化函数,另外9个是系统对外的接口函数,这9个函数必须声明,但是并不一定要包含任何代码。OS_CPU_A.ASM文件里主要写了几个与硬件相关的代码,包含任务的切换和中断入口函数。其中任务的切换需要用汇编语言自行编写一个函数_OSCtxSw来实现。在编写这些文件时需要注意以下几个方面:
(1) 声明数据类型。μCOS-II考虑到通用性, 在内核中使用了自定义数据类型, 此类型与编译器无关, 这就要求移植时必须定义微处理器的数据类型与μCOSII的数据类型相一致, 保证移植后的μCOSII在DSP28335平台上顺利运行, 在移植中应将其声明为CCS编译器可识别的类型。
(2)中断宏定义。μCOS-II在内核中通过禁止中断来保护临界区,因此需要在C语言中插入禁止和允许中断的汇编代码,DSP里用SETC INTM来屏蔽中断,用CLRC INTM来使能中断[3]。所以移植代码定义了下面两条宏定义:
#define OS_ ENTER_CRITICAL0 asm (“SETC INTM”)
#define OS_ EXIT_ CRITICAL0 asm (“CLRC INTM”)
(3)设置栈的增长方向。μCOSII需要知道堆栈的底端地址在哪里,所以需要指明堆栈的增长方向。绝大多数微处理器和微控制器的堆栈是从上往下递减的, 但是也有某些处理器使用的是相反的方式。DSP28335 的堆栈方向是从下往上增长的,所以:#define OS_STK_GROWTH 0;
通过对应用功能的需求分析,归纳出几个主要的功能任务模块:(1)与上位机的通信数据交互任务,在该任务中需要根据协议解析起靶、倒靶、复位等控制命令,还需要将本机的起倒、位置、是否命中、电池电量等状态信息汇总打包回传;(2)报靶数据处理任务,该任务主要负责收集时差数据并通知其他任务进行上传或计算,同时还负责监控数据计算任务;(3)报靶数据计算任务,该任务主要负责报靶数据的方程组解算;(4)靶型命中计算,主要负责根据Flash中存储的几种靶型判断命中坐标是否落在靶面上;(5)电机控制和指示灯控制等配属任务。
软件整体结构如图2所示。一共分为4个任务,任务0负责报靶时差数据采集,优先级7;任务1负责时差数据计算,优先级8;任务2对计算结果结合靶型判断是否命中,测得弹速是否超速及串口数据回复,优先级9;任务3负责电机起靶、倒靶控制及指示灯控制。首先中断负责进行串口数据接收并根据协议拆包解析,之后通过邮箱MboxSem触发Task0或Task3,在Task0中通过函数CSenslocCal()初始化相关参数,之后通过getparam()采集时差、温度、风速、角度等信息,通过caculate()函数进行相关计算即可完成报靶数据处理。
3程序优化设计
3.1设置优化
由于报靶算法涉及到32位浮点数运算,为保证实时性必须对程序进行优化设计。首先是任务堆栈的分配。堆栈用于任务切换和影响中断时保存CPU寄存器中的内容及其他任务私有数据。每个任务都有自己的堆栈空间,任务堆栈的容量是由应用程序指定的,堆栈大小必需要考虑用户的任务所调用的函数嵌套情况,分配的局部变量的数目,以及可能的中断服务程序嵌套的堆栈需求,另外必须能存储所有的CPU寄存器。DSP28335包含32K×16 bit的RAM,分成8块4 KB大小的区域,本设计中一共需要5个任务,初步设定每个任务堆栈大小为512 B,在后续任务中堆栈大小可以由两种方案确定:
(1)先将堆栈设置为最大,再逐步减小,直到程序不能正常运行,此时为所创建任务的实际所需堆栈大小。
(2)利用μCOSII自带的堆栈检查函数OSTaskStkChk()来检测每个任务已经使用的堆栈空间和剩余的堆栈空间来确定堆栈的大小。
初次运行时出现了无法allocate.text段的报错提示,这表示程序段代码和常量占用内存过多,需要对其分配进行重新定义。通常片内RAM地址分配如图3所示,其中RAML段为0x008000~0x00B000,RAMH段为0x00C000~0x00F000。通过调整RAML和RAMH的分配空间定义来满足程序要求。这里重新定义RAML段为0x008000~0x00C000,RAMH段为0x00D000~0x00F000。
在进行报靶数据的计算时有时会遇到RAM内部空间不足导致数据溢出,最终造成无法计算的问题。通过以下两种方法来解决:(1)如果数据为.const类型,定义在Flash中;(2)利用外扩SRAM,具体方法是在CMD文件中定义一段数据空间,之后将较大的数组编译到CMD中定义的段中,并在外扩SRAM的函数中予以说明。
3.2程序及算法优化
根据算法模型求解方程组X=[SxSyVbαβτ]T,获得弹丸命中位置、着靶速度及入射角度。由于解算方程组是一组复杂的非线性方程组,没有解析解,必须通过GaussNewton等迭代方法进行求解[4]。这里取一定的初始迭代值,根据解非线性方程的最小二乘广义逆法进行迭代,得到最终结果。算法中对于初始迭代值的选取有一定的要求,若初始值选取相差真实值太大,则会出现无穷大解,因此实际求解中采用区间搜寻的方法进行迭代计算[5]。将算法编写成C代码,划分为125个区间,而在实际计算中,一般在得到正确结果即退出搜索程序,若125个区间全部迭代完成,仍然没有结果,则解算不出。
为了计算的快捷和报靶的可靠,得到时差数据后DSP先按照协议打包将该组数据上传给上位机,然后再自行进行计算。由于报靶算法的核心是解非线性方程组,解算需要通过多次迭代进行,且即使是多次迭代也会存在非线性方程组无解的可能性。故此运算过程在时间和结果上存在一定的不确定性。在规定时间内DSP得出计算结果,则存储结果并进入命中判断任务,如在规定时间内没有算出结果,则由上位机发送结果给靶标,明确告知该发数据是否命中,后续无需继续进入判断命中任务。如都没有计算出结果,为防止DSP计算显式方程时对于极个别数据陷入死循环,除了设置必要的软件看门狗以外还需要设计外部强制复位程序。当FPGA将时差数据交予DSP进行解算时随即开始启动定时任务,在规定的时间内DSP得出方程解则通过I/O口对定时器复位;如没有在规定的时间内得出方程解,则FPGA对DSP进行强制复位。数据处理程序流程图如图4所示。
完成报靶时差数据的解算后还需要针对特定的靶型数据判定弹着点是否命中靶标。在上位机进行计算时是按照每个像素的坐标逐个比对来进行的。由于PC内存容量大,所以计算起来并不耗时。但是将此算法放置在DSP中进行计算则要占用大量内存资源,且需要耗费较长时间。特别是当步战车等装甲车辆采用较小口径速射炮进行射击时,往往会造成程序的反应过慢,影响部队训练。这里提出一种新的快捷算法。根据目前装甲部队训练大纲中的主要靶型分析,基本形状都是凸多边形。故本设计中具体采用射线法,实现思想为:由点P向X轴正方向发射一条射线,穿过多边形线段上的次数为奇数则在多边形内,为偶数则在多边形外。其中图形是由按逆时针方向排列的各个顶点来表示的,值得注意的是最后要再将第一个点表示一次。如图5所示对于正面坦克靶型P1为命中弹点,P2为未命中弹点。通过此算法DSP能够快速地判断出弹着点是否命中了靶型。
4结论
本设计通过在DSP28335平台上移植μCOSII操作系统,对平台的软硬件设置进行优化配置,通过对多个任务间的调度和监控、优化报靶算法等多种措施实现了报靶算法的下移和程序的优化设计,使得靶标具备了自主计算弹着点、自主判断命中结果的功能。通过实际应用对比,靶标系统通信网络的数据量降低了约30%,系统报靶功能的实时性和稳定性得到了明显提高。
参考文献
[1] Texas Instruments. TMS28335 digital signal ctontrollers data manual[EB/OL].(2016 03 09)[2016 12 01].http://wwws.ti.com/sc/tchlit,2007.
[2] 陈果,冯静.ucos系统及其消息队列详析[J].电子元器件应用,2011(3):3842.
[3] 许川佩,王伟,戴葵,等.实时多任务系统uc/osII在DSP上的移植[J].微计算机信息,2007,23(35):64-66.
[4] 蒋东东. 基于被动声定位的大靶面弹着点坐标测量方法研究[D].南京:南京理工大学,2011.
[5] 樊长虹,杜立,管文辉,等.风速对声点阵立靶系统建模及算法的影响研究[J].应用声学,2015,34(5):21-24.