DSP 程序的通用在线烧写方法研究
2022-07-14赵昶宇
赵昶宇
(天津津航计算技术研究所,天津 300308)
随着芯片技术和微电子技术的不断进步和发展,数字信号处理器(DSP)在图像处理、通信以及控制等领域被越来越广泛的应用。早期的DSP 系统通常采用EPROM 或者E2PROM 作为存储器保存程序代码,在对这类存储器进行编程时,需要将存储芯片取下来利用专门的编程器进行编程。当需要软件升级的设备较多,或者芯片不易从系统中拆卸时,这种编程方式会给开发人员增加许多工作量。非易失性存储器FLASH 出现后简化了编程环境,不需要从系统中拆取芯片,可利用板上的MCU 进行编程,在线编程技术也在此时应运而生。
运用在线编程技术时,DSP 通过某种特定接口对用户程序进行烧写和重新编制,不用打开控制箱体和插拔仿真器便可完成程序内部相关参数的变更及监控,远程更新数据程序。当前DSP 程序的在线烧写方法是采用某种单一的接口进行程序烧写,不能满足多接口烧写的需求;大多数基于DSP 设计的处理模块的RAM 容量有限,不能满足同时选择和加载多个应用程序的需求;大多数系统在烧写完升级后的程序后,还需要对DSP 进行复位操作,系统才能运行升级后的程序。为了提高DSP 程序在线烧写的可靠性和灵活性,满足用户采用多通信方式进行在线烧写的需求,本文提出了一种DSP 程序在线烧写方法。
1 采用多种通信方式实现上位机端和DSP 端的通信
传统的上位机和DSP 端的通信均采用单一固定的通信协议,一旦用户需求发生改变,或者系统硬件芯片完成替代升级后,新的DSP 硬件系统已经无法使用原有的通信协议实现上位机和DSP 端的通信。这种情况下只能根据新的通信协议重新开发应用软件,给系统的维护带来了不小的困难和挑战。这种单一的通信方式已经不能满足嵌入式DSP 系统复杂性和多变性的要求,迫切需要一种可支持多种协议的通信机制。
由于当前通信协议的种类繁多,有的通信协议还比较复杂,传统的支持多种通信协议的工作模式只关注通信接口的实现与开发,这种方式的缺点是可移植性较差,仍然不能满足用户的复杂需求。本文提出了一种可扩展的多通信方式模块,该模块主要由5 部分组成,即协议层、协议管理层、数据收发层、传输层和接口层,同时兼顾有线和无线多种通信能力,可根据具体环境进行灵活选择。采用可扩展的通信协议栈,可扩展通信接口和通信协议。利用该模块可将数据的收发过程和数据内部表示的信息分离,数据的收发由抽象的收发器接口表示并由硬件实现,通过专门的协议管理层扩展通信协议,协议管理层具有协议注册和匹配功能。协议层通常由一组平等的协议集合组成,当系统中需要加入新的协议时,先在协议层实现新的协议,然后向协议管理层注册后就可以使用[1]。
接口层和传输层主要针对硬件设备,一种类型的接口对应一种类型的传输层,比如RS232、RS422、RS485 均属于串口传输层;数据收发层的功能是负责设备底层的数据接收和发送,通信协议采用数据统一收发的方式,有效地实现对应用程序和底层接口驱动的隔离;协议管理层的功能是负责协议匹配,并解析已收到的和尚未发送的指令帧的指令类型、目的地址和帧计数;协议层的功能是对数据帧和应答帧进行分类处理。多通信方式的软件流程如图1 所示。
图1 多通信方式的软件流程图
2 采用动态程序加载技术实现DSP 的加载启动
传统的DSP 应用系统中采用Bootloader 程序实现代码的加载,但是这种方式在实际应用中也存在着很多弊端和限制,具体如下:由于Bootloader 程序固化在DSP 芯片内部,因此,其具有不易修改的特性;该Bootloader 程序只被加载一次,且仅在DSP 芯片上电复位时被加载;Bootloader 程序能够加载的程序大小有限制。因此,本文设计了一种可扩展的Bootloader 程序,即采用了动态加载技术。
该动态加载技术是一个相对独立的功能模块,由动态程序加载模块实现。它的基本功能是读取Flash芯片中指定地址内存储的程序代码及数据信息,将其加载到DSP 芯片的片内RAM 中;将接收到的程序代码及数据信息写入DSP 片内指定的RAM 中。动态程序加载模块需要将DSP 片内ROM 中固化的加载引导程序(Bootloader)在系统加电启动后加载到片内RAM中,它的入口参数如下:待读取的程序或数据的源地址、读取数据的长度、待写入的目的地址。动态加载的引导流程如图2 所示。
图2 动态加载的引导流程
上层应用程序将待升级的程序文件传入DSP 中后,由动态程序加载模块解析其写入的地址和数据长度,然后通过调用Flash 写入模块,将数据写入扩产的Flash 存储器中,最后通过动态程序加载模块将升级后的内容重新加载到DSP 内的RAM 空间,实现无需DSP复位的在线升级操作。
由于DSP 应用程序通常是单线程的,在同一时刻DSP 片内系统程序模块不会被同时调用。因此,在进行系统设计时无需在DSP 复位后马上加载上述功能模块,什么时候需要就什么时候加载,使其共用片内RAM。这样一来,可以认为DSP 的片内RAM 空间无限大。
3 采用多应用可选的启动方式实现DSP 平台的通用化[2]
目前主流系列的DSP 处理器系统有多种启动方式,包括主机启动、仿真器启动或EMIF 启动等,后2种启动方式被广泛应用在嵌入式系统中。
仿真器启动通常使用在系统的调试阶段,在系统上电启动时,由仿真器替代主机加载程序代码,并设置DSPINT 位。
当系统调试完毕进入正常工作阶段时,通常采用EMIF 的启动方式。当系统上电复位工作完成后,按照系统中ROM 的时序,DSP 系统自动从片外FLASH 的起始地址空间开始,拷贝一定字节大小的代码存放到地址空间从0 开始的RAM 中,拷贝的代码大小由处理器的类型决定。当访问FLASH 中的数据时,若CPU的指令字长度大于FLASH 的存储字宽,则EMIF 控制器先把FLASH 中连续几个字自动打包成CPU 指令字长宽度的数据包,然后将打包后的数据包传送到内部RAM 中。当传送完全部数据包后,CPU 开始从片内RAM 地址为0 的位置执行相应指令。
随着社会发展,DSP 用户需求不断升级变化,其要求在通用的硬件平台上保留并运行具有多种功能的应用程序。根据不同的应用场景,在DSP 系统启动时加载运行不同的应用程序,降低各种版本代码维护的复杂度。为了实现用户的需求,本文设计了一种在DSP上电启动时可在多个应用程序中任意选择并启动其中一个应用程序的方法,根据系统上电后读取设备的位置信息,从FLASH 中加载相应的应用程序到系统RAM 中运行,实现了多应用可选的启动。
3.1 应用程序目标文件生成
在DSP 系统应用开发中,CCS 开发环境生成的目标文件是COFF 格式的.out 可执行二进制文件。在调试阶段,CCS 仿真器将COFF 文件加载到系统RAM 中时,RAM 内的程序代码所在的地址就是程序最终的运行地址,该代码即为需要生成的纯目标代码,将这些代码保存为十六进制机器码DAT 格式的文件,即为应用程序目标文件。该方法可避免传统复杂的格式转换工具操作和参数配置操作。
3.2 启动过程中_c_int00 的跳转
为了启动不同的应用程序,需要获得不同的_c_int00 物理地址。利用上述提出的目标文件的生成方法,保存_c_int00 跳转指令至代码末尾,形成与具体应用相关的完整应用程序,避免使用具体的_c_int00 物理地址,减少应用开发过程中可能出现的地址引用出错问题。
3.3 不同应用程序的固化和启动
利用上述介绍的应用程序在线升级的方法将不同的应用程序分别固化到FLASH 中不同空间区域中。在进行程序固化工作前,为便于维护FLASH 中不同的应用,需用一张软件配置表来描述不同程序在FLASH 中的映射关系,表的内容主要包括各个程序的名称、起始地址、程序数据块大小、分配空间大小、版本号、版本号地址等信息,软件配置如表1 所示。更新修改程序时,首先索引该表获得相应的FLASH 空间地址、版本号,防止烧入错误的地址或错误的版本号。在每次更新完应用程序后,修改相应的版本号等信息便于以后软件的修改和维护。不同应用程序的启动流程如图3 所示。
图3 不同应用程序的启动流程
4 结束语
本文提出的DSP 程序通用在线烧写的方法解决了DSP 在线编程时通信方式单一及不能适应设备复杂性和多变性要求的问题,同时满足了DSP 启动时多种应用程序可选的加载需求。该方法提高在线编程的可扩展性和可维护性,提高了模块通用化能力和模块硬件利用率,并能降低开发成本,缩短开发周期。