寧波IT培訓
美國上市IT培訓機構

0574-87236644

熱門課程

如何將Flash中的程序轉移到RAM中運行?

  • 時間:2020-07-09 11: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();

}

二.將MCU的內嵌Flash里的部分代碼運行在 RAM 中

MCU 異于資源豐富的linux 平臺。MCU(如:基于Cortex V6M 的Cortex M0+ 等) Code通常運行在內嵌Flash中。在某些特定應用場合,需要將部分函數運行于RAM 中。為解決次問題,筆者實現了一種解法,具體做法如下:

1. 實現要運行在RAM的 routine, 本routine 使用純匯編實現, 如:

__asm void program_word2addr(uint32_t addr, uint32_t data)

{

push {r3, r4, r5, lr} ;save some regsiters

/*your code for this routine*/

pop {r3, r4, r5, pc}

}

2.編譯時,采用code 與運行位置無關的編譯選項 如 (Keil --apcs /ropi/rwpi), 生成 *.axf;

3.通過fromelf -c 將生成 *.axf 反匯編,找到對應program_word2addr 實現部分, 并將routine 對應的binary code Copy 到所要應用的 Code 中,以只讀數組的形式出現:

如:

const staic uint16_t s_flashProg2AddressCode[16] = {...., ....}

4.定義 一個全局數組, 如 static uint16_t g_code[16], size正好等于 s_flashProg2AddressCode的長度;

5. 定義一個函數指針, 如 static void (*callFlashPrg2Address)(uint32_t addr, uint32_t data)

6.定義一個函數實現將Code 運行與 RAM如:

void run_prgcode_onram(uint32_t addr, uint32_t data)

{

memcpy(g_code,s_flashProg2AddressCode,32 );

callFlashPrg2Address = (void (*)(uint32_t addr, uint32_t data))((uin32_t)g_code + 1);

callFlashPrg2Address (address, data);

}

run_prgcode_onram, 便可以將program_word2addr 運行于RAM中。

callFlashPrg2Address = (void (*)(uint32_t addr, uint32_t data))((uin32_t)g_code + 1); +1 的目的,時由于運行平臺為 Cortex V6M , 采用的thumb指令集,根據ARM Spec 要求完成。

callFlashPrg2Address (address, data); 則是實現RAM運行program_word2addr 的關鍵所在。

說了這么多,您應該對嵌入式有了一個更全面的理解了吧!最后,達內嵌入式培訓機構提醒每一個it愛好者:如果你想要在短時間內快速入門,順利掌握一門技術,建議還是認真學習視頻。多練習,多動手。

預約申請免費試聽課

怕錢不夠?就業掙錢后再付學費!    怕學不會?從入學起,達內定制課程!     擔心就業?達內多家實踐企業供你挑選!

上一篇:Java學習注意事項
下一篇:這么說嵌入式系統,你還不理解嗎?

聊一聊怎么提升自己嵌入式開發的能力?

這么說嵌入式系統,你還不理解嗎?

如何將Flash中的程序轉移到RAM中運行?

Java學習注意事項

選擇城市和中心
江西省

貴州省

廣西省

海南省

红番茄视频成年