TMS320C6678的EMIF16多核程序烧写的软件使用说明 下载本文

内容发布更新时间 : 2024/12/24 7:27:49星期一 下面是文章的全部内容请认真阅读。

TMS320C6678的EMIF16多核程序烧写软件使用说明

1 概述

1.1 范围

本文档包括:TMS320C6678的EMIF16多核程序烧写软件使用说明。

1.2 目的

指导C6678的EMIF16多核程序烧写过程。

1.3 设计依据

[1].TMS320C6678 Multicore Fixed and Floating-Point Digital Signal Processor data manual,德州仪器

[2].KeyStone Architecture Bootloader User Guide, 德州仪器

1.4 背景

a) 本项目的任务提出者:雷达所9号楼课题组 b) 开发者:边小艳 c) 用户:课题组内部

1.5 开发环境和运行环境

开发工具:CCStudio v5.1。

运行的硬件环境:TMS320C6678芯片,EMIF16外挂并行Nor Flash,Nor Flash容量为32MB,可选型号如Numonyx生产的JS28F256P,Spansion生产的S29NS256等。

2 任务概述

TMS320C6678的EMIF16多核程序烧写主要包括三个部分:多核的待烧写工程, 烧写转换工具以及烧写工程。三个部分之间的联系如下图所示:

多核的待烧写工程

.out文件烧写转换工具.bin文件烧写工程烧到NOR Flash

图1 TMS320C6678的EMIF16多核加载总体框图

多核的待烧写工程: core0的待烧写工程除了完成自身的处理任务外,还要实现加载其它待加载的核,因此需要在core0的待烧写工程中增添加载这部分程序,其它核的待烧写工程不需要添加,若多核是同一个工程,则需要在core0的处理程序中添加加载程序。 具体请看第3节。

烧写转换工具:在路径EMIFBootUtility\\hex_ge6678_EMIFBoot中的EMIFboot_out2bin.bat是各核的代码转换工具,实现将各核的.out文件转换成.bin文件,八个核使用同一个转换工具,但是在转换之前需要将.out文件重命名,具体使用方法请参看第4节。

5

烧写工程:将待烧写的核的.bin文件通过EMIF16接口烧写到外接Nor Flash中去,具体请看第5节。

3 多核的待烧写工程说明

3.1 core0待烧写工程说明

在core0的待烧写工程中,除了完成自身的任务之外,还要作为主核去加载其他的核,因此,加载这部分作为一个单独的模块整理在一个文件夹core0_Pjt_Use中,对于core0的待烧写工程,只要把这个文件夹放到此工程中,并调用加载函数Core0_EMIF16_BOOT()即可。 3.1.1

工程文件说明

在core0_Pjt_Use文件夹主要有如下文件:

表1 core0_Pjt_Use文件函数说明

文件名 功能、用途 包含的函数 函数功能 初始化EMIF16接口,EMIFboot.c 包含加载多核的函数 Core0_EMIF16_BOOT() 加载其它需要加载的核,在主函数中直接被调用 Init_DDR3_C6678.c InitPLL_C6678.c 包含DDR3接口初始化函数 包含PLL的初始化函数 Init_DDR3() InitMainPLL() 初始化DDR3接口 初始化PLL Core0从Flash中读出Core0_Boot_Secondarycore () core0_boot.c 包含加载单核的函数 core0_boot_othercores() NOR_init() flash_nor.c 包含对flash的擦除、烧写的基本函数 NOR_writeBytes() 包含EMIF16接口的初始化函数 EMIF_init() KeyStone_EMIF16_init() NOR_FLASH_erase_blocks() NOR_FLASH_write_block() NOR_FLASH_read_block() boot() NOR_erase() 某个核的代码并按段加载 将Flash中的数据写到其他核的L2中 初始化Nor Flash 擦除一定长度的NOR Flash 向Nor Flash中写入一定长度的数据 配置EMIF16接口的寄存器 初始化EMIF16接口 擦除flash的某块区域 烧写flash的某块区域 读取flash的某块区域 从flash中读取core0的代码按段加载,并跳到入口地址 KeyStone_EMIF16_Init.c EMIF_NOR_FLASH_test.c 包含对flash擦除、烧写的用户可调用函数 bootload.asm 包含core0自身加载的汇编函数 6

