0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【GD32 MCU 入门教程】七、分散加载说明

聚沃科技 2024-08-27 09:19 次阅读

分散加载说明以GD32F103ZE为例,分别用Keil、IAR和Embedded Builder工具实现:将函数放置某个地址、将常量放置某个地址、将函数放在RAM中运行的三种效果。

1、将led_toggle()函数放在0x08040000地址后。

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

3、将void led_flow(void) 函数在RAM中运行,放在0x20008000地址后面。

1.Keil IDE example

1.1.将函数放置某个地址

生成.sct 文件

单击 MDK 的 Option -> linker 取消勾选“Use memory layout from target Dialog”。

单击“Scatter file”中的“Edit” ,keil 工程会出现“.sct”文件。

输入图片说明

修改.sct 文件,将 512k flash 分成 LR_IROM1 和 LR_IROM2 两个加载区域,分别为 256K 的 flash。

输入图片说明

将 void led_toggle(void)函数添加到 LR_IROM2 地址内。

led.o 表示 led.c 文件生成的.o 文件。led_toggle 表示所添加的函数。

输入图片说明

void led_toggle(void)函数需要添加“attribute”,代码如下。

void led_toggle(void) attribute((section ("led_toggle")));其中“led_toggle”名称可以任意。

输入图片说明

双击工程名“Tartget1” 生成.map 文件,查看是否加载成功。

输入图片说明

查看.map 文件。led_toggle 函数 在地址 0x08040000 后。说明加载成功。

输入图片说明

1.2.将常量放置某个地址

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

输入图片说明

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

输入图片说明

1.3.将函数放置 RAM 中运行

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

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

输入图片说明

修改.sct 文件,将 mcu 的 64K RAM 分成 RW_IRAM1 和 RW_IRAM2 两个区,分别32K 大小 。在 LR_IROM2 增加 RW_IRAM2 执行区域和 led_flow 函数,如图。

输入图片说明

查看.map 文件,led_flow 函数在地址 0x20008000 后。说明加载成功。

输入图片说明

1.4.将程序中所有 const 快速放置在 data 区域

专门划分出一块区域 0x08040000-0x08080000 放置 const 数据

输入图片说明

修改 sct 文件如下:

输入图片说明

代码编译出来效果如下:

输入图片说明

2.IAR IDE example

2.1.将函数放置某个地址

打开配置文件.icf

Option -> linker -> config 勾选“override default”。单击“Edit”进行修改。

输入图片说明

修改 icf 文件,将 512K flash 分成 ROM 和 ROM1,各 256K 加载区,添加代码如下:

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)函数放置在地址 0x08040000 后,添加代码如下。

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

输入图片说明

在 led.c 文件中添加函数属性。添加代码如下。

void led_toggle(void)@ “led_toggle”其中“led_toggle”名称可以任意。

输入图片说明

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

输入图片说明

查看.map 文件。led_toggle 函数 在地址 0x08040000 后。说明加载成功。

输入图片说明

2.2.将常量放置某个地址

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

输入图片说明

查看.map 文件。函数 tempbuf 在地址 0x08020000 后。说明加载成功。

输入图片说明

2.3.将函数放在 RAM 中运行

在 led.c 文件设置 led_flow 属性,添加代码如下。void led_flow(void) @"led_flow";

输入图片说明

修改.sct 文件,将 MCU 的 64K RAM 分成 RAM 和 RW_IRAM1 两个 区,分别 32K 大小。

输入图片说明

将函数从 flash copy 到 RAM 中,添加代码如下。

initialize by copy { readwrite,section led_flow };

输入图片说明

将 void led_flow(void)函数放置地址 0x20008000 后,需要增加如下函数。如图。

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

输入图片说明

查看.map 文件,函数 led_flow 在地址 0x20008000 后说明加载成功。

输入图片说明

2.4. 将程序中的 const data 快速的放置到某个区域

相关语法如下: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.将函数放置某个地址

将 led_toggle()函数放置在 flash 的 0x08003400 位置

输入图片说明

3.2.将常量放置某个地址

将常量数组放置在 flash 的 0x08003000 地址,

输入图片说明

在 gd32f10x_flash.ld 中 添加如下语句

输入图片说明

3.3.将函数放置 RAM 中运行

将函数 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 地址中。

在函数前加上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]))); }

调试运行验证函数地址

输入图片说明

教程GD32 MCU方案商聚沃科技原创发布,了解更多GD32 MCU教程,关注聚沃科技官网

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6032

    文章

    44513

    浏览量

    632839
  • 嵌入式
    +关注

    关注

    5068

    文章

    19014

    浏览量

    303131
  • IAR
    IAR
    +关注

    关注

    5

    文章

    344

    浏览量

    36618
  • 开发板
    +关注

    关注

    25

    文章

    4943

    浏览量

    97177
  • keil
    +关注

    关注

    68

    文章

    1211

    浏览量

    166670
