(一)添加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)