RM新时代网站-首页

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

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

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

【GD32 MCU 入門教程】七、分散加載說明

聚沃科技 ? 2024-08-27 09:19 ? 次閱讀

分散加載說明以GD32F103ZE為例,分別用Keil、IAR和Embedded Builder工具實現(xiàn):將函數(shù)放置某個地址、將常量放置某個地址、將函數(shù)放在RAM中運行的三種效果。

1、將led_toggle()函數(shù)放在0x08040000地址后。

2、將tempbuf[1024]常量放在0x08020000地址后。

3、將void led_flow(void) 函數(shù)在RAM中運行,放在0x20008000地址后面。

1.Keil IDE example

1.1.將函數(shù)放置某個地址

生成.sct 文件

單擊 MDK 的 Option -> linker 取消勾選“Use memory layout from target Dialog”。

單擊“Scatter file”中的“Edit” ,keil 工程會出現(xiàn)“.sct”文件。

輸入圖片說明

修改.sct 文件,將 512k flash 分成 LR_IROM1 和 LR_IROM2 兩個加載區(qū)域,分別為 256K 的 flash。

輸入圖片說明

將 void led_toggle(void)函數(shù)添加到 LR_IROM2 地址內(nèi)。

led.o 表示 led.c 文件生成的.o 文件。led_toggle 表示所添加的函數(shù)。

輸入圖片說明

void led_toggle(void)函數(shù)需要添加“attribute”,代碼如下。

void led_toggle(void) attribute((section ("led_toggle")));其中“l(fā)ed_toggle”名稱可以任意。

輸入圖片說明

雙擊工程名“Tartget1” 生成.map 文件,查看是否加載成功。

輸入圖片說明

查看.map 文件。led_toggle 函數(shù) 在地址 0x08040000 后。說明加載成功。

輸入圖片說明

1.2.將常量放置某個地址

將 tempbuf[1024]放置到 0x08020000,添加如下代碼。此時可以不用修改.sct 文件。const uint8_t tempbuf [1024] attribute((at(0x08020000))) = {0};

輸入圖片說明

查看.map 文件。常量 tempbuf[1024]在地址 0x08020000 后。說明加載成功。

輸入圖片說明

1.3.將函數(shù)放置 RAM 中運行

在 led.c 文件將 led_flow(void)申明,代碼添加如下。

void led_flow(void) attribute((section ("led_flow")));

輸入圖片說明

修改.sct 文件,將 mcu 的 64K RAM 分成 RW_IRAM1 和 RW_IRAM2 兩個區(qū),分別32K 大小 。在 LR_IROM2 增加 RW_IRAM2 執(zhí)行區(qū)域和 led_flow 函數(shù),如圖。

輸入圖片說明

查看.map 文件,led_flow 函數(shù)在地址 0x20008000 后。說明加載成功。

輸入圖片說明

1.4.將程序中所有 const 快速放置在 data 區(qū)域

專門劃分出一塊區(qū)域 0x08040000-0x08080000 放置 const 數(shù)據(jù)

輸入圖片說明

修改 sct 文件如下:

輸入圖片說明

代碼編譯出來效果如下:

輸入圖片說明

2.IAR IDE example

2.1.將函數(shù)放置某個地址

打開配置文件.icf

Option -> linker -> config 勾選“override default”。單擊“Edit”進行修改。

輸入圖片說明

修改 icf 文件,將 512K flash 分成 ROM 和 ROM1,各 256K 加載區(qū),添加代碼如下:

define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; define symbol __ICFEDIT_region_ROM_end__ = 0x0803FFFF; define symbol __ICFEDIT_region_ROM1_start__ = 0x08040000; define symbol __ICFEDIT_region_ROM1_end__ = 0x0807FFFF; define region ROM1_region=mem:[from__ICFEDIT_region_ROM1_start__to __ICFEDIT_region_ROM1_end__]

輸入圖片說明

修改 icf 文件,將 void led_toggle(void)函數(shù)放置在地址 0x08040000 后,添加代碼如下。

place at address mem:0x08040000 { readonly section led_toggle };

輸入圖片說明

在 led.c 文件中添加函數(shù)屬性。添加代碼如下。

