TMS320F28335将程序从FLASH搬移到RAM中运行详细步骤

(一)添加DSP28xxx_SectionCopy_nonBIOS.asm到工程目录下

DSP28xxx_SectionCopy_nonBIOS.asm中为程序拷贝函数。定义了段名为copysections,之后将会在CMD文件添加该段。

(二)修改启动文件DSP2833x_CodeStartBranch.asm

程序运行后从FLASH启动,会调用code_start关闭看门狗后通过调用c_int00,通过c_int00调用main()函数,所以程序从FLASH拷贝到RAM需要在c_int00之前完成。所以将做以下修改:

WD_DISABLE .set 1 ;set to 1 to disable WD, else set to 0

.ref _c_int00(这里不需要使用_c_int00二是需要调用copy_sections函数,故改为.ref copy_sections)

    .global code_start

    .sect "codestart"

code_start:

    .if WD_DISABLE == 1

        LB wd_disable       

    .else

        LB _c_int00(这里应该跳转到copy_sections,故应改为LB copy_sections)

.endif

    .if WD_DISABLE == 1

    .text(.text段将会加载到RAM中运行,这里看门狗程序是需要在拷贝前,也就是FLASH中运行,所以从新定义一个wddisable段,之后将会添加到.CMD文件,所以修改为.sect "wddisable")

wd_disable:

    SETC OBJMODE        ;Set OBJMODE for 28x object code

    EALLOW              ;Enable EALLOW protected register access

    MOVZ DP, #7029h>>6  ;Set data page for WDCR register

    MOV @7029h, #0068h  ;Set WDDIS bit in WDCR to disable WD

    EDIS                ;Disable EALLOW protected register access

    LB _c_int00 (这里关闭看门狗后需要调用拷贝函数在跳转到_C_INT00所以改为LB copy_sections)       

    .endif

.end

(三)修改DSP2833x_SysCtrl.c文件

注释掉一下程序

//#pragma CODE_SECTION(InitFlash, "ramfuncs");

程序定义了ramfuncs段,当在FLASH中运行时,由于速度问题,部分函数必须在RAM中运行,这段程序的作用就是声明IinitFlash 函数属于ramfunc段,需在RAM中运行,我们把所有程序加载到RAM中运行,故不再需要,注释掉后默认在.text段

(四)修改DSP2833x_usDelay.asm文件

.def _DSP28x_usDelay

.sect "ramfuncs"

改为

.def _DSP28x_usDelay

.text

原理同上

(五)CMD文件修改

主要是SECTIONS修改,MEMORY不用动

1:删除以下代码

ramfuncs            : LOAD = FLASHD, 

                         RUN = RAML0, 

                         LOAD_START(_RamfuncsLoadStart),

                         LOAD_END(_RamfuncsLoadEnd),

                         RUN_START(_RamfuncsRunStart),

                         PAGE = 0

Ramfuncs段是之前在FLASH中运行时需要把部分程序搬移到RAM中定义的段,  _DSP28x_usDelay函数就定义在该段,现在要把所有程序都搬到RAM中,故不再需要。

2:添加以下代码(通常添加在codestart  : > BEGIN,  PAGE = 0)之后

wddisable    : > FLASHA,    PAGE = 0

copysections        : > FLASHA,    PAGE = 0

Wddisable与copysections是新添加的段,Wddisable是之前将DSP2833x_CodeStartBranch.asm中关闭看门狗的代码放在了Wddisable段,该段需在FLASH中运行。Copysections是拷贝函数所在的断,需在Flash中完成拷贝。

3:修改.stack 栈 .ebss全局数据、静态数据 .esysmem堆,可以修改他们的存储大小与位置,但必须在低64K地址中即(M0,M1,L4-L7)(L1 -L3受保护的,放代码段的)。例如:

.stack              : > RAMM1       PAGE = 1

.ebss               : > RAML4       PAGE = 1

.esysmem            : > RAML4       PAGE = 1

4:修改代码存储位置与运行位置

将.cinit              : > FLASHA      PAGE = 0改为

.cinit : LOAD = FLASHA, PAGE = 0       

                 RUN = RAML0,       PAGE = 0   

                 LOAD_START(_cinit_loadstart),

                 RUN_START(_cinit_runstart),

                  SIZE(_cinit_size)

将程序中变量初值和常量加载到FLASH运行在RAM中

将.econst             : > FLASHA      PAGE = 0改为

.econst :   LOAD = FLASHA,   PAGE = 0       

                 RUN = RAML0,       PAGE = 0        

                 LOAD_START(_econst_loadstart),

                RUN_START(_econst_runstart),

                 SIZE(_econst_size)

将.pinit              : > FLASHA,     PAGE = 0 改为

.pinit :   LOAD = FLASHA,   PAGE = 0         

                 RUN = RAML0, PAGE = 0        

                 LOAD_START(_pinit_loadstart),

                 RUN_START(_pinit_runstart),

                 SIZE(_pinit_size)

将.switch             : > FLASHA      PAGE = 0  修改为

.switch :   LOAD = FLASHA,   PAGE = 0        

                 RUN = RAML0,       PAGE = 0       

                 LOAD_START(_switch_loadstart),

                 RUN_START(_switch_runstart),

                 SIZE(_switch_size)   

增加.const段的定义,或者将拷贝函数中.const的拷贝注释掉

.const :   LOAD = FLASHA,   PAGE = 0        

                 RUN = RAML0, PAGE = 0        

                 LOAD_START(_const_loadstart),

                 RUN_START(_const_runstart),

                 SIZE(_const_size) 

接下来修改.text段

为了保证足够代码空间,修改MEMORY PAGE 0中

 RAML1       : origin = 0x009000, length = 0x001000        

 RAML2       : origin = 0x00A000, length = 0x001000     

 RAML3       : origin = 0x00B000, length = 0x001000  

改为

  RAM_L1L2L3       : origin = 0x009000, length = 0x003000  

然后将SECTIONS中

.text               : > FLASHA      PAGE = 0改为

.text :   LOAD = FLASHA,  PAGE = 0        

                 RUN = RAM_L1L2L3, PAGE = 0        

                 LOAD_START(_text_loadstart),

                 RUN_START(_text_runstart),

                 SIZE(_text_size)
--------------------- 
作者:starhexing 
来源:CSDN 
原文:https://blog.csdn.net/starhexing/article/details/40661811 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/u014183377/article/details/98442757