APP下载

多核DSP芯片C6678引导过程的研究与实现

2016-12-16吴沁文

现代雷达 2016年11期
关键词:外设内核应用程序

吴沁文

(南京电子技术研究所, 南京 210039)



·信号处理·

多核DSP芯片C6678引导过程的研究与实现

吴沁文

(南京电子技术研究所, 南京 210039)

多核数字信号处理(DSP)芯片给信号处理能力带来了质的提升,TI公司推出的TMS320C6678是一款具有代表性的高性能多核DSP芯片。引导技术是DSP应用的关键技术之一。C6678有着丰富的外设接口,可选择多种引导设备,同时由于多核的存在,引导过程变得更为复杂。文中对C6678的引导方式进行了透彻的研究,介绍了C6678多核引导过程的具体实现步骤,对C6678引导程序的开发提供了实际的方法和经验。

多核DSP芯片;TMS320C6678芯片;多核引导

0 引 言

多核数字信号处理(DSP)芯片把多个处理内核集成在一个芯片上,相比之前的单核DSP在处理能力上有着质的飞跃[1],因此,在通信、航空航天、雷达、工业探测等各种信号处理领域[2-3],越来越多地使用多核DSP作为主要处理部件[4-6]。其中,TI公司推出的高性能浮点多核DSP芯片TMS320C6678,具有8个C66x DSP内核,芯片浮点运算能力160GFLOPS[7],还具有显著的低功耗特点,代表了当前多核DSP的主流发展趋势。

DSP芯片进入多核时代,为信号处理系统的处理能力带来了很大的提升,但是也给DSP软件开发带来新的挑战[8]。上电引导技术是DSP开发应用的关键难点之一,C6678由于其引导设备的多样性以及多个内核的引导需求,上电引导过程比单核DSP要复杂许多。本文对C6678引导技术进行了研究,阐述了C6678的多种引导模式,给出了C6678多核引导的具体实现步骤,该项技术已在多项工程实践中得到成功应用。

1 Bootloader的执行和引导外设的选择

C6678内嵌了一个128 kB的只读存储器(ROM),其中放置了TI提供的bootloader代码[9-10],其起始地址为0x20B00000。上电后,C6678的8个内核中的内核0自动运行bootloader代码,而内核0以外的其他内核,则都执行一条IDLE语句,等待一个中断来把它们带出IDLE状态。

C6678外设接口很多,为用户提供了多种可选择的引导设备,包括FLASH、I2C、SPI、PCIe、Serial RapidIO、HyperLink、Ethernet等。C6678芯片有13个外部strap引脚BOOTMODE[12∶0]专用于引导方式的设置[7]。上电后,内核0执行bootloader代码,并采样13个BOOTMODE引脚的状态,决定采用哪种引导方式。BOOTMODE [2∶0]用于选择引导外设接口,BOOTMODE[9∶3] 规定该外设接口的初始化参数。bootloader根据这些参数对指定外设接口进行初始化,随后进入相应的引导过程。

表1 BOOTMODE[2:0] 采样引脚选择引导外设接口列表

选择不同引导外设的引导方式可以分为以下四大类:

1) No Boot方式:C6678将停留在bootloader代码段,不加载应用程序。

2) C6678作为主设备,从外部引导设备读取应用程序映像:采用这种模式的有EMIF16 boot、SPI boot、I2C Master boot Boot Table模式。

3) C6678作为从设备,等待外部引导设备将应用程序映像写入C6678内存:bootloader令DSP处于IDLE状态,外部host将应用程序映像直接写入C6678内存;然后,将应用程序入口地址写入C6678的BOOT_MAGIC_ADDRESS寄存器。bootloader查询到BOOT_MAGIC_ADDRESS地址非零时,就令DSP跳出IDLE状态,从该地址开始运行。采用这种模式的有SRIO directIO boot、PCIe boot、Hyperlink boot。

4) C6678与外部引导设备交互通信,加载应用程序映像:C6678按照一定的通信协议包格式收取引导设备发来的应用程序映像,直到收到结束包为止,跳转到指定的应用程序入口地址开始运行。采用这种模式的有SRIO Message boot、Ethernet boot、I2C Passive boot。

2 间接引导方式

除了上面四类引导以外,C6678还通过I2C提供了一种非常灵活的间接引导方式,即I2C Master boot Config Table模式。前提是首先要具备I2C EEPROM外设。

