加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 一、源文件里自定義程序段
    • 二、鏈接文件里處理自定義程序段
    • 三、手動(dòng)拷貝自定義程序段
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

IAR下如何手動(dòng)拷貝自定義程序段到RAM中執(zhí)行?

2023/11/21
2820
閱讀需 10 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家分享的是IAR下手動(dòng)拷貝自定義程序段到RAM中執(zhí)行的方法

我們知道 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-EVKboardsevkmimxrt1170demo_appshello_worldcm7iar 例程( flexspi_nor_debug build)為例,將其 SysTick_DelayTicks() 函數(shù)放到自定義程序段 UserRelocateCode 里,寫法如下:

#pragma?location?=?"UserRelocateCode"
void?SysTick_DelayTicks(uint32_t?n)
{
????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  <Block>
    Initializer bytes    const    0x3000'6800    0x10  <for UserRelocateCode-1>

"P10":                                           0x10
  UserRelocateCode                0x6000'0000    0x10  <Block>
    UserRelocateCode-1            0x6000'0000    0x10  <Init block>
      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 后綴的段里。

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

#pragma?section?=?"UserRelocateCode"
#pragma?section?=?"UserRelocateCode_init"
void?user_code_init(void)
{
????uint8_t?*dest_start,?*src_start,?*src_end;
????uint32_t?codebytes;
????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++;
????}
}

int?main(void)
{
????psram_init();
????user_code_init();
????//?代碼省略...
}

至此,IAR下手動(dòng)拷貝自定義程序段到RAM中執(zhí)行的方法痞子衡便介紹完畢了,掌聲在哪里~~~

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
IL207AT 1 Siemens Transistor Output Optocoupler, 1-Element, 2500V Isolation
暫無數(shù)據(jù) 查看
HFBR-1521ETZ 1 Avago Technologies FIBER OPTIC TRANSMITTER, 5Mbps, THROUGH HOLE MOUNT, ROHS COMPLIANT, 6 PIN

ECAD模型

下載ECAD模型
$17.77 查看
KSZ8081RNACA 1 Microchip Technology Inc DATACOM, ETHERNET TRANSCEIVER, QCC24

ECAD模型

下載ECAD模型
$0.77 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

碩士畢業(yè)于蘇州大學(xué)電子信息學(xué)院,目前就職于恩智浦(NXP)半導(dǎo)體MCU系統(tǒng)部門,擔(dān)任嵌入式系統(tǒng)應(yīng)用工程師。痞子衡會(huì)定期分享嵌入式相關(guān)文章