基于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();