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

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

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

IAR下手動(dòng)拷貝自定義程序段到RAM中執(zhí)行的方法分享

痞子衡嵌入式 ? 來源:痞子衡嵌入式 ? 2023-11-21 09:38 ? 次閱讀

在痞子衡舊文 《IAR下RT-Thread工程自定義函數(shù)段重定向失效分析》 里,我們知道 IAR 鏈接器處理自定義程序段重定向是有一些限制的,只要用戶重寫了底層 __low_level_init() 函數(shù),那么這個(gè)函數(shù)里不能調(diào)用任何與自定義程序段相關(guān)的代碼,否則自定義程序段就不會(huì)被 IAR 鏈接器(initialize by copy)正常處理。這其實(shí)對(duì)用戶來說不太友好,既然如此,我們干脆就不用 IAR 鏈接器來做代碼重定向了,今天痞子衡教大家手動(dòng)拷貝程序段到 RAM 中的方法。

手動(dòng)拷貝自定義程序段除了解決 IAR 鏈接器限制之外,還有另外一個(gè)用處,那就是拷貝的位置可以由用戶決定。比如我們希望將程序重定向到外部 PSRAM 執(zhí)行,但是在拷貝之前是需要先初始化外部 PSRAM 的,這時(shí)候我們完全可以在 main 函數(shù)里做完 PSRAM 初始化之后再做程序段的拷貝。

Note 1:閱讀本文前需要對(duì) 《IAR鏈接文件(.icf)》、《IAR映射文件(.map)》 這兩種文件有所了解。

Note 2:本文使用的 IAR EWARM 軟件版本是 v9.30.1。

一、源文件里自定義程序段

首先我們要將需要重定向到 RAM 中執(zhí)行的全部關(guān)鍵函數(shù)放到同一個(gè)自定義程序段里,具體方法參見痞子衡舊文 《在IAR下將關(guān)鍵函數(shù)重定向到RAM中執(zhí)行的方法》 里 2.2 小節(jié)。

我們以最經(jīng)典的 SDK_2.13.1_MIMXRT1170-EVKoardsevkmimxrt1170demo_appshello_worldcm7iar 例程( flexspi_nor_debug build)為例,將其 SysTick_DelayTicks() 函數(shù)放到自定義程序段 UserRelocateCode 里,寫法如下:

#pragmalocation="UserRelocateCode"
voidSysTick_DelayTicks(uint32_tn)
{
g_systickCounter=n;
while(g_systickCounter!=0U)
{
}
}

二、鏈接文件里處理自定義程序段

有了自定義程序段 UserRelocateCode 后,現(xiàn)在我們需要告訴 IAR 鏈接器,這個(gè)程序段將由用戶自己做初始化處理。打開工程鏈接文件 MIMXRT1176xxxxx_cm7_flexspi_nor.icf 添加如下語句。即將 UserRelocateCode 段重定向到 EXTRAM_region 里執(zhí)行,并且這里最關(guān)鍵的是 initialize manually 這一句(區(qū)別于 SDK CodeQuickAccess 段重定向做法所用的 initialize by copy)。

define symbol m_external_ram_start   = 0x60000000;
define symbol m_external_ram_end     = 0x6003FFFF;
define region EXTRAM_region = mem:[from m_external_ram_start to m_external_ram_end];
initialize manually        { section UserRelocateCode };
place in EXTRAM_region     { section UserRelocateCode };

編譯修改后的工程,查看其映射文件(.map),其中和 UserRelocateCode 段相關(guān)的內(nèi)容如下,這里可以看到除了 P10 之外,P1 里還多了一個(gè)名為 UserRelocateCode_init 的段,這其實(shí)就是自定義程序段機(jī)器碼在 Flash 里的存放位置(拷貝數(shù)據(jù)源)。

