周文辉,李少华,李敬东
(中国人民解放军95899部队,北京100085)
TMS320C6000在军事通信、电子对抗、雷达系统、精确制导武器等需要高度智能化的领域应用非常广泛,而这些领域对设备的可靠性和稳定性要求非常高。在这些特殊应用领域,电磁干扰环境较为复杂,单粒子翻转效应无法避免,会引起一些关键参数发生变化,一个比特的错误可能会造成严重故障。为缓解单粒子翻转效应,经常采取程序代码在外部ROM中执行,RAM中关键变量采取软件三模冗余可靠性技术手段来保障。
另一方面,程序在外部ROM中执行的速度较慢,在片内RAM中执行的效率最高,片外RAM其次。为了使充分发挥DSP的效能,应尽量将程序代码放在片内RAM中运行。
本文以TMS320C6000系列的620X/670XDSP为例,采用一种分两次生成ROM文件的自举实现方法,使程序在片内程序RAM中执行的同时,预置关键参数和常量从ROM中读取,从而在发挥DSP最大效能的同时在一定程度上防止单粒子翻转效应。
TMS320C620X/670X有两种地址映射模式,即MAP0和MAP1,这两种映射模式用于确定存储器的地址访问空间和启动工作方式。
MAP0映射模式下,地址0映射在外部空间,DSP启动时从外部直接执行。MAP1映射模式下,地址0 映射在内部空间,DSP启动时需要从外部空间装载执行代码到内部地址0位置处后再运行。
本文采用MAP1映射模式。在MAP1映射模式下,片外ROM映射空间起始地址为0x01400000。
TMS320C620X/670X的启动模式根据BOOTMODE[4:0]引脚确定,通过仔细分析,可以总结为以下3种启动方式。
① 无引导(No Boot),DSP上电复位后直接从存储器地址0处开始执行;
②ROM 引导(ROM Boot),在DSP上电复位时由DMA/EDMA控制器从外部空间CE1处起始位置装载64 KB代码到DSP内部RAM地址0处,从地址0处执行;
③ 主机引导(Host Boot),DSP上电后,保持复位状态,外部主机将应用程序写到DSP内部,并修改相应的寄存器内容,使DSP从地址0处执行。
第1种方式运行在MAP0映射模式下,要求用于启动的外部存储器必须是32位宽ROM。由于一般ROM均是8位宽,这样至少需要4片才能组成一个32位宽启动功能部件,造成外部扩展规模较大。另外,ROM的读取速度远远低于内部程序区的读取速度,会造成系统处理能力大大降低。
第2种方式运行在MAP1映射模式下,DSP启动时自动装载64KB代码到内部地址0后自动执行。这在程序代码量小于64KB条件下有很多优势,如外部扩展存储器规模小,代码运行速度快等。但在复杂电磁干扰环境下,该方式需要对所有的关键参数和常量考虑三模冗余,增大了程序设计复杂度。
第3种方式一般用于存在主机的设备。
在实际DSP系统中最常用的是第2种方式,一般仅需要一片非易失性存储器就可方便实现程序配置。
由于篇幅所限,段(section)定义中仅列出必须的段,对可选的段定义可以根据实际工程环境需要添加。
.text:存放C程序的代码。
.cinit:存放C程序中的变量初值和常量。
.const:存放C程序中的字符常量、浮点常量和用const声明的常量。
.bss:为C程序中的全局和静态变量保留存储空间。
.stack:为C程序系统堆栈保留存储空间,用于保存返回地址、函数间的参数传递、存储局部变量和保存中间结果。
为了在发挥DSP最大效能的同时有效防止单粒子翻转效应,在分析前两种引导方式的基础上,笔者设计了一种程序在片内程序RAM中执行,初始化参数和常量在ROM中读取的自举方法。
为了实现该设计目的,需要分别生成用于烧写ROM的程序文件和初始常量文件。在初始常量文件生成时,为了能够直接写ROM文件,假设起始地址为0x0000c000,而程序实际执行时从起始地址0x0140c000读取。
在以下实例描述中约定项目工程名为project,对应的链接命令文件名为project.cmd,目标代码文件名为project.out,用于烧写ROM的二进制程序文件名和初始常量文件名分别为prog.bin和data.bin。其中程序文件所占空间不超过48KB,初始常量文件所占空间不超过16KB。
(1)程序文件生成过程
首先需要借助CCS集成开发环境,生成目标代码文件project.out。project.out对应的project.cmd文件内容如下:
然后通过执行CCS自带的工具hex6x.exe对目标代码文件进行格式转换,生成程序文件prog.bin。执行命令为“hex6x.exe hex.cmd”,其中hex.cmd格式内容如下:
(2)初始常量文件生成过程
过程参照上述程序文件的生成,其中project.cmd文件内容如下:
初始常量文件data.bin生成过程参照程序文件,其中hex.cmd格式内容如下:
(3)烧写程序
程序文件prog.bin和初始常量文件data.bin生成完毕后,通过编程器或编写ROM在线编程程序,将两个文件写入ROM。其中程序文件prog.bin在ROM偏移地址0x0处,初始常量文件data.bin在ROM偏移地址0x0000c000处。
①在本实例中,程序代码、程序初始化参数和常量编译后总空间不能超过64KB,程序代码、程序初始化参数和常量所占空间比例可以通过更改链接命令文件动态调节。对于超过64KB的情形,也可以借鉴此思路,通过编写二次引导装载程序,达到此目的。
②在调试过程中,需要经常通过Load下载方式将project.out文件下载到片内RAM中执行。Load执行时需对链接命令文件重新定义,将.cinit和.const段映射到IDRAM。
③采用该方法,可以不用考虑预置初始参数和常量的软件三模冗余,可以在很大程度上简化程序设计,缩短项目开发周期。
④对于必须要在内存中保存的关键参数和变量,可以采用软件三模冗余的方法实现。
⑤笔者经过反复尝试发现,尽管通过该自举方法,程序在执行过程中从片外ROM区读取初始参数和常量,但自举过程中初始化.cinit段的初始化变量由Flash拷贝到数据RAM区的过程不可或缺。
本文分析了TMS320C620X/670X芯片的存储结构和特点,通过分两次生成ROM烧写文件,给出了一种切实可行的自举方法,该方法可以在发挥DSP最大效能的同时,有效防止单粒子翻转效应。有关的TMS320C620X/670X自举实例已完成设计开发并得到实际应用,实践证明,该方法是行之有效的。
[1]薛雷,张金艺.DSPs原理及应用教程[M].北京:清华大学出版社,2009.
[2]左颢睿.6000系列DSP Flash二次加载技术研究[J].单片机与嵌入式系统应用,2011(11).
[3]刘小汇,武微.软件错误检测与纠正技术可靠性研究[J].信号处理,2011(8).
[4]张路,贺兴华.空间DSP加载系统可靠性设计[J].计算机工程,2010(3).