TI公司C6000系列DSP具有强大的处理能力,在嵌入式系统中有着广泛的应用。由于程序在DSP内部存储器的运行速度远大于片外存储器的运行速度,通常需要将程序从外部加载到DSP内部运行。由于C6000系列DSP均没有片上非易失性存储器,而最常用的方式为采用非易失Flash存储器进行程序的存储和加载。然而,该系列DSP的推出是一个渐进的过程,其芯片内部结构随着上市时间的先后有着较大的不同,而TI公司没有给出统一的加载方式。针对该问题,本文全面研究了不同DSP芯片的加载方法与差异,并根据这些特点提出了通用的二次加载方法。
1 TI公司提供的二次加载方法
TI公司的DSP芯片二次加载的原理是一致的,加载步骤如下:
①通过一次加载将二次加载程序载入DSP片内或片外存储器;
②运行二次加载程序加载剩余的程序与数据来完成后续加载;
③跳转到主程序入口,完成加载。
但是由于芯片内部结构不同,TI公司提供了不同的加载方法。根据程序与数据空间存储映射的不同,主要分为两类:分离存储映射的加载方式和混合存储映射的加载方式。
1.1 分离存储映射的加载方式
在TI公司最初推出的C6000 DSP中,程序与数据空间采用分离的存储映射方式,代表芯片为C6201和C6701。在这种方式下,程序空间与数据空间是分离的,片内程序空间只能在第一次加载时被写入;而在二次加载的过程中,只能对片内数据空间或外部存储空间进行访问。而且运行第一次加载程序时,就要将存放在Flash中首64 KB的数据全部搬入DSP程序空间中,而数据空间就需要二次加载来完成。二次加载的流程如图1所示。
从图1中可知,采用这种加载方式存在如下问题:
①对程序大小有限制,二次加载程序与主程序总和不能大于64 KB,无法完成正确的加载。
②加载方式较不灵活,DSP内部的程序空间在第一加载后就无法更改,二次加载一般只能加载数据。
1.2 混合存储映射的加载方式
继推出C6201和C6701后,TI公司又推出了程序与数据空间混合存储映射的DSP芯片。这种映射方式是当前C6000 DSP的主流,典型的芯片包括C6211、C6711、DM642、C6455等。在这些芯片中,程序空间与数据空间是统一编址的,程序与数据可以混放。在加载时,不论一次加载还是二次加载,均能访问DSP片内任意的存储空间。第一次加载程序首先将存放在Flash中首1 KB的数据搬入DSP内部存储器,然后运行二次加载程序,将后续的程序或数据搬入DSP片上存储器。加载的流程如图2所示。
在该模式下,二次加载程序能够访问任意的DSP内部地址,突破了被加载程序长度的限制,具有更高的灵活性,因此TI公司后续的C6000芯片中均采用了该加载方式。
2 通用的二次加载方法
由于内部存储映射方式的不同,C6201、C6701与其他C6000系列DSP芯片的二次加载方式有各自的特点,这在工程应用中带来了很多不便,因此需要将这些特点统一起来,建立通用的加载方法。下面介绍两种通用的二次加载方法:非结构化的加载方式和结构化的加载方式,分别对应于不同的应用场合。
2.1 非结构化的加载方式
非结构化的加载方式是指在加载时直接将Flash中的数据搬运到DSP中,而不对这些数据进行解析。该方法非常简单,适合程序空间不大于DSP内部存储空间的应用场合。
在生成可烧写到Flash中的文件时,首先将可执行文件通过调试接口下载到DSP内部(包括二次加载程序),然后将DSP内部存储器中的数据完全导出(内部存储器大小)。如果是C6201或C6701芯片,需要分别导出程序空间与数据空间的数据(分别为64KB);如果是其他C6000芯片,则不用区分,导出连续的存储空间即可。然后采用转换软件将导出的数据转换为二进制可烧写文件,最后将数据文件按照固定的地址烧写到Flash中。生成流程如图3所示。
加载时,二次加载程序不解析任何数据包结构,只将固定地址、固定长度的数据段加载到DSP内部空间。具体的加载流程如图4所示。
该方法通用于两种不同存储映射的DSP芯片,使用前提是程序规模不超过片上存储器的大小(如C6701为64 KB,C6455为2 MB)。非结构化加载方式在生成烧写文件时,首先直接将DSP内部存储器的内容完全导出为数据文件,然后对该数据文件进行处理转换为二进制文件,最后将数据文件按照固定的地址烧写到Flash中。
需要注意的是,对于C6201或C6701芯片,二次加载时仅加载数据文件,而其他C6000芯片则加载程序与数据混合的文件。非结构化的加载方式浪费了大量的空间,例如当程序与数据并没有使用DSP所有的内部空间时,仍然使用最大程序空间来生成烧写文件。
2.2 结构化的加载方式
结构化加载方式是指在生成烧写文件的过程中对程序中的各种数据进行分类并添加结构,形成多个数据段,然后通过分析这些结构化的数据段进行加载。具体方法为:在生成烧写文件时采用TI公司提供的烧写文件生成工具hex6x.exe,将程序编译后生成的.out文件转换为相
应的结构化可烧写文件。生成过程如图5所示。在生成的结构化文件中主要包含了主程序入口、每个程序段的目标地址、长度以及结束标志等内容。加载流程如下:
①上电时,DSP通过EMIF接口将二次加载程序读入芯片内部;
②运行二次加载程序,对DSP的EMIF接口进行配置;
③解析Flash中结构化的程序数据,将主程序入口地址进行暂存;
④对数据段i(i=1,2,…,n)进行解析,首先获取数据段在DSP中的目的地址和数据段长度,然后从Flash中读取数据段内容,最后将数据段内容载入DSP中对应地址。
⑤循环执行步骤④,直到遇到结束标志为止。
⑥读取暂存的主程序入口地址,二次加载程序跳转到该地址,完成加载。
结构化方式的加载过程如图6所示。
该方法对两种不同存储映射的DSP芯片通用,能够将程序段或数据段放置于DSP存储资源的任何位置,不区分片内或片外存储,同时没有程序段大小的限制;而且,在采用结构化的加载方式后,烧写文件的大小能够预先确定,从而有效利用Flash的存储空间。因此,采用结构化的加载方法具有良好的灵活性和扩展性,是二次加载的首选方法。
需要注意的是,该方法不能用于C6201和C6701的片内程序加载(因为这些芯片上的程序空间在一次加载后无法更改),但是适用于放置于外部SRAM或SDRAM中的程序加载。
结语
本文首先对C6000系列DSP芯片的二次加载方式进行了分析,指出了各种DSP芯片在二次加载时的特点与异同;然后从通用的角度出发,提出了非结构化的加载方式和结构化的加载方式,并介绍了这两种加载方法的特点与适用范围。本文提出的方法能够解决一大类C6000系列DSP芯片的二次加载问题,具有较高的工程价值。