void led_toggle(void)@ “l(fā)ed_toggle”其中“l(fā)ed_toggle”名稱可以任意。

輸入圖片說明

生成.map 文件,查看是否加載成功。在 IAR 中 Option -> linker -> List 勾選“generate linker map file”。

輸入圖片說明

查看.map 文件。led_toggle 函數(shù) 在地址 0x08040000 后。說明加載成功。

輸入圖片說明

2.2.將常量放置某個地址

將tempbuf[1024]放置到0x08020000,添加如下代碼。此時可以不用修改.icf 文件。const uint8_t tempbuf [1024] attribute((at(0x08020000))) = {0};

輸入圖片說明

查看.map 文件。函數(shù) tempbuf 在地址 0x08020000 后。說明加載成功。

輸入圖片說明

2.3.將函數(shù)放在 RAM 中運行

在 led.c 文件設(shè)置 led_flow 屬性,添加代碼如下。void led_flow(void) @"led_flow";

輸入圖片說明

修改.sct 文件,將 MCU 的 64K RAM 分成 RAM 和 RW_IRAM1 兩個 區(qū),分別 32K 大小。

輸入圖片說明

將函數(shù)從 flash copy 到 RAM 中,添加代碼如下。

initialize by copy { readwrite,section led_flow };

輸入圖片說明

將 void led_flow(void)函數(shù)放置地址 0x20008000 后,需要增加如下函數(shù)。如圖。

place at address mem:0x20008000 { section led_flow };

輸入圖片說明

查看.map 文件,函數(shù) led_flow 在地址 0x20008000 后說明加載成功。

輸入圖片說明

2.4. 將程序中的 const data 快速的放置到某個區(qū)域

相關(guān)語法如下:place at address mem:0x08040000 { section .rodata };

輸入圖片說明

運行效果如下:

輸入圖片說明

3. Embedded Builder IDE example

直接使用手動編寫的 ld 文件,在 Embedded Builder 中的的“ Window->ShowView->Project

Explore->ldscripts” 中 雙 擊 gd32f10x_flash.ld 文件或者也可到工程目錄

“GD32F4xx_ScatterLoading_v1.0.0_Eclipse\ldscripts\gd32f4xx_flash.ld”下打開編輯, 代碼下圖所示:

輸入圖片說明

3.1.將函數(shù)放置某個地址

將 led_toggle()函數(shù)放置在 flash 的 0x08003400 位置

輸入圖片說明

3.2.將常量放置某個地址

將常量數(shù)組放置在 flash 的 0x08003000 地址,

輸入圖片說明

在 gd32f10x_flash.ld 中 添加如下語句

輸入圖片說明

3.3.將函數(shù)放置 RAM 中運行

將函數(shù) gd_eval_led_toggle 放在 SRAM 中運行,在 gd32f10x_flash.ld 添加如下代碼

