将程序从Flash搬运到RAM中运行总结(转载)

xiaoxiao2021-02-28  86

转自: http://www.cnblogs.com/kwang-cai/articles/5620411.html

在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) 定义全局变量,方便主程序中调用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, " ramfuncs"); #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); 在主程序中调用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中。使用两个函数都可以,但是需要注意的是变量要对应。 参考资料 http://www.hellodsp.com/bbs/forum.php?mod=viewthread&tid=1489&highlight=flash+ram

转载请注明原文地址: https://www.6miu.com/read-32896.html

最新回复(0)