[资料分享] TMS320F28335将程序从FLASH搬移到RAM中运行详细步骤

Aguilera   2017-12-16 21:42 楼主
(一)添加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)

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复