C6678可以选择多种引导设备,但是BOOTMODE[9∶3]所能选择的外设初始化参数有限,往往不能满足多变的应用场景。为了能提供更加灵活的外设引导模式,C6678提供了这种间接引导方式。在这种方式下,C6678先按照I2C Master boot模式从I2C EEPROM进行初级引导;然后,从I2C EEPROM读取间接引导设备的设置信息,对该设备初始化设置后,将引导设备重定向到该设备进行引导。该方式的具体步骤如下:

第一步:由BOOTMODE引脚选择I2C Master boot。

第二步:C6678通过I2C从I2C EEPROM读取“引导参数表”,根据表中的引导选项选择之后的引导模式。

如果选择Boot Table模式,则C6678直接从表中指定的I2C EEPROM地址读取应用程序映像。

如果选择boot Config Table模式,则从表中指定的I2C EEPROM地址读取到的不是应用程序映像,而是引导配置表,需继续执行第三、四步。

第三步:bootloader从I2C EEPROM读取引导配置表,根据引导配置表对外设接口做出设置更改。

第四步:bootloader在引导配置表的结尾处,获取间接引导设备信息,重定向到该设备,开始应用程序的引导。

3 多核引导过程的实现

C6678是多核芯片,因此引导过程比单核芯片要复杂许多,以上完成的只是内核0的引导,还要对内核1~内核7进行引导,才完成整个芯片的引导工作。为了说明多核引导的过程,下面以最基本的EMIF16 boot模式为例,对多核引导作详细描述。

3.1 一级引导过程

与其他芯片一样,C6678最基本的引导方式仍然是EMIF16接口引导,即从外部FLASH引导的方式。C6678共有CE0CE1CE2CE3四个地址空间可以连接FLASH,可对接宽度为16 bit或8 bit的FLASH。在EMIF16 boot模式下,上电后bootloader初始化EMIF16接口,然后跳转到C6678 CE0空间首地址0x70000000开始执行。因此,一般将C6678的FLASH芯片置于C6678的CE0空间。图1是16 bit NOR FLASH与C6678连接图,采用CE0空间。

图1 C6678 CE0空间与16 bit NOR FLASH连接图

如果应用程序很简短并且运行速度要求不高的话,我们可以直接把应用程序烧到以0x70000000地址开头的FLASH内即可。但是,对于C6678这样高速、多核、存储器容量大、外设资源丰富的DSP芯片来说,其应用程序一般来说是比较庞大的。因此,需要设计更复杂的引导过程。

3.2 二级引导过程

我们在FLASH首地址0x70000000处放一段简短的汇编代码(文件名为boot.asm),作为二级引导程序。以下是boot.asm代码示例:

//-----------boot.asm start-------------

BOOT_LEN .equ 0xC000 //应用程序长度,单位为字节

FLASH_ADDR .equ 0x70000200 //应用程序在FLASH内的首地址

RAM_ADDR .equ 0x800200

.sect “boot_sect”

.global _boot

.ref _c_int00

_boot:

MVKL RAM_ADDR,A4; MVKH RAM_ADDR,A4; //将内存地址放入A4寄存器

MVKL FLASH_ADDR,B4; MVKH FLASH_ADDR,B4; //将FLASH地址放入B4寄存器

MVKL BOOT_LEN,A0; MVKH BOOT_LEN,A0; //将程序长度放入A0寄存器

//将应用程序从FLASH拷贝入C6678内存

_wait_loop: LDH *B4++[1],B5; SUB A0,1,A0; Nop 4; STH B5,*A4++[1];

[A0] B _wait_loop; Nop 5;

MVKL .S2 _c_int00,B0; MVKH .S2 _c_int00,B0; //将应用程序入口地址放入B0寄存器

B .S2 B0; Nop 5;//跳到应用程序入口

//-----------boot.asm end-------------

这段汇编代码的作用是:把用户的应用程序从flash内地址0x70000200搬到C6678内存地址0x800200,搬移长度为应用程序长度。随后跳到应用程序入口_c_int00,即完成二级引导过程。

如果用户的应用程序仅需在内核0上运行,到此引导过程就完成了。但是在大多数应用场景下,用户的应用程序需要在多核上运行,所以还要对内核1~内核7进行引导,我们称之为三级引导。

3.3 三级引导过程

在本例中,在C6678的八个核上运行同一个应用程序usr.c。为了将user.c最终在八个核上运行起来,我们编写了一个三级引导程序,本例中称之为boot0.c。二级引导的任务是将boot0.c程序的代码搬到内核0上运行起来,由boot0.c代码最终完成将usr.c代码引导到八个核上并运行起来的任务。以下是三级引导程序boot0.c代码示例:

