把DSP TMS320F28XXX的程序段从flash复制到ram中运行 - 图文

2026/1/24 5:53:16

如第二节所述,连接命令文件(.cmd)是用来告诉连接器怎么分配编译器产生的段的。The C/C++ Header Files and Peripheral Examples提供了标准的连接命令文件(.cmd)。

相关代码文件中提供了三个链接器命令文件用于配置内存分配。

· F280xx_nonBIOS_flash.cmd · F281x_nonBIOS_flash.cmd · F2833x_nonBIOS_flash.cmd

每个文件一般都用相同的方法编写,只是在存储器方面有很小的一些差异(特殊设备)。连接命令文件(.cmd)的Memory部分是根据设备的内存空间来连接编译好的段的。详情参见具体控制器的数据手册。 下表展示TMS320F2808的存储器映射:

TMS320F28xxx系列控制器内置RAM,可以被分配为一个单独的段,或者更多的段,因为它是连续的存储器映射。如上图所示,F2808有映射到存储器空间的L0,L1和H0 SARAMs,允许生成一个大的内存块,这个块可以被CMD文件的MEMORY部分如下定义:

[plain] view plaincopyprint?

1. RAM_H0L0L1 : origin = 0x008000, length = 0x004000 /* on-chip RAM */

其余的也可以定义在MEMORY部分,完整的内存分配,请参见相关文件中的CMD文件。

链接器命令文件的第二部分是SECTIONS。这是实际编译器把段连接到的存储区。所有DSP28xxx_CodeStartBranch.asm 和 DSP28xxx_SectionCopy_nonBIOS.asm的段都被装载到flash中运行,这部分如下所示分配:

[plain] view plaincopyprint?

1. codestart : > BEGIN_FLASH, PAGE = 0 /* Used by file CodeStartBranch.asm */ 2. wddisable : > FLASH_AB, PAGE = 0 /* Used by file CodeStartBranch.asm */ 3. copysections : > FLASH_AB, PAGE = 0 /* Used by file SectionCopy.asm */

其他被初始化的段被下载到flash,但是在ram中运行。这是通过load和run指令来实现。下面展示一个例子:

[plain] view plaincopyprint?

1. .text : LOAD = FLASH_AB, PAGE = 0 /* Load section to Flash */ 2. RUN = RAM_H0L0L1,PAGE = 0 /* Run section from RAM */ 3. LOAD_START(_text_loadstart), 4. RUN_START(_text_runstart), 5. SIZE(_text_size)

为了获得与一个段相关联的特定地址,如上所示,使用了LOAD_START, RUN_START, 和SIZE指令。这些指令的地址和大小在DSP28xxx_SectionCopy_nonBIOS.asm文件使用到,用以在复制过程中指向正确的地址。DSP28xxx_SectionCopy_nonBIOS.asm把这些值创建为全局变量,如下图所示

[plain] view plaincopyprint?

1. .global _cinit_loadstart, _cinit_runstart, _cinit_size 2. .global _const_loadstart, _const_runstart, _const_size 3. .global _econst_loadstart, _econst_runstart, _econst_size 4. .global _pinit_loadstart, _pinit_runstart, _pinit_size 5. .global _switch_loadstart, _switch_runstart, _switch_size 6. .global _text_loadstart, _text_runstart, _text_size

测试例子:

提供的示例在TMS320F2812,TMS320F2808,TMS320F28335eZdsp开发板上进行了测试。板子上LED的闪烁可以从视觉上证实程序是否正确运行。下面的程序是基于F2808eZdsp评估板设计和测试的。同样的,这种方法可以用于其他eZdsp开发板。

Code Composer Studio环境:

1.使用USB线连接F2808eZdsp开发板到PC,接上电源线给板子供电。 2.打开Code Composer Studio,设置F2808 eZdsp 仿真器。 3.打开和编译Example_280xx_Flash_to_RAM_nonBIOS.pjt。 4.下载.out文件到芯片的flash中。 5.调试程序(debug)。 6.运行程序(run)。

在eZdsp电路板上的LED应闪烁,表示程序正在运行。

应用:

现有的Flash应用程序可以很容易地通过移植相关代码文件来实现此功能。基本的移植步骤如下: 1.用DSP28xxx_CodeStartBranch.asm替换CodeStartBranch.asm。 2.在工程中添加DSP28xxx_SectionCopy_nonBIOS.asm文件。 3.用特殊生成的CMD文件代替现有的CMD文件。

