0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何將Flash中的程序轉(zhuǎn)移到RAM中運行

GReq_mcu168 ? 來源:陳翠 ? 2019-02-22 11:21 ? 次閱讀

對于獨立的嵌入式系統(tǒng),需要把程序存入non-volitale存儲單元中,常用的也就是flash。但是程序在flash中運行相對在RAM中行,速度會變慢很多,具體有多慢,拿28335來說吧,假設(shè)系統(tǒng)時鐘為150MHz,在RAM中運行時頻率還是150MHz,而放在flash中,頻率會降到90-95MHz,參照Ti手冊SPRA958L,這對于有些對實時性要求較高的函數(shù)功能,是不可接受的。所以在系統(tǒng)上電時,把對實時性要求高的函數(shù)轉(zhuǎn)移到RAM中去。

下面以initflash函數(shù)為例,具體步驟如下:

(1)、將函數(shù)定位到section:

#pragma CODE_SECTION(InitFlash, "secureRamFuncs")

當遇到InitFlash(),就到段secureRamFuncs去運行。

當有多個函數(shù)需要轉(zhuǎn)移時,重復(fù)使用#pragma CODE_SECTION(“函數(shù)名", "secureRamFuncs")即可。

即使有多個#pragma CODE_SECTION,后面的步驟只需要一次。

(2)、section分配到memory(紅色為memory)。

意思是到FLASH去下載InitFlash(),下載到SECURE_RAM,然后要到SECURE_RAM去運行程序,這個過程給出了下載地址和目標地址。注意此時SECURE_RAM中還沒有代碼。

1.SECTIONS

2.{

3./*** User Defined Sections ***/

4.secureRamFuncs: LOAD = FLASH,PAGE = 0

5.RUN =SECURE_RAM, PAGE = 0

6.//定義FLASH和SECURE_RAM的首地址secureRamFuncs_loadstart和secureRamFuncs_loadstart以代替絕對地址

7.LOAD_START(_secureRamFuncs_loadstart),

8.LOAD_SIZE(_secureRamFuncs_loadsize),

9.RUN_START(_secureRamFuncs_runstart),

10.}

(3)、用memcpy()將經(jīng)過#pragmaCODE_SECTION設(shè)定的函數(shù)從FLASH弄到SECURE_RAM中去。注意不是將FLASH的東西全部弄到SECURE_RAM中。

1.#include

2.//實際應(yīng)用中這一部分聲明可有可無

3.extern unsigned intsecureRamFuncs_loadstart;

4.extern unsigned intsecureRamFuncs_loadsize;

5.extern unsigned intsecureRamFuncs_runstart;

6.void main(void)

7.{

8./* Copy the secureRamFuncs section */

9.memcpy(&secureRamFuncs_runstart,&secureRamFuncs_loadstart,(Uint32)&secureRamFuncs_loadsize);

10./* Initialize the on-chip flash registers*/

11.InitFlash();

12.}

二.將MCU的內(nèi)嵌Flash里的部分代碼運行在 RAM 中

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

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

__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 與運行位置無關(guān)的編譯選項 如 (Keil --apcs /ropi/rwpi), 生成 *.axf;

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

如:

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

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

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

6.定義一個函數(shù)實現(xiàn)將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指令集,根據(jù)ARM Spec 要求完成。

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • DRAM
    +關(guān)注

    關(guān)注

    40

    文章

    2298

    瀏覽量

    183204
  • FlaSh
    +關(guān)注

    關(guān)注

    10

    文章

    1614

    瀏覽量

    147652