*******************************************************************************
*** PLACEMENT SUMMARY
***
"P10": place in [from 0x6000'0000 to 0x6003'ffff] { section UserRelocateCode };
initialize manually with packing = none { section UserRelocateCode };

  Section              Kind         Address    Size  Object
  -------              ----         -------    ----  ------
"P1":                                          0x4738
  UserRelocateCode_init           0x3000'6800    0x10  
    Initializer bytes    const    0x3000'6800    0x10  

"P10":                                           0x10
  UserRelocateCode                0x6000'0000    0x10  
    UserRelocateCode-1            0x6000'0000    0x10  
      UserRelocateCode   inited   0x6000'0000    0x10  led_blinky.o [7]
                                - 0x6000'0010    0x10

三、手動(dòng)拷貝自定義程序段

上一節(jié)我們?cè)谟成湮募锟吹?UserRelocateCode_init 段的出現(xiàn),這其實(shí) IAR 的默認(rèn)規(guī)定,可在 IAR SystemsEmbedded Workbench 9.30.1armdocEWARM_DevelopmentGuide.ENU.pdf 文檔找到相應(yīng)規(guī)則,即重定向的自定義段,其初始化值將被放到名為原自定義段名 + _init 后綴的段里。

67de6d6c-879f-11ee-939d-92fbcf53809c.png

一切準(zhǔn)備就緒,拷貝代碼的實(shí)現(xiàn)還是比較簡單的,下面是示例拷貝函數(shù) user_code_init()。有了它,我們就可以在 main 函數(shù)里自由決定其調(diào)用位置了。

#pragmasection="UserRelocateCode"
#pragmasection="UserRelocateCode_init"
voiduser_code_init(void)
{
uint8_t*dest_start,*src_start,*src_end;
uint32_tcodebytes;
dest_start=__section_begin("UserRelocateCode");
src_start=__section_begin("UserRelocateCode_init");
src_end=__section_end("UserRelocateCode_init");
codebytes=src_end-src_start;
while(codebytes--)
{
*dest_start++=*src_start++;
}
}

intmain(void)
{
psram_init();
user_code_init();
//代碼省略...
}





審核編輯:劉清

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

    關(guān)注

    8

    文章

    1368

    瀏覽量

    114702
  • IAR
    IAR
    +關(guān)注

    關(guān)注

    5

    文章

    352

    瀏覽量

    36684
  • PSRAM
    +關(guān)注

    關(guān)注

    0

    文章

    35

    瀏覽量

    13351

原文標(biāo)題:IAR下如何手動(dòng)拷貝自定義程序段到RAM中執(zhí)行?

