基于TMS320C6678 的多级加载与动态重构

2022-10-11 07:36杨海学李小齐
电子设计工程 2022年19期
关键词:流程图串口代码

杨海学,张 伟,李小齐,何 斌

(中电科蓉威电子技术有限公司,四川成都 610036)

TMS320C6678 是TI 公司的一款高性能超长指令字架构的数字信号处理技术芯片,由于它具有多核、高频率、定点浮点运算能力强等特点,作为当前高端信号处理芯片,在图形图像、通信、医疗和雷达信号处理领域得到了广泛应用[1-5]。

多核TMS320C6678 的程序加载可通过外部扩展的存储器或远程工控机来进行。目前使用的加载接口有I2C、SPI、PCIE、EMIF、SRIO、SGMII 等,通过设置硬件管脚BOOTMODE[12:0]的值,均可作程序的启动接口[6]。在实际的星载、雷达、机载等场景中,一般是通过外接存储器进行启动,当需要在线重构时,TI提供的众多启动方案却难以满足。

1 加载模式原理

TMS320C6678 提供了很多加载模式,包括EMIF boot、SPI boot、I2C boot、SRIO boot、ETHERNET boot、PCIE boot等。在进行任何加载之前,都需要执行一级启动(芯片内部的RBL:ROM Boot loader),一级启动主要有如下操作:使能重启隔离功能;使能boot过程中所有可能需要用到的外设的时钟;配置系统PLL、DDR以及L1D和LIP;读取BOOTMODE的配置模式[7]。

若使用SRIO boot、ETHERNET boot和PCIE boot,则需要通过远程工控机将执行代码通过相对应的接口发送至板上内存运行。若使用SPI boot、I2C boot 启动,指针会直接指向外挂存储单元,通过自动搬移将运行代码搬入内存运行,EMIF boot 启动也是直接指向外挂存储单元,但是需要自己将代码搬移到内存运行。C6678 加载模式分类如图1 所示。

图1 C6678加载模式分类

文献[8]研究了I2C的二级加载启动方式,它是基于TI公司提供的开发套件IBL(Intermediate Bootloader),但是采用I2C启动方式需要挂载额外的EEPRAM 做启动牵引,然后再从NOR FLASH 或者NAND FLASH 加载用户应用程序,对成本和硬件空间设计均不友好。文献[9]通过优化程序存储格式实现优化启动速度,具有一定的工程价值,但是需要每次对代码进行格式修改。也有学者使用基于SPI 的启动方式加入了二级Boot Loader,旨在实现一套多级加载模式,效果较好,但是针对启动而言,受SPI 接口速度的限制,不能达到快速启动的要求,动态重构采用串口方式也会降低升级速率[10]。文献[11]介绍了EMIF 总线的加载方式,通过EMIF外挂存储单元方式实现快速启动,没有进一步进行二级启动和动态重构的研究。文献[12-15]主要关注多核代码的部署,通过TI 提供的工具或自己研发的工具实现将多个应用程序进行合并之后再部署,都没有谈及在线重构的问题。文献[16]展示了一种可以利用C6678 网口自动升级DSP 内部程序的方法,可是该方法没有进一步做多级启动方案,网口因做升级部署而被占用,故使用场景受限。

综上,在一些特殊场景中,需要采用较快速的多级启动方式,并且可能随时需要进行动态重构,若采用仿真器更新,灵活性较差。为此,该文设计了一种基于EMIF接口的多级加载与在线动态重构方案,该方案硬件需求简易,启动速度较快,并且在不掉电的情况下能够在线重构应用程序,具有很高的实际运用价值。

2 多级加载与动态重构设计

为了实现多级加载与动态重构,该文通过EMIF总线外挂NOR FLASH 芯片,将引导外设开关BOO TMODE[12∶0]配置为EMIF 启动。在一级启动RBL完成之后,直接跳转到EMIF 接口进行启动引导。

将NOR FLASH 的空间分为独立的三段。其中,第一段为部署段,第二段为动态重构段,第三段为应用段,具体分布如图2 所示。

图2 EMIF外挂NOR FLASH分区

三段各有一套代码,相互独立。部署段主要用于部署后两段的程序,重构段主要用于在线重构,应用段放置用户的使用程序。

部署段程序主要包含三个部分,第一部分为汇编搬移代码,第二部分为初始化,第三部分为部署执行,部署程序流程图如图3 所示。

图3 部署段程序流程图

对于从EMIF 启动,由于工艺水平的限制,部署程序在片外存储器中的执行速度远小于片内存储器中的执行速度。因此,需要执行一段汇编代码,将部署段的程序搬移到片内高速缓存中,并跳转至片内高速缓存中执行[1]。

以下是bootloads.s 部分代码示例:

初始化部分主要涉及到电源管理控制器(Power Sleep Controller,PSC)、锁相环(Phase Lock Loop,PLL)、串口(UART)和DDR 等系统必备模块的初始化。

部署执行通过外部的串口输入值,进行选择部署,该文设计串口输入为2 时,则部署重构段代码,串口输入其他值或没有输入时,则直接部署应用段代码。

部署执行代码是基于TI 公司提供的开发工具包里的IBL 进行修改的,原本的IBL 编程主要放置在I2C的EEPRAM 中,用于引导部署存放在外部FLASH 内的程序,并且可以同时部署多核应用程序。该次将其代码进行修改,放置在部署段中,对后面重构段与应用段进行部署。

