文献标识码:B
文章编号: 0258-7998(2012)11-0026-02
TMS320C6455(以下简写为C6455)是德州仪器(TI)公司的高性能数字信号处理芯片(DSP),在我国很多行业都得到了大规模的应用。在绝大多数应用中,都需要将C6455应用程序烧写到Flash中以实现系统自启动。系统上电后,C6455会自动将Flash起始位置的1 KB的代码加载到内部RAM[1],而对于C6455这种高性能的DSP,应用程序代码会远远大于1 KB,为此,TI公司提供了二级加载的解决方案。二级加载就是在前1 KB空间中存储EMIF配置和程序拷贝代码,用于将应用程序从片外Flash搬移到片内RAM或片外RAM。搬完后,再跳转到应用程序的起始地址,执行应用程序[2]。二级加载解决大尺寸应用程序代码的加载问题,主要应用于程序代码在RAM中的地址连续或者接近连续的情况。
1 新问题
在实际的典型应用中,C6455将外接64 MB的DDR,其基地址为0xE0000000。应用程序一部分置于内部RAM中,还有一部分(如通信协议)则置于DDR中,如图1所示。
应用程序代码存放在0x00810000~0x009FFFFF的片内RAM中,协议栈的堆(HEAP)空间则放在0xE0000000~0xE27FFFFF的DDR中,协议栈代码空间被分配在0XE2800000~0XE3FFFFFF的DDR内。按照TI公司提供的二级加载,理论上可以有两种实现方案:
(1)方案1:直接移植TI的 BootLoader的示例程序。TI公司的BootLoader示例程序采用汇编代码编写,主要分为EMIF初始化、代码搬移和程序跳转三部分。代码搬移是从Flash搬移到片内RAM,而本应用还需要搬移一部分代码到DDR,需要增加PLL和DDR初始化代码。其程序流程如图2所示。
(2)方案2:重写BootLoader代码。重写BootLoader程序代码,依据存储器分段情况进行分段加载。首先初始化PLL、EMIF和DDR;然后将应用程序代码搬入内部RAM、把协议栈和用户数据搬入DDR;最后跳转到C代码的入口地址开始执行。其程序流程如图3所示。
方案1实现起来软件更改较少,实现较容易,但需要的Flash存储器的资源比较多,按照图1所示的分配,0xE4000000-0x810000=0xE37F0000,需要3.8 GB的Flash来存储代码,显然是不合理的;方案2需要大于60 MB的Flash资源,存储器资源开销可以接受,但是由于限制在1 KB的程序空间,受在1 KB程序空间内要实现PLL初始化、EMIF初始化、DDR2初始化以及分段拷贝功能空间的限制,代码优化难度巨大。
由此可见,方案1除了对硬件资源非常浪费外,由于加载的无效代码量大,加载速度很慢;方案2虽然对Flash资源的消耗大大降低,启动速度也会相应加快,但是代码本身的开发难度比较大,而且没有可扩展性。因此,本文提出三级加载的方法。
2 三级加载方案
三级加载Flash空间分配如图4所示,总共需要用到的Flash空间资源为20 MB多。DSP代码分为三级结构:第一级是TI公司提供的二次加载BootLoader解决方案;第二级是3次加载的管理程序manager;第三级为应用程序代码app。
(1)第一级加载
系统上电后,6455自动加载1 KB的BootLoader代码到0x00800000~0x00800400内部RAM中,开始执行BootLoader代码。
(2)第二级加载
BootLoader配置EMIF,将manager代码加载到0x00800400~0x00810000内部RAM中,开始执行manager代码。BootLoader程序流程如图5所示。
(3)第三级加载
Manager代码初始化PLL、EMIF和DDR,接着将应用程序代码搬入内部RAM,再把协议栈和用户数据搬入DDR,最后跳转到应用程序的入口开始执行,如图6所示。
介绍了一种基于TMS320C6455的大尺寸非连续的代码加载方法,较传统的二级加载方式有更大的灵活性和更高的Flash利用率。连续加载只是分段加载的特殊情况(即分段数为1),该加载方法对于连续代码加载同样适用。虽然该加载方法是基于C6455设计实现的,但是对于TI公司的其他型号DSP也有很好的借鉴作用。这种三级加载方法已在航空电子系统上得到应用,实践证明该方法是一种使用可靠的加载方法。
参考文献
[1] TMS320C6455 fixed-point digital signal processor[S].Literature Number:SPRS276C,March,2006.
[2] Texas Instruments.Using the TMS320C6452 bootloader[S]. Literature Number:SPRAAW2A,June,2009.