摘要
- 在许多DSP应用程序中,需要在启动时将代码和/或数据从一个位置复制到另一个位置。基于此问题,C6000 DSP提供三种类型的引导配置:无引导进程、ROM引导进程和主机引导进程,其中ROM引导过程最为常用。在C621x/C671x/C64x上,选择ROM引导作为引导配置时,当CUP处于停滞状态且进行释放重置后,EDMA将自动从CE1复制1K Byte的代码到地址0。
- DSP应用程序不限于1K字节的代码。如果应用程序大小超过1K字节,则需要开发一个自定义引导例程来复制ROM引导未复制的额外代码部分。自定义引导例程被称为二级引导加载程序或辅助引导加载程序。本应用程序说明描述了如何通过将基于RAM的应用程序转换为基于闪存的应用程序来创建辅助引导加载程序。这是通过将在Code Composer Studio开发环境中开发的基于C6000 DSP的DSP/BIOS应用程序迁移到实际的嵌入式产品来完成的。本应用说明将使用DSP/BIOS参考框架3级(RF3)示例来说明dsk6713板上的闪存引导。
- 本应用程序说明的附录还提供了非BIOS应用程序的辅助引导加载程序的示例。
- DSP/BIOS和非BIOS示例的代码可随本应用说明下载。
1. 引言
- 在许多DSP应用程序中,需要在启动时将代码和/或数据从一个位置复制到另一个位置。基于此问题,C6000 DSP提供三种类型的引导配置:无引导进程、ROM引导进程和主机引导进程。所选的引导过程由BOOTMODE引脚的配置决定。请参阅设备特定数据表,了解特定设备支持的引导模式,以及为特定引导模式配置设备。
- 最常用的引导配置是ROM引导进程(在本文档中也称为片上引导加载程序)。当选择此配置,ROM引导进程通过DMA/EDMA控制器将位于外部ROM开头的固定量的内存复制到地址0。从ROM到地址0的传输是以单帧块传输的形式自动完成的,当CPU处于停滞状态且设备从外部重置中释放时就会发生这种传输,传输完成后CPU从停滞状态释放并从地址0开始执行。
- ROM引导过程因特定C6000设备而异。
- 620x/670x DMA从CE1向地址0复制64K字节
- 621x/671x/64x EDMA从CE1的开头向地址0复制1K字节。
- 应用程序规模决定片上引导加载功能是否足够或者是否需要辅助引导加载程序。如果应用程序规模小于ROM引导复制的大小,则不需要辅助引导加载程序(自定义引导代码)。通常,621x/671x/64x应用程序需要辅助引导加载程序,因为应用程序规模大于片上引导加载程序复制的1K字节内存。
- 在需要辅助引导加载程序的应用程序中,此自定义引导代码通常位于ROM存储器的开头,因此它可以由片上引导加载程序自动传输到地址为0的内部存储器。一旦传输完成,CPU就从地址0开始执行,即运行自定义引导代码。然后,辅助引导加载程序将应用程序的其余部分复制到RAM中。图1显示了使用辅助引导加载器引导应用程序时发生的事件序列。
1.1 二级引导加载注意事项
- 如上所述,ROM引导是许多C6000应用程序的首选引导方法。如果选择了ROM引导模式,并且需要辅助引导加载程序,则必须考虑以下几点:
- COFF字段位置
- 构建应用程序
- 编写自定义引导代码(辅助引导加载程序)
- 将应用程序烧写到Flash中
1.2 COFF字段位置
- COFF字段是占用内存映射中连续空间的代码或数据块。COFF字段有三种类型,即代码、初始化数据和未初始化数据。每个COFF字段都有一个load和一个run属性。字段的加载属性告诉加载器或Flash Burn Utility在项目构建之后将字段放置在何处。字段的run属性指定当设备退出RESET时字段将从何处执行。因此,如果为一个字段指定了不同的加载和运行地址,则辅助引导加载程序必须将该字段从加载地址复制到运行地址。
- 考虑以下示:
text: LOAD = FLASH, RUN = IRAM
- 在上述情况下,.text被放置在闪存中,然后在引导过程中由辅助引导加载程序复制到IRAM。应用程序中对.text字段的所有引用都指向其运行地址IRAM。Flash ROM中具有加载地址的每个字段都形成加载映像的一部分。对于ROM引导进程,加载映像由代码和初始化数据组成。
- 字段运行地址的确定是基于CPU访问该特定字段的频率。如果一个字段只被CPU访问一次,那么它在RAM中通常不会有运行地址以节省RAM空间用于其他目的。例如,在引导过程中只访问一次的.cinit字段,通常会在flash中有一个加载和运行地址。需要CPU更快访问的字段将在RAM中有一个运行地址。如果某个特定字段具有不同的加载和运行地址,则辅助引导加载程序负责将所有字段从其加载空间复制到其运行空间。所有未初始化的数据字段都放在RAM中,这些字段将具有相同的加载和运行地址。
- 有关COFF字段描述和加载运行规范的更多详细信息,请参阅TMS320C6000 Assembly Language Tools User’s Guide (SPRU186) 。Table 2列出了DSP/BIOS字段和建议内存位置。
1.3 构建和链接应用程序
- 项目构建后,链接器将生成一个映射文件,其中包含用于确定每个字段在内存中的位置字段链接信息。映射文件包含字段大小、加载地址和运行地址等信息。
- 映射文件的摘录如下所示:
.bios
90005600 00001f00 RUN ADDR = 800063e0
90005600 00000700 biosi.a62 : swi.o62 (.bios)
90005d00 00000540 lnkrtdx.a62 : rtdx.o62 (.bios)
90006240 00000400 biosi.a62 : hwi_disp_asm.o (.bios)
90006640 00000300 : prd.o62 (.bios)
90006940 00000280 : rta.o62 (.bios)
- 这表示.bios字段长0x00001f00字节,加载地址为0x90005600,运行地址为0x800063e0。创建自定义启动代码需要这些信息。映射文件还包含有关内存分区、子分区和符号的详细信息。
1.4 编写自定义引导代码
- 一旦构建并链接了项目,就应该编写自定义启动代码。自定义引导例程通常是用汇编语言编写的,因为C环境在引导时没有初始化。以下是通常由自定义引导代码执行的任务列表:
- 配置PLL。此步骤建议用于具有软件可编程PLL的C6x设备以提高引导性能。
- 配置EMIF以访问外部存储器。
- 将初始化字段从ROM复制到字段运行地址指定的内存位置。
- 调用_c_int00()。
- 一旦自定义引导代码完成,就应该将其包含在项目中,并重新构建项目。2.3.1节包含二次引导代码示例。
1.5 将应用程序烧写到Flash中
- 在Code Composer Studio中构建的应用程序将采用COFF格式(.out)。Flash burn utilities
(ROM programmers)通常适配ASCII十六进制格式的文件,因此,在烧写闪存之前,需要使用十六进制转换程序将应用程序COFF格式的输出可执行文件转换为.hex格式。这可以通过使用Code Composer Studio提供的十六进制转换程序来实现。