/* memory map */ MEMORY { FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 16K RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 4K RAM1 (xrw) : ORIGIN = 0x20000400, LENGTH = 1K } ENTRY(Reset_Handler) SECTIONS { __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; /* ISR vectors */ .vectors : { . = ALIGN(4); KEEP(*(.vectors)) . = ALIGN(4); __Vectors_End = .; __Vectors_Size = __Vectors_End - __gVectors; } >FLASH /* Load .sram1_text and gd32f4xx_it.o to RAM1 starting address */ _ram1_text = 0x08003500; .ram1_text : AT(_ram1_text) { . = ALIGN(4); _sram1_text = .; *(.sram1_text) *(.sram1_text*) *gd32f10x_it.o(.text .text.*) . = ALIGN(4); _erma1_text = .; } > RAM1

上述代碼將.sram1_text 段和 gd32f10x_it.o 文件加載到 RAM1(0x20005000)起始地址處,在啟動文件startup_gd32f10x_md.S 中加入如下匯編代碼

CopyData3: ldr r3, =_ram1_text ldr r3, [r3, r1] str r3, [r0, r1] adds r1, r1, #4 b LoopCopyDataInit2 LoopCopyDataInit2: ldr r0, =_sram1_text ldr r3, =_erma1_text adds r2, r0, r1 cmp r2, r3 bcc CopyData3

上述匯編代碼完成將.sram1_text 段和 gd32f10x_it.o 文件由 flash 搬運到指定的 ram 地址中。

在函數(shù)前加上attribute ((section(".sram1_text")))。

/*! \brief toggle selected led \param[in] lednum: specify the led to be toggled \arg LED2 \arg LED3 \arg LED4 \arg LED5 \param[out] none \retval none */ __attribute__ ((section(".sram1_text"))) void gd_eval_led_toggle(led_typedef_enum lednum) { gpio_bit_write(GPIO_PORT[lednum], GPIO_PIN[lednum], (bit_status)(1-gpio_input_bit_get(GPIO_PORT[lednum], GPIO_PIN[lednum]))); }

調(diào)試運行驗證函數(shù)地址

輸入圖片說明

教程GD32 MCU方案商聚沃科技原創(chuàng)發(fā)布,了解更多GD32 MCU教程,關(guān)注聚沃科技官網(wǎng)

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

    關(guān)注

    6035

    文章

    44554

    瀏覽量

    634594
  • 嵌入式
    +關(guān)注

    關(guān)注

    5082

    文章

    19104

    瀏覽量

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

    關(guān)注

    5

    文章

    350

    瀏覽量

    36664
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    5032

    瀏覽量

    97371
  • keil
    +關(guān)注

    關(guān)注

    68

    文章

    1212

    瀏覽量

    166838
收藏 人收藏

    評論

    相關(guān)推薦

    GD32 MCU 入門教程GD32 MCU 常見外設(shè)介紹(12)FMC 模塊介紹

    閃存控制器(FMC),提供了片上閃存需要的所有功能。FMC 也提供了頁擦除,整片擦除,以及32 位整字或 16 位半字編程閃存等操作。 GD32 MCU 支持不同類型編程的具體說明如下表 GD
    的頭像 發(fā)表于 08-21 09:56 ?1093次閱讀
    <b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> 常見外設(shè)介紹(12)FMC 模塊介紹

    GD32單片機利用分散加載避免前后Flash速度不一致

    默認情況下,代碼燒錄到MCU中都不需要分散加載,但考慮到GD32某些型號有前后flash速度不一致的情況,這時可以用分散
    發(fā)表于 08-28 17:13 ?70次下載

    GD32單片機程序分散加載的方法

    本文檔內(nèi)容介紹了GD32單片機程序分散加載的方法,圖像詳解,供參考。
    發(fā)表于 11-22 11:02 ?39次下載
    <b class='flag-5'>GD32</b>單片機程序<b class='flag-5'>分散</b><b class='flag-5'>加載</b>的方法

    AN024 GD32F4xx_Keil分散加載說明

    AN024 GD32F4xx_Keil分散加載說明
    發(fā)表于 02-27 18:25 ?1次下載
    AN024 <b class='flag-5'>GD</b>32F4xx_Keil<b class='flag-5'>分散</b><b class='flag-5'>加載</b><b class='flag-5'>說明</b>

    AN032GD32F4xx_IAR分散加載說明

    AN032 GD32F4xx_IAR分散加載說明
    發(fā)表于 02-27 18:26 ?0次下載
    AN032<b class='flag-5'>GD</b>32F4xx_IAR<b class='flag-5'>分散</b><b class='flag-5'>加載</b><b class='flag-5'>說明</b>

    兆易創(chuàng)新GD32 MCU選型手冊,適用于GD32全系列MCU

    兆易創(chuàng)新GD32MCU選型手冊,適用于GD32全系列MCUGD32MCU選型手冊,適用于GD32全系列MCU
    發(fā)表于 10-19 17:26 ?49次下載

    不同型號的GD32 MCU如何區(qū)分?

    大家是否碰到過以下應(yīng)用場景:同一套軟件代碼希望跑在不同型號的GD32 MCU中,但有些地方需要根據(jù)MCU型號進行調(diào)整?或者上位機或其他MCUGD3
    的頭像 發(fā)表于 01-27 09:32 ?989次閱讀
    不同型號的<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b>如何區(qū)分?

    GD32 MCU 入門教程】一、GD32 MCU 開發(fā)環(huán)境搭建(1)使用Keil開發(fā)GD32

    GD32系列為通用型MCU,所以開發(fā)環(huán)境也可以使用通用型的IDE,目前使用較多的是KEIL、IAR、 GCC和Embedded Builder,客戶可以根據(jù)個人喜好來選擇相應(yīng)的開發(fā)環(huán)境。
    的頭像 發(fā)表于 08-08 15:01 ?1159次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】一、<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> 開發(fā)環(huán)境搭建(1)使用Keil開發(fā)<b class='flag-5'>GD32</b>

    GD32 MCU 入門教程】一、GD32 MCU 開發(fā)環(huán)境搭建(2)使用 IAR 開發(fā) GD32

    GD32系列為通用型MCU,所以開發(fā)環(huán)境也可以使用通用型的IDE,目前使用較多的是KEIL、IAR、 GCC和Embedded Builder,客戶可以根據(jù)個人喜好來選擇相應(yīng)的開發(fā)環(huán)境。
    的頭像 發(fā)表于 08-08 15:40 ?679次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】一、<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> 開發(fā)環(huán)境搭建(2)使用 IAR 開發(fā) <b class='flag-5'>GD32</b>

    GD32 MCU 入門教程】一、GD32 MCU 開發(fā)環(huán)境搭建(3)使用 Embedded Builder 開發(fā) GD32

    GD32系列為通用型MCU,所以開發(fā)環(huán)境也可以使用通用型的IDE,目前使用較多的是KEIL、IAR、 GCC和Embedded Builder,客戶可以根據(jù)個人喜好來選擇相應(yīng)的開發(fā)環(huán)境。
    的頭像 發(fā)表于 08-08 16:03 ?949次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】一、<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> 開發(fā)環(huán)境搭建(3)使用 Embedded Builder 開發(fā) <b class='flag-5'>GD32</b>

    GD32 MCU 入門教程】二、GD32 MCU 燒錄說明(1)ISP 燒錄

    ISP:In System Programing,在系統(tǒng)編程,通過MCU片內(nèi)的引導(dǎo)程序進行Flash編程。 GD32片內(nèi)有一個只讀信息塊,用于存放引導(dǎo)裝載程序,引導(dǎo)程序在MCU出廠前就會提前燒錄好
    的頭像 發(fā)表于 08-08 16:20 ?874次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】二、<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> 燒錄<b class='flag-5'>說明</b>(1)ISP 燒錄

    GD32 MCU 入門教程】二、GD32 MCU 燒錄說明(3)脫機燒錄

    大部分主流的燒錄器廠商均支持GD32 MCU的燒錄,如ELNEC、致遠電子、貸鋪科技、希爾特、邁斯威志、軒微、天津威磊、Segger、芯園電子、北極星電子等燒錄器廠商。燒錄方式分別有SWD和ISP
    的頭像 發(fā)表于 08-08 17:44 ?1107次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】二、<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> 燒錄<b class='flag-5'>說明</b>(3)脫機燒錄

    GD32 MCU 入門教程GD32 MCU 常見外設(shè)介紹(14)RTC 模塊介紹

    GD32 MCU內(nèi)部提供了一個RTC(實時時鐘)模塊,通過RTC可以實現(xiàn)日歷時鐘、鬧鐘等功能。RTC也可以用于深度睡眠或待機模式的低功耗喚醒。不同系列的GD32 MCU在RTC設(shè)計和功
    的頭像 發(fā)表于 08-23 09:18 ?451次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> 常見外設(shè)介紹(14)RTC 模塊介紹

    GD32 MCU 入門教程GD32 MCU FPU 使用方法

    GD32 MCU FPU 使用方法
    的頭像 發(fā)表于 08-25 09:24 ?572次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> FPU 使用方法

    GD32 MCU入門教程GD32 MCU GPIO 結(jié)構(gòu)與使用注意事項

    本文是專門為基于GD32 MCU開發(fā)的工程設(shè)計人員提供,主要介紹了GPIO的功能配置、內(nèi)部結(jié)構(gòu)以及在不同場景使用時的注意事項,旨在幫助GD32 MCU開發(fā)者優(yōu)化對通用型輸入輸出端口(G
    的頭像 發(fā)表于 09-07 10:34 ?719次閱讀
    【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b><b class='flag-5'>入門教程</b>】<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> GPIO 結(jié)構(gòu)與使用注意事項
    RM新时代网站-首页