DSP

DSP程序Flash程序下载到RAM中运行

2019-07-13 09:54发布

 基于DSP的嵌入式系统开发中,存储资源特别是片内高速存储资源有限,在算法系统集成时Memory的管理对于提高整个系统的优化是非常重要的。 程序区:最大原则是将经常调度使用的算法模块放片内,TI的CCS中提供了#pragma CODE_SECTION,可以把需要单独控制存放的函数段从.text段中独立出来,从而在.cmd文件中对这些函数段进行单独物理地址映射。 程序烧到flash中后可以运行但是速度慢,如何将程序从flash中下载到RAM中运行?   1.先在cmd文件中进行配置 secureRamFuncs : LOAD = FLASH_E, PAGE = 0 /* Used by InitFlash() in SysCtrl.c */ RUN = PRAMH0, PAGE = 0 LOAD_START(_secureRamFuncs_loadstart), LOAD_END(_secureRamFuncs_loadend), RUN_START(_secureRamFuncs_runstart)   2.实现函数处,可以找demo参考 /********************************************************************** * Function: InitFlash() * Description: Initializes the F281x flash timing registers. * Notes: * 1) This function MUST be executed out of RAM. Executing it out of * OTP/FLASH will produce unpredictable results. * 2) The flash registers are code security module protected. Therefore, * you must either run this function from L0/L1 RAM, or you must * first unlock the CSM. Note that unlocking the CSM as part of * the program flow can compromise the code security. * 3) Final flash characterization needs to be performed by TI. The * below settings may not meet final specifications, and are for * example purposes only. Check the latest device datasheet for * TMS qualified specifications. **********************************************************************/ #pragma CODE_SECTION(InitFlash, "secureRamFuncs") void InitFlash(void) { asm(" EALLOW"); // Enable EALLOW protected register access FlashRegs.FPWR.bit.PWR = 3; // Pump and bank set to active mode FlashRegs.FSTATUS.bit.V3STAT = 1; // Clear the 3VSTAT bit FlashRegs.FSTDBYWAIT.bit.STDBYWAIT = 0x01FF; // Sleep to standby transition cycles FlashRegs.FACTIVEWAIT.bit.ACTIVEWAIT = 0x01FF; // Standby to active transition cycles FlashRegs.FBANKWAIT.bit.RANDWAIT = 5; // Random access waitstates FlashRegs.FBANKWAIT.bit.PAGEWAIT = 5; // Paged access waitstates FlashRegs.FOTPWAIT.bit.OPTWAIT = 5; // Random access waitstates FlashRegs.FOPT.bit.ENPIPE = 1; // Enable the flash pipeline asm(" EDIS"); // Disable EALLOW protected register access   /*** Force a complete pipeline flush to ensure that the write to the last register configured occurs before returning. Safest thing is to wait 8 full cycles. ***/   asm(" RPT #7 || NOP"); }   3.主程序开始调用函数之前,就可以了 memcpy( &secureRamFuncs_runstart, &secureRamFuncs_loadstart, &secureRamFuncs_loadend - &secureRamFuncs_loadstart); InitFlash();