DSP

所有程序从FLASH搬移到RAM中运行

2019-07-13 18:55发布

(一)添加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地址中即(M0M1L4-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)