文件名

功能、用途 包含的函数 函数功能

存储器空间配置和段C6678.cmd 链接命令文件 的配置,主要是为.bootload段的分配 3.1.2 程序流程图

上电后,core0待烧写程序的执行过程如下:

上电 core0执行Rom code,初始化EMFI16接口,并跳到Nor Flash起始地址执行(1) core0在Nor Flash中执行bootload,将代码按段从Nor Flash搬到内存(2) 在main入口地址处开始执行,初始化外设(3) core0加载其他待加载的核(4) 其他处理模块(5) 结束

图2 core0待烧写程序的执行过程

注:如上图所示,(1)中的Rom code是C6678出厂时固化在Rom(从0x20B00000到0x20B1FFFF)中的一段代码,不是由用户编的,用户不能改变,下面的(2)(3)(4)(5)过程是由用户编的。 3.1.3

操作步骤

当core0需要加载其他核时,需要做的步骤是:

1) 将core0_Pjt_Use文件夹放到待烧写工程的文件夹中。

2) 在CCSv5.1环境下,将core0_Pjt_Use文件夹中的inc的绝对路径添加到properties?C/C++ Build?Setting?Include Option的搜寻路径中。

3) 在待烧写主程序main中调用EMIFboot.c中的加载函数Core0_EMIF16_BOOT()。 4) 在EMIFboot.c中定义各核的代码烧写到Nor Flash中的地址(加载时的源地址)。在7个核的工程全不相同的情况下,需要将7个核的代码烧到7块不同的空间,这里为每个核预定义的Flash空间分

7

配如下:

表1 预定义的八个核的Flash空间分配

核名 Nor Flash 起始地址 Nor Flash 结束地址 预留空间大小

Core1 0x70200000 0x703FFFFF 2MB

Core2 0x70400000 0x705FFFFF 2MB

Core3 0x70600000 0x707FFFFF 2MB

Core4 0x70800000 0x709FFFFF 2MB

Core5 0x70A00000 0x70BFFFFF 2MB

Core6 0x70C00000 0x70DFFFFF 2MB

Core7 0x70E00000 0x70FFFFFF 2MB

若某些核的代码相同,则需要烧写到Flash的同一块空间,为了统一,这里规定:相同代码都烧到核号小的Flash空间(由表一分配的),例如core1、core5、core7的代码相同,则它们三个的烧写地址是0x70200000。若某些核不需要加载,则定义加载地址无效,无效值为0x5a5a5a5a。 5) core0_Pjt_Use文件夹中有加载时用到的bootload.asm文件和c6678.cmd文件,可以将C6678.cmd替代原工程中的.cmd文件,但若想用自己的.cmd文件,则可以按照c6678.cmd文件进行改正,需要注意的几点是:

a) 在待烧写工程的.cmd文件中需要加上下面两句,作用是将汇编函数所在的段.bootload段放在内存的起始地址处。

BOOT (RWX) : org = 0x00800000 len = 0x00000400

.bootload > BOOT //.bootload是在bootload.asm文件中定义的段

b) 若工程的输出文件格式是ELF格式(在工程的Properties->CCS General->Output format下) ,则需要在.cmd文件开始处加上:

--export=boot

此句的作用是说明被ELF的obj文件输出的符号。若不加此句,则bootload.asm中的汇编函数不会输出,即在.map文件中看到的BOOT空间没有被用到。若输出文件格式是COFF格式,则不需要加此句,否则编译出错。

c) 若工程是用SYS BIOS进行存储空间的配置,则需要在SYS BIOS 自动生成的.cmd中加上下面三句(可以参看example_pjt\\C6678_EMIFboot_8cores_sysbios\\Debug\\configPkg\\linker.cmd):

--export=boot // (放到MEMORY伪指令上面)

BOOT (RWX) : org = 0x00800000 len = 0x00000400//(放到MEMORY伪指令里面)

.bootload > BOOT//(放到SECTION伪指令里)

3.2 core1~core7待烧写工程说明

对于core1到core7的待烧写工程,若想正确加载,只需编写正确的.cmd文件,不管7个核是同一个工程还是不同工程, L2 SRAM不要用Global L2,需要用Local L2,比如0x11800000需改成0x00800000。

8