首页 > 其他分享 >七、分散加载说明

七、分散加载说明

时间:2024-08-04 09:54:14浏览次数:11  
标签:__ led 函数 text void 说明 toggle 分散 加载

分散加载说明以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相关咨询:https://www.gd32bbs.com/   

标签:__,led,函数,text,void,说明,toggle,分散,加载
From: https://blog.csdn.net/weixin_45254847/article/details/140902008

相关文章

  • c动态加载c/c++ so并调用其中的函数或者子类实现
    在不少服务器应用中,会采用插件化或者模块化的体系实现具体的业务功能,比如mysql支持插件化体系,nginx采用模块化体系。总得来说,很多时候,因为扩展性,系统会采用动态加载so的方式扩展业务功能,而主框架不需要每次新增功能就不得不重新编译,很多时候,对于二进制发行的应用来说,不可能这......
  • 大模型网信办备案全网最详细说明(附附件)
    本文共分为以下几个章节一、大模型算法备案的强制性二、生成式人工智能(大语言模型)安全评估要点三、大模型备案必备材料+重点说明四、算法备案填报流程五、大模型备案时间成本对比六、备案建议附录、过程性材料一、大模型算法备案的强制性1、强制要求备案(1)《办法》......
  • Java中的类加载机制与自定义类加载器设计
    Java中的类加载机制与自定义类加载器设计大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨Java中的类加载机制与自定义类加载器设计。Java的类加载机制是Java虚拟机(JVM)运行时系统的基础之一,了解其工作原理以及如何设计自定义类加载器,对......
  • 【Nuxt】初识 Nuxt 和目录说明
    初识NuxtNuxt3支持Vue3及其周边生态,提供前后端功能,支持CSR(SPA),SSR,SSG渲染模式的应用。Nuxt3特点:Vue技术栈Nuxt3是基于Vue3+VueRouter+Vite等技术栈,全程Vue3+Vite开发体验(Fast)。自动导包Nuxt会自动导入辅助函数、组合API和VueAPI,无需手动导入。基......
  • idea忽略.class、.idea文件和target目录,以及爆红jar包无法加载修复
    一、添加忽略文件的地方首先打开设置,然后找到下面这个位置然后添加对应类型(千万别添加.class,否则和我一样踩坑,方法二可恢复)。整个项目会重新加载二、修复jar包爆红然后整个项目全部爆红,是因为你忽略了.class,你删除刚才新增的忽略.class,然后修改下面这个地方。加......
  • 类加载器和双亲委派机制
    什么是类加载器?类加载器是Jvm的重要组成之一(类加载器、运行时数据区、执行引擎、本地库接口、本地方法库),负责读取java字节码并将其加载到Jvm中的组件类加载器的分类Java中的类加载器可以分为以下几种:1.启动类加载器(BootstrapClassLoader)定义:这是最顶层的类加载器,用于加......
  • 在新页面却加载旧页面的接口
    问题:使用甘特图gantt时,做了一个功能,双击甘特图数据能进行搜索详细情况//3.7双击显示明细gantt.config.details_on_dblclick=true;//监视if(this.eventId){gantt.detachEvent(this.eventId);//先移除之前的事件绑定}thi......
  • 易优CMS模板目录各文件说明
    一般网站模板默认统一保存在template目录下面的PC目录里面templatePC---电脑端mobie---移动(app)端/PC目录介绍-/skin--目录为存放样式、JS、网站基础图片等。包括:--/css--样式.css文件目录--/JS--JS动态文件......
  • 如何在python中通过requests和opencv加载uint16 png文件
    我正在尝试从URL自动加载图像,然后将其加载到numpy矩阵。为此,我需要使用requests和opencv库。对于像uint8这样编码的标准图像,它以正确的方式工作,并且由于值溢出而损坏了uint16图像。这是我现在正在使用的一个简单的最小代码:importrequestsimportcv2importnumpy......
  • 野兔在线工具箱系统安装部署说明文档(商业版)
    这个是商业版的,不是早期免费版的旧版那个系统,旧版的可以看这个教程,不过那个系统不更新了 ,https://www.662p.com/other/5310今天花点时间来整理一下,把这个安装教程分享给大家。首先下载那个野兔在线工具系统(商业版),安装运行环境,官方推荐是PHP8.0,低版本不支持了,因为系统已......