收藏 人收藏

    评论

    相关推荐

    GD32 MCU 入门教程GD32 MCU 常见外设介绍(12)FMC 模块介绍

    闪存控制器(FMC),提供了片上闪存需要的所有功能。FMC 也提供了页擦除,整片擦除,以及32 位整字或 16 位半字编程闪存等操作。 GD32 MCU 支持不同类型编程的具体说明如下表 GD
    的头像 发表于 08-21 09:56 976次阅读
    <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> 常见外设介绍(12)FMC 模块介绍

    GD32单片机利用分散加载避免前后Flash速度不一致

    默认情况下,代码烧录到MCU中都不需要分散加载,但考虑到GD32某些型号有前后flash速度不一致的情况,这时可以用分散
    发表于 08-28 17:13 70次下载

    GD32单片机程序分散加载的方法

    本文档内容介绍了GD32单片机程序分散加载的方法,图像详解,供参考。
    发表于 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分散加载说明
    发表于 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分散加载说明
    发表于 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>

    兆易创新GD32 MCU选型手册,适用于GD32全系列MCU

    兆易创新GD32MCU选型手册,适用于GD32全系列MCUGD32MCU选型手册,适用于GD32全系列MCU
    发表于 10-19 17:26 49次下载

    不同型号的GD32 MCU如何区分?

    大家是否碰到过以下应用场景:同一套软件代码希望跑在不同型号的GD32 MCU中,但有些地方需要根据MCU型号进行调整?或者上位机或其他MCUGD3
    的头像 发表于 01-27 09:32 945次阅读
    不同型号的<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b>如何区分?

    GD32 MCU 入门教程】一、GD32 MCU 开发环境搭建(1)使用Keil开发GD32

    GD32系列为通用型MCU,所以开发环境也可以使用通用型的IDE,目前使用较多的是KEIL、IAR、 GCC和Embedded Builder,客户可以根据个人喜好来选择相应的开发环境。
    的头像 发表于 08-08 15:01 1004次阅读
    【<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> 开发环境搭建(1)使用Keil开发<b class='flag-5'>GD32</b>

    GD32 MCU 入门教程】一、GD32 MCU 开发环境搭建(2)使用 IAR 开发 GD32

    GD32系列为通用型MCU,所以开发环境也可以使用通用型的IDE,目前使用较多的是KEIL、IAR、 GCC和Embedded Builder,客户可以根据个人喜好来选择相应的开发环境。
    的头像 发表于 08-08 15:40 586次阅读
    【<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> 开发环境搭建(2)使用 IAR 开发 <b class='flag-5'>GD32</b>

    GD32 MCU 入门教程】一、GD32 MCU 开发环境搭建(3)使用 Embedded Builder 开发 GD32

    GD32系列为通用型MCU,所以开发环境也可以使用通用型的IDE,目前使用较多的是KEIL、IAR、 GCC和Embedded Builder,客户可以根据个人喜好来选择相应的开发环境。
    的头像 发表于 08-08 16:03 823次阅读
    【<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> 开发环境搭建(3)使用 Embedded Builder 开发 <b class='flag-5'>GD32</b>

    GD32 MCU 入门教程】二、GD32 MCU 烧录说明(1)ISP 烧录

    ISP:In System Programing,在系统编程,通过MCU片内的引导程序进行Flash编程。 GD32片内有一个只读信息块,用于存放引导装载程序,引导程序在MCU出厂前就会提前烧录好
    的头像 发表于 08-08 16:20 747次阅读
    【<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
    的头像 发表于 08-08 17:44 952次阅读
    【<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 常见外设介绍(14)RTC 模块介绍

    GD32 MCU内部提供了一个RTC(实时时钟)模块,通过RTC可以实现日历时钟、闹钟等功能。RTC也可以用于深度睡眠或待机模式的低功耗唤醒。不同系列的GD32 MCU在RTC设计和功
    的头像 发表于 08-23 09:18 369次阅读
    【<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> 常见外设介绍(14)RTC 模块介绍

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

    GD32 MCU FPU 使用方法
    的头像 发表于 08-25 09:24 464次阅读
    【<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 结构与使用注意事项

    本文是专门为基于GD32 MCU开发的工程设计人员提供,主要介绍了GPIO的功能配置、内部结构以及在不同场景使用时的注意事项,旨在帮助GD32 MCU开发者优化对通用型输入输出端口(G
    的头像 发表于 09-07 10:34 579次阅读
    【<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 结构与使用注意事项