基于TMS320F28335的程序从FLASH到RAM的移植与运行
2011-01-24杨宣兵
杨宣兵 , 陈 明, 彭 义
(1. 湖南理工学院 信息与通信工程学院, 湖南 岳阳 414006; 2. 岳阳千盟电子公司, 湖南 岳阳 414000)
引言
TI 公司的TMS320F28335 DSP具有32位TMS320C28X CPU和FPU处理器, 片上FLASH、SARAM以及外设相比 TMS320F2812有了进一步的扩展和增强, 它是目前控制领域中的先进处理器, 在电机控制、变频器、不间断电源以及电力线通信等系统中应用越来越广泛. 一般而言, DSP系统工作过程为: 通过AD采样外部信号, DSP对AD采样数据完成实时信号处理, 一般包括数字滤波、FFT运算等, 同时根据运算的结果产生控制信号. 在系统设计完成后, 程序需要固化在片上 FLASH, 一般而言, CPU对FLASH的访问至少需要5个以上的等待周期, 这在实际的实时处理系统中是绝对不允许的, 因此需要系统在上电时通过TI 的Bootloader将固化在片上FLASH上的程序加载到RAM中并在RAM中运行, 实现零等待, 使代码运行最有效率. 本文分析代码运行过程, 实现将片上FLASH中应用程序加载到片上RAM中运行方法.
1 系统运行流程分析
在进行软件设计之前, 首先要了解TMS320F28335 DSP运行过程. 当系统上电复位后, 程序到复位向量0x3FFFC0位置开始程序执行, 在复位向量处根据向量内容跳转到片上ROM里面的Boot ROM位置执行初始化引导函数InitBoot, InitBoot完成对芯片的初始化, 并调用模式选择函数SelectBootMode来确定引导模式, 选择Jump to FLASH模式. 程序退出BOOT转向FLASH中0x33FFF6处执行程序, 用户需要在0x33FFF6开始程序的设计. 系统从复位开始到转向FLASH过程如图1所示.
图1 系统从上电到FLASH入口流程
在开发基于TMS320F28335 DSP应用系统时, 在开发调试阶段用户程序加载和执行都在RAM中, 用户代码执行流程如图2所示.
图2 程序调试阶段运行流程
在应用程序调试成功后, 将程序固化在FLASH, 在上电时将FLASH中程序加载RAM, 并在RAM中运行. 用户代码执行流程如图3所示.
图3 程序加载运行流程
2 代码搬移实现方法
2.1 代码搬移分析
在DSP2833x_CodeStartBranch.asm模块中包含了code_start和wd_disable流程. 上电后code_start流程应加载到存储空间的0x33FFF6 FLASH处, 在此处安排跳转指令到wd_disable流程, 完成watchdog的禁止, 然后调用copy_sections函数完成用户应用程序代码从FLASH到RAM的移植过程. 因此code_start,wd_disable和copy_sections要求在加载和运行于FLASH中. 需要将DSP2833x_CodeStartBranch.asm模板代码作相应调整, 主要表现为以下几点:
① 将code_start流程中LB _c_int00修改为LB copy_sections;
② 将wd_disable流程中 .text 修改为.sect “wddisable”, 主要原因是.text段会移植到RAM中运行, 而wd_disable流程必须代码搬移之前执行, 因此必须在FLASH中执行, 将自定义已初始化段wddisable加载和运行定位于FLASH中;
③ 将wd_disable流程中LB _c_int00修改为LB copy_sections;
④ 需要将sectionCopy.asm模块添加到工程中来, 至此完成代码搬移代码的准备工作;
⑤ 因为系统调试完毕, 所以可执行代码都应该加载在 FLASH, 此时需要将 DSP2833x_usDelay.asm模块中_DSP28x_usDelay子程序加载和运行在“ramfuncs”段修改为加载在FLASH中, 而运行在RAM中,即将 .sect “ramfuncs” 修改为 .text 就行;
⑥ 因为FLASH的配置函数InitFlash( )必须加载和固化在FLASH, 而运行必须在RAM中, 因此可以将模块DSP2833x_SysCtrl.c的pragma CODE_SECTION(InitFlash, “ramfuncs”)去掉, 即直接把此函数定位在.text段, 而在系统上电时把.text段搬移到片内RAM中执行.
2.2 CMD文件修改
CMD文件完成存储空间的配置并告诉链接器将输出段链接到物理存储器的位置, 指定各输出段的加载和运行地址. 下面是 MEMORY部分几个重要的区域, 主要完成程序的固化, 加载和运行. 下面给出链接器命令文件(.cmd文件)的存储器配置命令MEMORY和输出段加载和运行定位命令SECTIONS的部分内容如下:
因为在用户代码从 FLASH搬移到片内 RAM 之前, 程序的运行必须在非易失性存储器(即TMS320F28335 DSP的FLASH ), 因此codestart、wddisable以及copysections必须加载和运行于FLASH中, 其他的已初始化段加载在FLASH中而运行在片上RAM中, 因此对这些段的加载和运行必须指定不同的存储空间, 如上面给出的F28335_nonBIOS_flash.cmd文件中.text段所示.
2.3 软件测试
我们在开发基于DSP的无线感应通信器项目中, 首先完成软件在RAM中仿真调试, 然后将2DPSK调制的DSP应用程序烧写到FLASH, 断开仿真器与DSP硬件系统的连接, 将DSP系统上电, 系统自动完成应用程序上电启动和向RAM的搬移并在片内RAM中运行, 通过示波器观察调制信号输出与调试阶段一致, 达到相应要求.
3 结束语
本文给出了TMS320F28335 DSP应用程序在片内RAM高速运行的移植方法, 并在项目开发中验证了方法的可行性, 在实际项目开发的后期阶段具有重要的实际意义. 另外, 也要注意, 如果应用程序较大,片内RAM空间除去作为数据存储空间外, 不足以把所有的应用程序从FLASH移植到片内的RAM, 就可以考虑将适时性要求较高的代码进行移植运行, 或者外部扩展高速的片外RAM.
[1]宁改娣. DSP控制器原理及应用[M]. 第2版. 北京: 科学出版社, 2009
[2]TI. TMS320x2833x, 2823x BOOT ROM Reference Guide(Literature Number: SPRU963A),2007-Revised 2008
[3]TI. Copying Compiler Sections From Flash to RAM on the TMS320F28xxx DSCs(Literature Number: SPRAAU8), 2008
[4]孙中禹. 数字信号处理器TMS320F2812的片内FLASH应用程序设计[J]. 电子元器件应用, 2009(12): 28~30