<output id="yn1pw"></output>
    <wbr id="yn1pw"></wbr>

    <form id="yn1pw"><legend id="yn1pw"></legend></form>

  1. 更多課程 選擇中心

    嵌入式培訓
    達內IT學院

    400-111-8989

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

    • 發布:嵌入式培訓
    • 來源:嵌入式資訊
    • 時間:2020-07-06 14:34

    對于獨立的嵌入式系統,需要把程序存入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愛好者:如果你想要在短時間內快速入門,順利掌握一門技術,建議還是認真學習視頻。多練習,多動手。

    預約申請免費試聽課

    填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

    上一篇:這么說嵌入式系統,你還不理解嗎?
    下一篇:手把手教你嵌入式C語言優化技巧

    單片機:寫1清零,寫0清零,有什么區別?

    嵌入式工程師一定不要亂用全局變量

    嵌入式培訓靠譜嗎?就業怎么樣?

    新手如何學習單片機?

    • 掃碼領取資料

      回復關鍵字:視頻資料

      免費領取 達內課程視頻學習資料

    • 視頻學習QQ群

      添加QQ群:1143617948

      免費領取達內課程視頻學習資料

    Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

    選擇城市和中心
    黑龍江省

    吉林省

    河北省

    湖南省

    貴州省

    云南省

    廣西省

    海南省

    高清在线不卡一区二区_2019最新国产高清不卡a_亚洲欧洲日本aⅴ 百度 好搜 搜狗
    <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>