TMS320C6000系列DSP的Flash启动设计

发布者:数字奇迹最新更新时间:2007-06-15 来源: 单片机及嵌入式系统应用关键字:实时  加载  存储  地址 手机看文章 扫描二维码
随时随地手机看文章

引 言

随着近年来数字信号处理器(DSP)技术的迅猛发展,其越来越广泛地应用于国民经济的各个领域中。其中,TI公司推出的TMS320C6000系列DSP器件更是在许多需要进行大量数字信号处理运算并兼顾高实时性要求的场合得以应用。TMS320C6000系列DSP的系统设计过程中,DSP器件的启动加载设计是较难解决的问题之一。

C6000系列DSP的启动加载方式包括不加载、主机加载和EMIF加载3种。

3种加载方式的比较:不加载方式仅限于存储器0地址不是必须映射到RAM空间的器件,否则在RAM空间初始化之前CPU会读取无效的代码而导致错误;主机加载方式则要求必须有一外部主机控制DSP的初始化,这将增加系统的成本和复杂度,在很多实际场合是难以实现的;EMIF加载方式的DSP与外部ROM/Flash接口较为自由,但片上Bootloader工具自动搬移的代码量有限(1 KB/64 KB)。本文主要讨论常用的EMIF加载方式。

1 EMIF加载分析

实际应用中,通常采用的是EMIF加载方式,把代码和数据表存放在外部的非易失性存储器里(常采用Flash器件)。

下面以TMS320C6000系列中最新的浮点CPU——TMS320C6713(简称“C6713”)为例,详细分析其EMIF加载的软硬件实现。

硬件方面,其与16位宽度的Flash器件的接口如图1所示。

对于不同的DSP器件,加载方式的配置引脚稍有不同。C6713的配置引脚及其定义如表1所列。

应用程序的大小决定了片上的Bootloadet工具是否足够把所有的代码都搬移到内部RAM里。对于C6713,片上的Bootloader工具只能将1 KB的代码搬入内部RAM。通常情况下,用户应用程序的大小都会超过这个限制。所以,需要在外部Flash的前1 KB范围内预先存放一小段程序,待片上Bootloader工具把此段代码搬移入内部并开始执行后,由这段代码实现将Flash中剩余的用户应用程序搬移入内部RAM中。此段代码可以被称作一个简单的二级Bootloader。

图2所示为使用二级Bootloader时的CPU运行流程。

使用二级Bootloader需要考虑以下几个事项:

◇需要烧写的COFF(公共目标文件格式)段的选择;

◇编写二级Bootloader;

◇将选择的COFF段烧入Flash。

一个COFF段就是占据一段连续存储空间的程序或数据块。COFF段分为3种类型:代码段、初始化数据段和未初始化数据段。

对于EMIF加载方式,需要加载的镜像由代码段(如.vectors和.text等)和初始化数据段(如.cinit,.const,.switch,.data等)构成。另外,可以单独定义一个.boot-load段存放二级Bootloader。此段也需要写入Flash。

所有未初始化的数据段(如.bss等)都不需要烧入到Flash中。

2 二级Bootloader的编写

由于执行二级Bootloader时C的运行环境还未建立起来,所以必须用汇编语言编写。二级Bootloader可参照其他类似文献及TI相关文档。此处不再赘述。

CCS中用户工程编译链接后产生的.map文件包含了存储器的详细分配信息。一个典型的map文件中包含的存储器分配信息如表2所列。

与cmd文件不同,map文件不仅包含了各段存储在哪一段内存空间的信息,从map文件中还可以具体知道每个内存区间中有多少被实际使用(烧写Flash时会用到这个参数)。内存区间中未被使用部分是不需要写入Flash内容的,实际被使用的部分才是真正需要写人到Flash中的内容。

3 Flash的烧写

把代码等写入Flash的办法大体上可分为以下几种:

① 使用通用烧写器写入。

② 使用CCS中自带的FlashBurn工具。

③ 用户自己编写烧写Flash的程序,由DSP将内存映像写入Flash。

其中,使用通用烧写器烧写需要将内存映像转换为二进制或十六进制格式的文件,而且要求Flash器件是可插拔封装的。这将导致器件的体积较大,给用户的设计带来不便。