这个基本步骤不适用于一些特殊情况,比如用户自己定义的段,等

应用例子:

为了演示的应用程序集成的过程,在C280x,C2801x

C / C ++头文件和外设示例的Example_2808_Flash.pjt中使用下列步骤移植。 1.下载安装C280x, C2801x C/C++ Header Files and Peripheral Examples。 2.如上所述连接板,打开项目文件。

3.删除项目中的DSP280x_CodeStartBranch.asm文件,在项目中添加DSP28xxx_CodeStartBranch.asm文件。 4.在项目中添加DSP28xxx_SectionCopy_nonBIOS.asm文件。

5.删除项目中的cmd文件,在项目中添加F280xx_nonBIOS_flash.cmd文件。

6.把DSP280x_usDelay.asm中的.sect “ramfuncs”改为.text,使DSP28x_usDelay在被分配在.test段中。

7.删除DSP280x_SysCtrl.c文件中的#pragma CODE_SECTION(InitFlash, “ramfuncs”);。使得InitFlash( )函数被分配到.test而不是ramfuncs。

8.删除Example_280xFlash.c文件中的#pragma CODE_SECTION(epwm1_timer_isr, “ramfuncs”);和#pragma CODE_SECTION(epwm2_timer_isr, “ramfuncs”);。使得中断服务函数被分配到.test而不是ramfuncs。

9.删除Example_280xFlash.c文件中的MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);和 InitFlash( );。由于代码已经被复制到RAM,这些是不需要的了。 10.如上所述,编译连接程序,把程序下到芯片里运行。

在eZdsp电路板上的LED应闪烁,表示程序正在运行。

存储空间占用:

因为仅仅在DSP28xxx_SectionCopy_nonBIOS.asm文件中增加了copy_sections的代码。增加的占用的片内flash为0x3C。code_start 和wd_disable函数没有增加额外的代码,他们本来就在C/C++ Header Files and Peripheral Examples的所用项目中被使用。

测试:

因为这个功能开机后直接实现,闪存等待状态,锁相环(PLL)都没有配置,因此,它们都运行在默认值。Flash等待状态为15个周期,对于F280xx/F281x设备SYSCLKOUT为OSCCLK/2,对于F2833x设备SYSCLKOUT为OSCCLK/ 4。使用Code Composer Studio的分析功能可以测量运行时间。下表给出了每个F28xxx控制器从启动到main()函数的第一个指令所用的时间,如下所示,由于个平台的代码长度和系统时钟不一样,他们的运行时间也不一样。

限制:

此实现的限制因素为使用的TMS320F28xxx控制器内部RAM的大小。这限制了那些工程可以使用这种方法,如果工程太大,以至于没法放进RAM里,这种方法是不能用的。

建议:

有一些项目需要这种功能,但不是所有被初始化段都要复制到RAM或者没有足够的RAM放下所有的段。仅仅需要复制应用代码本身。这种情况下,仅仅需要复制.text段到RAM。这样子,可以把DSP28xxx_SectionCopy_nonBIOS.asm文件和cmd文件中复制其他段的代码删掉,把其他段放在flash中运行。减少flash的占用空间和缩短了运行到main()的时间。

应该确定应用程序可以处理复制代码执行时间的一点滞后。如果应用程序不能处理这段时间,可以使用Running an Application from Internal Flash Memory on the TMS320F28xx DSP (SPRA958)中的方法复制一部分主要的代码到ram。

如果使用DSP的引导,建议使用Running an Application from Internal Flash Memory on the TMS320F28xx DSP (SPRA958)中的方法复制一部分主要的代码到ram。一个使用DSP / BIOS的项目,通常是一个较大的项目,不建议使用此方案。

结语:

这份应用文档展示,在建立C语言环境之前,通过把flash的代码复制到ram,可以使TMS320F28xxx的控制器实现零等待状态运行。这方案给出了代码和存储空间的限制,为设计者提供了实现了这种功能的相关文件。


把DSP TMS320F28XXX的程序段从flash复制到ram中运行 - 图文.doc 将本文的Word文档下载到电脑
搜索更多关于: 把DSP TMS320F28XXX的程序段从flash复制到 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219