文章出處:【微信號(hào):pzh_mcu,微信公眾號(hào):痞子衡嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    IAR小課堂 | 如何將部分程序RAM運(yùn)行

    在實(shí)際項(xiàng)目開發(fā),有時(shí)候我們需要將一部分程序從 FLASH 拷貝到 RAM 運(yùn)行,以提高程序運(yùn)
    發(fā)表于 10-31 14:09

    【每日一知識(shí)點(diǎn)】IAR 下如何將程序拷貝RAM 運(yùn)行,你知道怎么做嗎?

    中將這部分程序拷貝到RAM 運(yùn)行。本文中所有例子都是在 IAR v7.2 下,基于 STM32F334 完成的。
    發(fā)表于 03-22 13:34

    為什么要將flash操作代碼拷貝到ram執(zhí)行

    升級(jí)。比較特別的是,需要將flash操作代碼拷貝到ram執(zhí)行,這是為什么?bootloader程序所在flash空間設(shè)置為被保護(hù)狀態(tài),不會(huì)
    發(fā)表于 07-16 06:10

    如何從ram運(yùn)行QSPI演示以測(cè)試自定義板上的QSPI Ram?

    大家好 是否有程序或教程告訴我如何使其中一個(gè)演示應(yīng)用程序從板載 RAM 運(yùn)行。 我有一個(gè) MIMXRT1060-EVKB 開發(fā)套件以及一個(gè)裝有 MIMXRT1062 的定制板。 在自定義
    發(fā)表于 05-31 10:35

    IAR下如何將程序拷貝RAM運(yùn)行

    有時(shí)候我們需要將一部分程序從 FLASH 拷貝到 RAM 運(yùn)行,以提高程序運(yùn)行的速度。本文基于 IAREmbedded Workbench
    發(fā)表于 09-28 06:50

    matlab自定義函數(shù)調(diào)用的方法

    matlab自定義函數(shù)調(diào)用的方法 命令文件/函數(shù)文件+ 函數(shù)文件 - 多
    發(fā)表于 11-29 13:14 ?88次下載

    SOPC自定義外設(shè)和自定義指令性能分析

    SOPC自定義外設(shè)和自定義指令性能分析 NiosII是一個(gè)建立在FPGA上的嵌入式軟核處理器,靈活性很強(qiáng)。作為體現(xiàn)NiosII靈活性精髓的兩個(gè)最主要方面,自
    發(fā)表于 03-29 15:12 ?1610次閱讀
    SOPC<b class='flag-5'>中</b><b class='flag-5'>自定義</b>外設(shè)和<b class='flag-5'>自定義</b>指令性能分析

    在Protel自定義Title Block的方法

    詳細(xì)介紹了在Protel自定義Title Block的方法
    發(fā)表于 05-24 11:42 ?0次下載
    在Protel<b class='flag-5'>中</b><b class='flag-5'>自定義</b>Title Block的<b class='flag-5'>方法</b>

    1602自定義字符

    1602液晶能夠顯示自定義字符,能夠根據(jù)讀者的具體情況顯示自定義字符。
    發(fā)表于 01-20 15:43 ?1次下載

    怎么樣去開發(fā)自定義應(yīng)用程序?

    Atmel小貼士 如何開發(fā)自定義應(yīng)用程序
    的頭像 發(fā)表于 07-11 00:05 ?2367次閱讀

    如何在IAR環(huán)境下將程序拷貝RAM運(yùn)行

    有時(shí)候我們需要將一部分程序從FLASH拷貝到RAM運(yùn)行,以提高程序運(yùn)行的速度。本文基于IAR
    發(fā)表于 11-15 17:38 ?11次下載
    如何在<b class='flag-5'>IAR</b>環(huán)境下將<b class='flag-5'>程序</b><b class='flag-5'>拷貝</b>在<b class='flag-5'>RAM</b><b class='flag-5'>中</b>運(yùn)行

    自定義視圖組件教程案例

    自定義組件 1.自定義組件-particles(粒子效果) 2.自定義組件- pulse(脈沖button效果) 3.自定義組件-progress(progress效果) 4.
    發(fā)表于 04-08 10:48 ?14次下載

    自定義算子開發(fā)

    一個(gè)完整的自定義算子應(yīng)用過程包括注冊(cè)算子、算子實(shí)現(xiàn)、含自定義算子模型轉(zhuǎn)換和運(yùn)行含自定義op模型四個(gè)階段。在大多數(shù)情況下,您的模型應(yīng)該可以通過使用hb_mapper工具完成轉(zhuǎn)換并順利部署
    的頭像 發(fā)表于 04-07 16:11 ?2812次閱讀
    <b class='flag-5'>自定義</b>算子開發(fā)

    labview超快自定義控件制作和普通自定義控件制作

    labview超快自定義控件制作和普通自定義控件制作
    發(fā)表于 08-21 10:32 ?13次下載

    創(chuàng)建自定義的基于閃存的引導(dǎo)加載程序(BSL)

    電子發(fā)燒友網(wǎng)站提供《創(chuàng)建自定義的基于閃存的引導(dǎo)加載程序(BSL).pdf》資料免費(fèi)下載
    發(fā)表于 09-19 10:50 ?0次下載
    創(chuàng)建<b class='flag-5'>自定義</b>的基于閃存的引導(dǎo)加載<b class='flag-5'>程序</b>(BSL)