原文標題:嵌入式開發(fā)中,如何將Flash中的程序轉(zhuǎn)移到RAM中運行?

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    如何用加載分散法軟件中部分變量從內(nèi)部RAM轉(zhuǎn)移到外部RAM?

    如何用加載分散法軟件中部分變量從內(nèi)部RAM轉(zhuǎn)移到外部RAM, 加載分散法文件怎么設(shè)置?堆和棧需要設(shè)置嗎?
    發(fā)表于 05-10 07:52

    CSP LED切割前如何轉(zhuǎn)移到UV膜上

    倒裝芯片底部與高溫膠膜接觸,封裝后如何將芯片底部與高溫膜分離,然后轉(zhuǎn)移到UV膜上?
    發(fā)表于 10-29 23:23

    tms320C6416 bios引導(dǎo)程序二次啟動,請問如何將程序FLASH移到RAM運行?

    [size=150%]如何將程序FLASH移到RAM
    發(fā)表于 07-31 06:38

    請問F28M35x如何將flash中部分程序加載到ram運行

    求教一個問題:如何將flash的部分程序加載到ram運行
    發(fā)表于 08-20 06:16

    如何把RAM區(qū)域轉(zhuǎn)移到另一個RAM區(qū)域

    你好。我現(xiàn)在正在進行一個項目,其中在一些情況下,我需要把數(shù)據(jù)塊從一個RAM區(qū)域轉(zhuǎn)移到另一個RAM區(qū)域。為了加快進程,我嘗試使用DMA傳輸,因為代碼需要盡可能快地運行。我的問題是,當訪問
    發(fā)表于 04-29 13:19

    如何將舊的ISE設(shè)計轉(zhuǎn)移到Vivado 2014.1

    你好我有一個新的vc707板。我可以舊的ISE設(shè)計轉(zhuǎn)移到Vivado 2014.1。使用Vivado,我可以通過USB電纜將我的比特流下載到電路板上,沒有任何問題。但是當我嘗試使用Vivado將我
    發(fā)表于 05-29 10:43

    ch579例程里使用的是Keil編譯,轉(zhuǎn)移到MounRiver是有什么要配置的嗎?

    579例程里使用的是Keil編譯的,我工程轉(zhuǎn)移到MounRiver來編譯,編譯成功了,下載程序跑起來會,串口會有幾率亂碼,在轉(zhuǎn)移到MounRiver是有什么要配置的嗎J?還是說兼容不
    發(fā)表于 09-02 06:47

    如何將pin從arduino轉(zhuǎn)移到esp32?

    大家好,我最近將我的項目從 Arduino 轉(zhuǎn)移到 ESP32,我在 arduino 上使用引腳 10,9 從我的設(shè)備和庫 SoftwareSerial 傳輸 RX/TX。我想知道我可以在 ESP 中使用哪個引腳,如果我要使用 ESPSoftwareSerial。
    發(fā)表于 04-12 06:14

    IAR下如何將程序拷貝在RAM運行

    有時候我們需要將一部分程序FLASH 拷貝到 RAM 運行,以提高程序
    發(fā)表于 09-28 06:50

    IAR 下如何將程序拷貝在 RAM 運行

    STM32上面的如何讓程序RAM運行
    發(fā)表于 11-25 14:46 ?0次下載

    DSP的Flash里面的函數(shù)轉(zhuǎn)移到RAM

    意思是到FLASH去下載InitFlash(),下載到SECURE_RAM,然后要到SECURE_RAM運行程序,這個過程給出了下載地址和目標地址。注意此時SECURE_
    的頭像 發(fā)表于 08-04 17:10 ?2576次閱讀

    從TMS320F281xDSP片上FLASH運行應(yīng)用程序_從FLASH轉(zhuǎn)移到RAM運行_BIOS

    從TMS320F281xDSP片上FLASH運行應(yīng)用程序_從FLASH轉(zhuǎn)移到
    發(fā)表于 07-30 11:54 ?3次下載
    從TMS320F281xDSP片上<b class='flag-5'>FLASH</b><b class='flag-5'>中</b><b class='flag-5'>運行</b>應(yīng)用<b class='flag-5'>程序</b>_從<b class='flag-5'>FLASH</b><b class='flag-5'>轉(zhuǎn)移到</b><b class='flag-5'>RAM</b><b class='flag-5'>運行</b>_BIOS

    【單片機程序RAM程序RAM調(diào)試的運行方式&程序固化后運行方式

    程序固化后運行方式: 程序開始運行后需要將RW 和ZI段搬移到RAM中去,
    發(fā)表于 12-03 15:21 ?4次下載
    【單片機<b class='flag-5'>程序</b>和<b class='flag-5'>RAM</b>】<b class='flag-5'>程序</b>在<b class='flag-5'>RAM</b><b class='flag-5'>中</b>調(diào)試的<b class='flag-5'>運行</b>方式&<b class='flag-5'>程序</b>固化后<b class='flag-5'>運行</b>方式

    嵌入式開發(fā),如何將Flash程序轉(zhuǎn)移到RAM運行?

    對于獨立的嵌入式系統(tǒng),需要把程序存入non-volitale存儲單元,常用的也就是flash。但是程序flash
    發(fā)表于 02-09 10:14 ?4次下載
    嵌入式開發(fā)<b class='flag-5'>中</b>,<b class='flag-5'>如何將</b><b class='flag-5'>Flash</b><b class='flag-5'>中</b>的<b class='flag-5'>程序</b><b class='flag-5'>轉(zhuǎn)移到</b><b class='flag-5'>RAM</b><b class='flag-5'>中</b><b class='flag-5'>運行</b>?

    嵌入式開發(fā),如何將Flash程序轉(zhuǎn)移到RAM運行?

    嵌入式開發(fā),如何將Flash程序轉(zhuǎn)移到RAM
    的頭像 發(fā)表于 10-29 16:23 ?3242次閱讀