1. 程式人生 > >將程式從Flash搬運到RAM中執行總結(轉載)

將程式從Flash搬運到RAM中執行總結(轉載)

  1. 在CMD檔案中配置相應的段,如
ramfuncs            : LOAD = FLASHJ,  PAGE = 0                     RUN = RAMH0,  PAGE = 0                     LOAD_START(_RamfuncsLoadStart),                     LOAD_END(_RamfuncsLoadEnd),                     RUN_START(_RamfuncsRunStart) secureRamFuncs    :   LOAD = FLASHP,   PAGE = 0          /* Used by InitFlash() in SysCtrl.c */                          RUN =  RAMH0 ,   PAGE = 0                          LOAD_START(_secureRamFuncs_loadstart),                          LOAD_END(_secureRamFuncs_loadend),                          RUN_START(_secureRamFuncs_runstart)
  1. 定義全域性變數,方便主程式中呼叫MemCopy函式;
extern Uint16 RamfuncsLoadStart; extern Uint16 RamfuncsLoadEnd; extern Uint16 RamfuncsRunStart;
extern Uint16 secureRamFuncs_runstart; extern Uint16 secureRamFuncs_loadstart; extern Uint16 secureRamFuncs_loadend; 在使用者程式中,使用pragma將函式對映到上一步中定義的段中; #pragma CODE_SECTION(eva_timer1_isr, "ramfuncs"); #pragma CODE_SECTION(eva_timer2_isr, "ram
funcs"); #pragma CODE_SECTION(evb_timer3_isr, "ramfuncs"); 把要初始化的flash控制暫存器函式定義到段secureRamFuncs #pragma CODE_SECTION(InitFlash, "secureRamFuncs");                   //該部分在DSP2833x_SysCtrl.c檔案中,TI官方的定義為#pragma CODE_SECTION(InitFlash, "ramfuncs")。因此如果執行InitFlash而不呼叫MemCopy時,應該將該句註釋掉;呼叫MemCopy時,該句註釋掉表示InitFlash在Flash中執行,不註釋掉表示程式在RAM中執行。 void InitFlash(void);
// 宣告中斷函式
interrupt void eva_timer1_isr(void);
interrupt void eva_timer2_isr(void);
interrupt void evb_timer3_isr(void);
  1. 在主程式中呼叫MemCopy(memcpy)函式和InitFlash函式(前者用於拷貝程式碼,後者用於優化flash執行),注意這兩個函式在InitSysCtrl後呼叫比較合理
InitSysCtrl(); memcpy(&secureRamFuncs_runstart,&secureRamFuncs_loadstart, &secureRamFuncs_loadend - &secureRamFuncs_loadstart);            //先拷貝InitFlash函式 InitFlash();                                         //呼叫InitFlash函式,優化flash執行 memcpy(&RamfuncsRunStart,&RamfuncsLoadStart,&RamfuncsLoadEnd- RamfuncsLoadStart); 注意:memcpy(&RamfuncsRunStart,&RamfuncsLoadStart,&RamfuncsLoadEnd- RamfuncsLoadStart)位於RTS library中;使用MemCopy函式時,函式的原型為void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr);該函式位於DSP2833x_MemCopy.c中。使用兩個函式都可以,但是需要注意的是變數要對應。