//-----------boot0.c start-------------

void main(void){

uint id,src_addr,dst_addr;

uint user_entry=0x802780,user_codelen=0x16E00/4,user_addr=0x849200;

void (*user_main)(void)=(void(*)(void)user_entry;

if(DNUM==0)// 内核0将应用程序usr.c代码搬入8个内核的内存

{ for(id=0;id<8;id++)

{ src_addr=0x70080000;dst_addr=user_addr+(id+1)*0x1000000;

copy(src_addr,dst_addr,user_codelen);}

}

for(id=0;id<8;id++) //内核0将应用程序入口写入其他7个内核的BOOT_MAGIC_ADDR

{ BOOT_MAGIC_ADDR(id)=user_entry; TSC_delay_ms(1); }

//core0对其他7个内核触发IPC中断使它们跳到应用程序入口开始执行

CSL_BootCfgUnlockKicker();

for(id=1;id<8;id++) {IPCGR(id)=0x1; TSC_delay_ms(5); }

CSL_BootCfgLockKicker();

(*user_main)();//内核0自己跳转到应用程序入口开始执行

//-----------boot0.c end-------------

程序具体步骤说明:

(1)应用程序的拷贝

C6678的每个内核都有属于自己的一套内存,包括32 kB的一级程序存储器(L1P RAM),32 kB的一级数据存储器(L1D RAM)以及512 kB的二级存储器(L2 RAM)。一般将L1P RAM和L1D RAM作为cache使用,而将L2 RAM作为内存使用。在本例中,应用程序usr.c放在内存L2 RAM中运行,用户的应用程序也可以放在8核共享内存MSMC SRAM或外部DDR存储器中,但放在内存中时,程序运行速度最快。

boot0.c首先将应用程序usr.c的代码从FLASH内地址0x70080000搬到每个内核的内存中,搬移长度为应用程序长度。每个内核的L2 RAM本地地址是0x800000,但还有一个全局地址供其他核访问。0x10800000对应内核0的L2 RAM,0x20800000对应内核1的L2 RAM,……,0x80800000对应内核7的L2 RAM。用这一套全局地址,内核0将应用程序代码拷贝到每个内核的内存中。

(2)设置BOOT_MAGIC_ADDR

在多核引导过程中,每个内核的L2 RAM的最后四个字有特殊的用处,用于放置应用程序的入口地址,称之为BOOT_MAGIC_ADDR。boot0.c将应用程序usr.c的入口地址写到内核1~内核7的BOOT_MAGIC_ADDR,地址为0x87fffc,同样要按照内核的序号加上全局地址偏移。

(3)触发IPC中断

内核1~内核7的BOOT_MAGIC_ADDR被写成应用程序入口地址后,还要给内核1~内核7都发送一个IPC中断。内核1~内核7收到这个中断后,就会跳出IDLE状态,跳到BOOT_MAGIC_ADDR指定的地址开始执行。

C6678有一对寄存器KICK0和KICK1来保护Bootcfg寄存器不被随便修改。boot0.c程序中需要先对这两个寄存器进行设置,使得Bootcfg寄存器写保护解锁,才能写内核1~内核7的IPC寄存器来触发中断,写完后再将写保护锁上。

给内核1~内核7的IPC中断发出后,内核1~内核7就依次跳到应用程序入口开始运行,至此内核1~内核7的引导就完成了。

(4)内核0应用程序的运行此时,boot0.c已完成对内核1~内核7的引导。最后,它运行(*user_main)()空函数使内核0自己跳转到应用程序入口地址,开始运行应用程序。

4 cmd文件的设计和内存地址的分配

在本例的引导过程中,引导程序和应用程序都在内存中运行,因此,需要对内存进行规划,不能在地址上有所冲突。

C6678程序在CCS环境下进行工程的新建、编译链接、生成.out目标文件,每个工程必须配备一个cmd文件,来决定目标文件各个代码段的地址分配。本例中,我们将二级引导文件boot.asm和三级引导文件boot0.c合并到一个工程boot0.project中,并配备boot0.cmd文件。以下为与上面boot.asm、boot0.c配套的boot0.cmd文件示例:

//-----------boot0.cmd start------------

MEMORY

{ L2SRAM0:org=0x800000,len=0x100 // L2SRAM0内存段放置boot.asm

L2SRAM1(RWX):org=0x800200,len=0x3000 // L2SRAM1内存段放置所有初始化段

L2RAM_un(RWX):org=0x830200,len=0x19000 // L2RAM_un内存段放置非初始化段

MSMCRAM(RWX):org=0xc000000,len=0xc0000 //多核共享内存段

}

SECTIONS

{ .boot_sect> L2SRAM0//boot.asm放入L2SRAM0内存段

.sysmem> MSMCRAM

.text > L2SRAM1

.cinit> L2SRAM1

…… //初始化段都放入L2SRAM1

.stack>L2RAM_un

.data>L2RAM_un

…… //非初始化段都放入L2RAM_un

}

//-----------boot0.cmd end------------

boot0.project工程编译后,与boot0.out文件一起产生的还有一个boot0.map文件,在该文件中,凡是标有UNINITIALIZED的段如.data、.far、.stack等都是非初始化段,除此之外的段都是初始化段,也即boot0程序真正需要写入FLASH并在boot过程中拷贝内存中的代码。为方便引导过程,本例中将所有初始化段都放在一段连续的内存空间0x800200~0x830200内,其长度为0x30000,换算成32 bit字长度即为0xC000。另外还定义了一段内存空间0x800000~0x800100,用来放置boot_sect段,该段即boot.asm代码。

需要注意的是,boot0程序代码的地址0x800200和长度0xC000需要和boot.asm程序中的RAM_ADDR和BOOT_LEN一致。另外,在boot0.map文件的开头还可以看到boot0.out文件的入口地址是0x807180,标识符为_c_int00,即boot.asm最后所跳转到的地址。

应用程序usr.c另外做一个工程usr.project,配备cmd文件为usr.cmd。在usr.cmd中,同样将非初始化段和初始化段定义在不同的内存空间中,初始化段所在内存空间的起始地址和长度即对应boot0.c程序中的user_addr和user_codelen。从usr.project工程编译后生成的usr.map文件开头可以找到usr.out程序的入口地址,需要将其与boot0.c程序中的user_entry对应起来。

需要注意的是,应用程序usr.out代码段拷贝到内核0内存中时,内核0上还在运行boot0.c程序,所以usr.out的初始化代码段和boot0.out初始化及非初始化代码段不能在地址上有重合。

5 烧写文件的生成

准备好引导程序和应用程序后,我们还必须把二级引导、三级引导、应用程序的代码都烧入FLASH。CCS环境编译生成的.out文件不能直接用来烧写FLASH,必须用TI公司提供的两个工具软件hex6x.exe和b2ccs.exe。先用hex6x.exe把.out文件转换成.hex文件,再用b2ccs.exe把.hex文件转换成烧写所需的bootasm.dat、boot0.dat、usr.dat。最后,将这三个文件分别烧入FLASH地址0x70000000、0x70000200、0x70080000,C6678即可完成上电自动引导过程。0x70000000是FLASH的起始地址,0x70000200、0x70080000分别和boot.asm中的FLASH_ADDR、boot0.c中的src_addr相对应,这两个地址可以自己定义,只要在FLASH地址空间内且不互相冲突就可以了。

要注意的是,用hex6x.exe、b2ccs.exe工具产生的.dat文件,默认是大端模式,如果工程是小端模式,则烧写前要将高低16 bit反一下。

6 其他应用场景

C6678每个核的内存较小,因此在应用场景中用户有可能需要将应用程序放在双倍速率同步动态随机存储器(DDR)中运行,此时,除了修改boot0.c中的usr_addr以及应用程序cmd文件中地址到DDR内指定地址以外,还要在boot0.c中添加DDR初始化语句。

另外,每个内核的应用程序也可以是不同的,则需要分别生成.dat文件,烧入FLASH不同的地址段,boot0.c也修改成从不同的FLASH地址来给各个内核加载程序。

7 结束语

C6678由于有多个核需要引导,引导过程以及地址分配比单核DSP要复杂,因此引入三级引导过程。一般来说,二级引导程序boot.asm比较简短且可以固定不变,三级引导程序boot0.c则需要根据应用程序所在的空间以及长度做出调整。引导程序的运行和应用程序的加载在地址空间上的分开也是C6678引导过程需要非常注意的要点。

[1] 于文震. 雷达信号数据处理平台发展趋势探讨现代雷达[J]. 现代雷达, 2009, 31(7): 1-7. YU Wenzhen. Development trend of radar signal and data processing platform[J]. Modern Radar, 2009, 31(7): 1-7.

[2] 刘 宇, 王岩飞, 杨汝良. 基于TMS320C6701高速并行信号处理平台的设计[J]. 现代雷达,2003,25(3): 18-20. LIU Yu, WANG Yanfei, YANG Ruliang. Design of high speed parallel signal processing platform based on TMS320C6701[J]. Modern Radar, 2003,25(3),18-20.

[3] 谢 民, 高梅国. 基于TMS320C62X的雷达制导信号处理器设计[J]. 现代雷达, 2006,28(11): 41-44. XIE Min,GAO Meiguo. Design of radar signal processing system based on TMS320C62X[J]. Modern Radar, 2006,28(11):41-44.

[4] 赵 非, 刘涛庆. TMS320C6678在单脉冲雷达信号处理系统中的应用[J]. 数字技术与应用,2014(6): 131-133. ZHAO Fei, LIU Taoqing. Application of TMS320C6678 in mono-pulse radar signal prcessing system[J]. Digital Technique and Application, 2014(6):131-133.

[5] 肖 亮,张学健. 基于多核DSP的超声成像处理算法的并行实现[J]. 电子技术应用, 2013,39(6): 27-30. XIAO Liang, ZHANG Xuejian. Parallel implementation of processing algorithm of ultrasound imaging based on mltiti-core DSP[J]. Application of Electronic Technique, 2013, 39(6): 27-30.

[6] 袁 琪,杨 康,周建江,等. 大点数FFT算法C6678多核DSP的并行实现[J]. 电子测量技术, 2015,38(2):79-80. YUAN Qi, YANG Kang, ZHOU Jianjiang, et al. Implementation of large points FFT based on C6678 multi-core DSP[J]. Electronic Measurement Technology, 2015,38(2):79-80.

[7] 牛金海. TMS320C66x Keystone架构多核DSP入门与实例精解[M]. 上海: 上海交通大学出版社, 2014. NIU Jinhai. TMS320C66x keystone architecture multi-core DSP introduction and case explanation[M]. Shanghai: Shanghai Jiaotong University Press, 2014.

[8] 董渊文, 张永军, 高晓亮, 等. 基于TMS320C6678多核DSP的分布式通信系统[J]. 微型机与应用, 2014,33(13): 74-76. DONG Yuanwen, ZHANG Yongjun, GAO Xiaoliang, et al. Distributed communication system based on multicore DSP TMS320C6678[J].Microcomputer & Its Applications, 2014, 33(13): 74-76.

[9] 胡海龙, 彭启琮. TMS320C6713基于DSP/BIOS的二级Bootloader开发[J]. 现代电子技术,2015(15): 74-75. HU Hailong, PENG Qicong. Development of a second-level Bootloader based on DSP/BIOS on TMS320C6713[J]. Modern Electronic Technique, 2015(15): 74-75.

[10] 谢世珺,李永超,马金岭. TMS320C6000系列带中断向量的二次Bootloader的设计与实现[J]. 电子工程师, 2007,33(3): 51-54. XIE Shijun, LI Yongchao, MA Jingling. Design and realization of the second-level Bootloader technology for TMS320C6000s with interrupt vector table[J]. Electronic Engineer, 2007,33(3): 51-54.

吴沁文 女,1975年生,本科,高级工程师。研究方向为信号处理、DSP、FPGA。

Study and Realization of Boot Procedure of Multi-core DSP C6678

WU Qinwen

(Nanjing Research Institute of Electronics Technology, Nanjing 210039, China)

Multi-core drgital signal processing (DSP) brought a quality improvement to the signal processing capabilities. The TMS320C6678 DSP presented by Texas Instruments (TI) is a representative high-performance multi-core DSP. Boot technique is one of the key techniques of the DSP′s application. C6678 has various peripheral interfaces and can select different boot devices. Owing to this and the existence of multiple cores, it's boot procedure is considerable complex. This paper gave a deep research on boot modes of C6678, discussed the specific boot steps of C6678's eight cores, providing practical methods and experience to the developing of C6678 boot programs.

Multi-core DSP; TMS320C6678; multi-core boot

10.16592/ j.cnki.1004-7859.2016.11.008

吴沁文 Email:qiwen_wu@sina.com

2016-08-17

2016-10-20

TN911.7

A

1004-7859(2016)11-0035-05

猜你喜欢

外设内核应用程序
万物皆可IP的时代,我们当夯实的IP内核是什么?
强化『高新』内核 打造农业『硅谷』
删除Win10中自带的应用程序
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
Microchip推出具备双ADC外设的全新器件,扩展其低成本8位PIC®单片机产品线
关闭应用程序更新提醒
贴身呵护 必不可少的PSP外设
外设天地行情
三星电子将开设应用程序下载商店