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)
|