將DSP的flash裡面的函式轉移到ram中的步驟

藍色的雲tkn發表於2017-01-20

對於獨立的嵌入式系統,需要把程式存入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();
}



相關文章