使用TI公司提供的FlashBurn工具的好处在于使用较为直观。FlashBurn工具提供的图形界面可以方便地对Flash执行擦除、编程和查看内容等操作。但这种力法的缺点也不少:首先,FlashBurn工具运行时需要下载一个.out镜像(FBTC,FlashBurn Target Component)到DSP系统中,然后由上位PC机通过仿真器发送消息(指令和数据)给下位DSP,具体对Flash的操作由FBTC执行。然而,这个FBTC一般是针对TI公司提供的DSP专门编写的,与板上使用的Flash的接口宽度(默认是8位)、操作关键字(因生产厂商不同而各异)都有关,所以,对用户自己制作的硬件不一定适合。例如:如果用户自己的电路板上使用的是与DSK同品牌的Flash芯片,接口为16位数据宽度,那么,使用FlashBur’n工具烧写将最多只有一半的Flash容量能够被使用,要想正确实现]EMIF加载就必须选择8位加载方式。这就造成了Flash存储器资源的浪费,同时限制了用户开发的灵活性。

虽然TI公司提供了FBTC的源代码供有需要的用户修改,但这样用户需要去了解FBTC的运行机制及其与上位机的通信协议,并对Flash烧写函数进行修改。用户可能需要修改的几个地方如下:对Flash编程的关键字和地址,BurnFlash函数中的数据指针和EMIF口的配置(针对1.0版本FBTC)。这就给用户开发带来了不便。把开发时间浪费在了解一个并不算简单的Flash烧写工具上并不是一个好的选择。

其次,FlashBurn工具不能识别.out文件,只接受..ex的十六进制文件,因此,需要将.out文件转换为.hex文件。这个转换的工具就是TI公司提供的Hex6x.exe工具。转换过程的同时,需要一个cmd文件(即图3中的Hex.cmd)指定作为输入的.out文件,输出的.hex文件的格式,板上Flash芯片的类型和大小,需要写入Flash中的COFF段名等。

使用用户自己编写的烧写Flash的程序较为灵活,避免了文件格式转换的繁琐。不过,此方法要求用户对自己使用的Flash芯片较为熟悉。

通常采用的Flash烧写程序是单独建立一个工程的办法:先把用户应用程序(包含二级Bootloader)编译生成的.out文件装载到目标DSP系统的RAM中,再把烧写Flash的工程编译生成的.out文件装载到目标DSP系统RAM的另一地址范围,执行Flash烧写程序,完成对Flash的烧写。这个办法要注意避免两次装载可能产生的地址覆盖,防止第2次装载修改了应该写入Flash的第1次装载的内容。

实际上,可以将Flash烧写程序嵌入到用户主程序代码中去,比单独建立一个烧写Flash的工程更为方便。Flash芯片的烧写程序段如下:


ChipErase函数和ProgramFlashArray函数的编写可参照用户使用的Flash芯片的Datasheet以及参考文献[1]。

ProgramFlashArray函数的第1个参数是源地址指针(指向内部Ram),第2个参数是目标地址指针(指向外部Flash),第3个参数是要写入的数据长度(单位为字)。

编写Flash烧写函数时有3点需要注意:

① 指向Flash地址的指针。由于C6713的低两位地址用于译码作字节选择,地址总线的最低位是EA2,所以,逻辑地址需要适当的移位才能正确地指向日标。

对8位存储器而言,应该左移2位;对16位存储器而言,应该左移1位;对于32位存储器,则不需要移位。例如要从(往)Flash的0x00000003地址读(写)一个字,其逻辑地址应该是0x90000000+(0x0003<<1),而非0x90000003。

② map文件中各内存区间被实际占用的尺寸大小是以字节为单位的,而ProgramFlashArray函数写入Flash的数据单位为字,所以需要将map文件中得到的尺寸大小的一半作为ProgramFlashArray函数的参数。

③ 烧写函数中使用了flash_burned常量作为判断是否需要对Flash操作的依据,且将其初始化为1。这是为了避免Flash加载之后会执行对Flash的操作。此变量应在烧写Flash时手动修改为0。