重构段:该文通过传输速度较快的以太网口进行重构。重构段的程序分三步:首先,完成以太网口和串口的初始化。然后,通过接收外部串口的输入选择更新的段,通过TCP 或者UDP 接收外部客户端的更新数据,最后,将数据写入相对应的NOR FLASH 区域,向网口发送完成重构结束命令,重构软件流程图如图4 所示。

图4 重构软件流程图

网口初始化主要依托NDK(一种基于SYS/BIOS实时多任务操作系统的网络开发集成工具),其提供了所有以太网开发需要的硬件驱动、用户接口(Socket)和各层协议。NDK 主要由Nettool.lib、Stack.lib、OS.lib、Hal.lib、Netcrl.lib 五部分组成。分别对应网络应用开发工具、协议栈、操作系统接口、底层硬件驱动和网络控制层。

整个重构程序基于SYS/BIOS 实时多任务操作系统,采用Socket 套接字,创建UDP 服务器端(Server)等待外部连接,外部客户端(Client)连接服务端发送待更新的数据包,服务端将对接收到的数据进行解析,当包总数和包序号相等时,则表示数据全部接收完毕,将更新的数据拼接之后放入内存中,然后再写入NOR FLASH。

1)串口输入为0,擦除NOR FLASH的部署段,接收更新的数据包并烧写NOR FLASH 中的部署段程序;

2)串口输入为1,擦除NOR FLASH的重构段,接收更新的数据包并烧写NOR FLASH 中的重构段程序;

3)串口输入为2,擦除NOR FLASH 的应用段,接收更新的数据包并烧写NOR FLASH 中的应用段程序。

烧写完毕之后,向服务器端发送结束包,表示已完成接收,之后采用硬/软复位,即写RSCTRL 寄存器实现复位,FLASH 烧写流程图如图5 所示。

图5 FLASH烧写流程图

综上可知,在不掉电的情况,重构段的任务核心在于与外部建立网络连接,通过网络协议接收待重构的代码数据,将接收到的完整数据烧写入NOR FLASH 相应的段,最后采用硬/软复位重启,从而实现在线的动态重构。

应用段:应用程序主要是用户的实际使用代码,根据实际的情况,无论单核应用程序还是多核应用程序,均可部署。

3 系统搭建与测试

为了验证该设计的有效性,基于某项目要求搭建相应的硬件平台,如图6 所示。该设计采用的是32 MB 的NOR FLASH,外挂在EMIF 接口总线上,依次规划为部署段8 MB,网络重构段占用8 MB,应用代码段占用16 MB 空间。

图6 硬件平台结构搭建

调试阶段,准备好部署程序、重构程序和应用程序后,通过仿真器将其代码都烧入NOR FLASH。CCS 环境编译生成的.out 文件不能直接烧写NOR FLASH,必须用TI 公司提供的三个工具软件hex6x.exe、b2ccs.exe 和ccs2bin.exe,将.out文件转换为.bin 文件,若应用代码涉及多核时,还需要软件mcaimage.exe,并结合.cfg 文件(对多核的程序配置文件)将多个.out 文件转换成.image 文件。最后,将部署程序、重构程序和应用程序分别烧入FLASH 地址0x70000000、0x70800000、0x71000000,分段烧写完成后关电,设置为EMIF 启动方式重启。对该设计进行测试,主要有两种场景,一种是直接启动,另一种是进行在线重构。

测试第一种场景,即直接启动应用代码。上电启动之后,串口无输入或者接收下发1 时,直接对应用代码进行启动,该次测试的应用程序是基于TI 提供的库函数做的接口初始化程序,版本为V1.0,记录了打印显示,可以直接完成应用段启动。

测试第二种场景,即实施在线重构应用代码,该次重构代码版本为V2.0。外部复位之后,串口下发2,将启动重构段程序,输出打印,如图7 所示。

图7 重构程序启动显示

重构段程序将初始化串口与以太网口,通过串口选择需要更新的应用段程序,连通网络建立服务端,等待客户端向DSP 发送将要固化的代码,该次客户端运行在基于VC++的MFC 界面,程序中需设计两个同步线程,用来实现数据的实时接收显示功能。

该次测试选择动态重构应用段代码(串口持续输入2),当接收网络数据包结束之后,将应用段对应的FLASH 段进行擦除与写入(地址:0x71000000),完成之后,通过网口回复完成包,最后通过写寄存器实现硬/软复位,过程显示如图8 所示。复位之后,通过打印可以观察到,直接启动的应用代码由之前的V1.0 升级为V2.0,证实了该重构的有效性。

图8 代码重构过程显示

可见,该设计在不需要更新时,串口无输入即可,需要更新应用段程序时,串口持续输入2 即可。完成重构之后,会直接进入硬/软复位。

4 结论

该文对TMS320C6678 的加载模式进行研究和扩展,设计和实现了一套基于EMIF 接口的多级加载和动态重构方案,通过搭建软硬件对设计方案进行了验证,结果表明,该方案能够实现快速的EMIF 二级加载,并且能够实现在线重构功能,能极大地简化后期产品的运行维护和升级,具有一定的参考价值。

猜你喜欢
流程图串口代码
云的识别指南
MCS—51单片机中的多串口通讯技术的应用
神秘的代码
一周机构净增(减)仓股前20名
重要股东二级市场增、减持明细
近期连续上涨7天以上的股
全国计算机等级考试机房准备工作探讨
流程图学习指南
微机串口的测试诊断
基于VC串口通信的实现