對於獨立的嵌入式系統,需要把程序存入non-volitale存儲單元中,常用的也就是flash。但是程序在flash中運行相對在ram中行,速度會變慢很多,具體有多慢,拿28335來說吧,假設系統時鐘爲150MHz,在ram中運行時頻率還是150Mhz,而放在flash中,頻率會降到90-95Mhz,參照Ti手冊SPRA958L,這對於有些對實時性要求較高的函數功能,是不可接受的。所以在系統上電時,把對實時性要求高的函數轉移到ram中去。
下面以initflash函數爲例具體步驟如下:
(1)、將函數定位到section:
#pragma CODE_SECTION(InitFlash, "secureRamFuncs")
當遇到InitFlash(),就到段secureRamFuncs去運行。
當有多個函數需要轉移時,重複使用#pragma CODE_SECTION(“函數名", "secureRamFuncs")即可。
即使有多個#pragma CODE_SECTION,後面的步驟只需要一次。
(2)、section分配到memory(紅色爲memory)。
意思是到FLASH去下載InitFlash(),下載到SECURE_RAM,然後要到SECURE_RAM去運行程序,這個過程給出了下載地址和目標地址。注意此時SECURE_RAM中還沒有代碼。
SECTIONS
{
/*** User Defined Sections ***/
secureRamFuncs: LOAD = FLASH,PAGE = 0
RUN =SECURE_RAM, PAGE = 0
//定義FLASH和SECURE_RAM的首地址secureRamFuncs_loadstart和secureRamFuncs_loadstart以代替絕對地址
LOAD_START(_secureRamFuncs_loadstart),
LOAD_SIZE(_secureRamFuncs_loadsize),
RUN_START(_secureRamFuncs_runstart),
}
(3)、用memcpy()將經過#pragmaCODE_SECTION設定的函數從FLASH弄到SECURE_RAM中去。注意不是將FLASH的東西全部弄到SECURE_RAM中。
#include <string.h>
//實際應用中這一部分聲明可有可無
extern unsigned intsecureRamFuncs_loadstart;
extern unsigned intsecureRamFuncs_loadsize;
extern unsigned intsecureRamFuncs_runstart;
void main(void)
{
/* Copy the secureRamFuncs section */
memcpy(&secureRamFuncs_runstart,&secureRamFuncs_loadstart,(Uint32)&secureRamFuncs_loadsize);
/* Initialize the on-chip flash registers*/
InitFlash();
}