在仿真加载方式下,可以在CCS里的watchwindow窗口手动修改flash_burned常量为0,强迫CPU进入对Flash编程的程序段。实验证明,在仿真加载方式下手动修改flash_burned并不影响写入到Flash中的flash_burn-ed的值(仍为1),所以,写入Flash的flash_burned的值仍然是1。在系统Flash加载之后,CPU就会跳过此段代码,实现正确运行。

4 结 论

本Flash加载方案以C6713为例,稍加修改即可适用于TMS320C6000系列的其他DSP器件。经过在研制的伺服测试平台中的应用,证明本方法切实可行且易于实现,避免了目标文件格式的转换,比通常采用的FlashBurn工具使用起来更灵活方便,用户可以通过简单修改Flash烧写函数使之适应自己的硬件情况。对于Flash器件接口与TI的DSP不一致的情况,本方案是一个很好的选择。

关键字:实时  加载  存储  地址 引用地址:TMS320C6000系列DSP的Flash启动设计

上一篇:SOPC技术在电力机车改造中的应用
下一篇:TMS320C6000系列DSP的Flash启动设计

推荐阅读最新更新时间:2024-05-02 20:36

Bigtera携最新软件定义存储平台亮相BIRTV 2017
软件定义存储平台和解决方案业界领先的颠覆性的创新者Bigtera(大兆科技)于近日宣布,推出软件定义存储产品全新版本VirtualStor™ 6.3 ,并联合七牛、天云、爱数、灵犀智数、烽火超微等战略合作伙伴,于2017北京国际广播电影电视设备展览会(BIRTV 2017)上,展出该广电行业媒体融合的全方位解决方案和成功案例。 软件定义生态圈 融合媒体大平台 据悉,本届BIRTV 2017的展览主题为“融合媒体智慧广电”,这是当前广电行业最热门的技术,特别在多网融合、高清和4K视频的需求持续上升的市场环境下,如何提高存储容量和扩展性已然成为业界的一项重大技术挑战。为了更好地支撑智慧广电业务的灵活应用,一套存储基础架构需要针对不
[嵌入式]
关于51单片机字符串 EEPROM存储与读取的问题
题目如下 通过串口助手控制 LCD 显示屏,通过 LCD1602 显示并保存在 EEPROM 中,实现 数据的掉电保存(例 如:串口向单片机发送一串英文字符,该字符在 LCD 上显示出 来,若按下 k1 则实现数据的保存,按下 k2 实 现读取上次保存的数据,显示在 1602 上) 效果如下 #include reg52.h //此文件中定义了单片机的一些特殊功能寄存器 #include i2c.h #include string.h typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; sbit LSA=P2^2; sbi
[单片机]
关于51单片机字符串 EEPROM<font color='red'>存储</font>与读取的问题
用P89C664实现I2C总线大批量数据的自动存储
引言 在实际工作中,有些情况下可能需要对一些I2C接口发出的数据进行分析,如果数据较少则比较容易解决。比如可以直接把数据保存到单片机的RAM中,然后通过LED显示出来,但如果数据量很大,这种方法就很河取了。在这种情况下,想办法把大量的数据保存到电脑里是一个比较好的方法这样不但可以解决大批量数据的存储问题,同时也易于编辑、分析和打印。 但是,电脑的外设接口中是没有I2C接口的,因此需要对I2C部迟疑不决的数据进行转换,使之能发往电脑,实现数据的文件存储。综合各种因素考虑,采用UART串口的方式比较方便,因为串口技术简单、应用广泛、各种应用软件也较为丰富。 本文不仅介绍了如何实现I2C数据的转发和自动存储,同时也介绍了
[单片机]
用P89C664实现I2C总线大批量数据的自动<font color='red'>存储</font>
基于单元存储系统的自动化立体仓库整体设计
引言     自动化立体仓库是一种集信息、储存、管理于一体的高技术机电一体化产品,在多种行业领域得到了广泛应用,特别为 制造业 加快物流运转速度提高生产效率发挥了重要作用。自动化立体仓库是以单元 存储 系统为基本单元的向外扩展了解自动化化立体仓库首先要对基本构成单元进行深入了解。本文以单元 存储 系统的形式全面介绍了自动化仓库的存储与堆垛机系统、出入库输送机系统,计算机管理系统。 1 存储与堆垛机系统     (1)货架系统     采用冷轧成形的型材属于独立自支撑式的结构,货架满足堆垛机自动对钢货箱存储和取货的要求,堆垛机在货架间的巷道中移动,而产生的应力由货架结构支撑。受限于堆垛机的自动定位能力,货架自身是不可调节。    
[嵌入式]
基于高速A/D转换与快速存储操作总线接口的高速同步数据采集系统设计
随着大规模集成的电路的飞速发展,PC机性能不断提高。在PC机扩展槽中嵌入以高性能微处理器为核心的智能型功能卡,可以组成综合性能极佳的分布式控制系统。这种结构方式可充分利用微处理器的控制功能、PC机的快速数据处理能力,以及多任务工作方式等特点。对于这种分布式控制系统,主机要频敏接收到来自扩展卡从机所采集的数据、工作状态等信息;向从机发送控制命令或处理数据等。这种主、从机之间的通讯,根据应用条件的不同有多种方式。但在数据传输速度较高、数据量较大且需经常交换信息的场合,采用双口共享RAM缓冲区方式是最合适的。 为了用单片机实现对微秒级甚至纳秒级高速瞬变信号进行采样,研究了一种基于ISA总线、GPS同步时钟、用硬件电路实现高速数据采集
[单片机]
基于高速A/D转换与快速<font color='red'>存储</font>操作总线接口的高速同步数据采集系统设计
可扩展的嵌入式网络平台
作者:Navanee Sundaramoorthy 赛灵思产品营销经理 navanee@xilinx.com Sathya Thammanur 赛灵思软件总工程师 sathyanarayanan.thammanur@xilinx.com 大多数嵌入式产品都需要某种形式的网络或通信接口。以太网由于(Ethernet)成本低、几乎无处不在,且可以利用TCP/IP等因特网协议连接因特网,成为目前在嵌入式产品中应用最广泛的网络接口之一。 根据目标应用的不同,网络子系统的要求也变化相当大。简单的远程控制和监控应用只需要每秒数千比特的传输能力,而高端存储可视频应用则需要持续的每秒千兆比特的吞吐能力。 赛灵思嵌入式解决方案的一个主要优点
[应用]
浩亭联合Commeo开发能量存储系统接口
总部设在毗邻奥斯纳布吕克Wallenhorst的Commeo GmbH 开发出一种模块化储能系统,该系统可以让从移动机器人到工业设备和工厂实现安全、不间断的供电。Commeo开发的设备可作为应急电源或主电源的缓冲器使用,在需要时可以提供补偿供电。 Commeo和浩亭通过一项联合项目为该系统开发了相应的接口。该接口能够以相当高效的方式将电池与下游设备互连。该解决方案包括来自Han-Modular®系列的集成模块以及安装在设备内部的Han®对接框架。用于供应电力和数据的接口可以快速置入能量存储模块内。模块外壳凹入模块内部,而接合侧从模块后侧中心部位伸出。 用于供电和数据传输的Han-Modular® Commeo系统
[电源管理]
浩亭联合Commeo开发能量<font color='red'>存储</font>系统接口
玩转STM32(13)存储空间的开始地址
前面学习了怎么样选择不同的储存器来加载代码,也就是运行代码,决定了从哪里开始运行的问题。但是CPU选择了储存器之后,还要知道代码是从存储器哪一个位置开始读取代码?也就是从哪一个地址开始读取代码?现在就来解决这个问题。我们知道32位的CPU有4G的地址空间,因此从哪一个地址里读取代码,就有很多的选择了。至于放在什么地址,一般是由CPU的生产厂家来决定的。在这里可以查看到STM32F407的内部Flash储存器是放在0x8000000地址,更加详细的地址可以从STM32手册里查看到,如下图: 从上图可以看到代码就是写入到0x8000000,当CPU选择从内部存储器启动时,就会从这里加载代码。从这里也可以看到,如果是使用外部存储器,
[单片机]
玩转STM32(13)<font color='red'>存储</font>空间的开始<font color='red'>地址</font>
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved