七、分散加载说明

news2024/10/1 19:37:43

分散加载说明以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/   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1979525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React管理系统整合Cesium避坑指南

花费了一周时间将React 升级到了最新版本18,同时整合Cesium三维模块到系统中,其中遇到了react 版本升级后模块删改,按照原来的引入方式无法使用的问题,以及Cesium 放入子路由一直404等问题 文章目录 一、系统版本依赖二、系统预览…

3.10.全卷积网络FCN

全连接卷积神经网络(FCN) ​ FCN是用来深度网络来做语义分割的奠基性工作,用转置卷积层来替换CNN最后的全连接层,从而可以实现对每个像素的预测 ​ CNN(卷积神经网络)可以认为是一个预训练好的模型。CNN的最后一层是全局平均池化…

【C++学习第19天】最小生成树(对应无向图)

一、最小生成树 二、代码 1、Prim算法 #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N 510, INF 0x3f3f3f3f;int n, m; int g[N][N]; int dist[N]; bool st[N];int prim() {memset(dist, 0x3f, sizeof di…

十大机器学习算法-学习笔记-章节1-线性回归—

一、前言 学习视频&#xff1a;第一章&#xff1a;线性回归原理推导 1-回归问题概述_哔哩哔哩_bilibili 相关资料 该内容仅作为个人笔记使用&#xff0c;希望看到的各位能有所获&#xff0c;博主有误的地方&#xff0c;各位可以在评论区有所指正 二、正文 1、线性回归 什…

CTF-web基础 web服务器

web服务器作用 web服务器是一个服务器软件&#xff0c;我们可以把静态网页部署到web服务器上&#xff0c;web‘服务器通常只能运行静态网页。 应用服务器可以运行动态网页&#xff0c;web服务器通常和应用服务器一起使用。 原理 当我们输入网页时&#xff0c;他会发送请求到…

2024小学生古诗文大会暑期备考:吃透历年真题和知识点(持续)

最近有一些家长朋友问好真题网&#xff0c;上海三年级以上的小学生有什么比较有价值的比赛可以参加&#xff1f;结合众多孩子的反馈和参与情况&#xff0c;好真题网体检参加上海市汉字小达人比赛活动、上海市小学生古诗文大会、AMC8美国数学竞赛等&#xff0c;主要针对的是语文…

使用Python创建多功能文件管理器

简介 在本文中&#xff0c;我们将探索一个使用Python的wxPython库开发的文件管理器应用程序。这个应用程序不仅能够浏览和选择文件&#xff0c;还支持文件预览、压缩、图片转换以及生成PPT演示文稿的功能。 C:\pythoncode\new\filemanager.py 完整代码 import wx import os …

ChatGLM3Loader发生错误Library cudart is not initialized

ChatGLM3Loader执行时发生错误&#xff1a; Library cudart is not initialized。 文章《Chatglm3部署踩坑记录》里提到是因为没有安装 CUDA Toolkit 引起。 1、用 nvidia-smi.exe 命令查看显卡当前驱动程序版本 2、NVIDIA CUDA 工具包发行说明&#xff0c;每个 CUDA 工具包版…

深度学习中常用的激活函数和损失函数

ReLu和Sigmoid的区别。 ReLU在正数区域提供线性响应&#xff0c;有助于加速训练并减少梯度消失问题&#xff0c;而Sigmoid在所有区域都是非线性的&#xff0c;输出范围是0到1&#xff0c;适用于二分类问题&#xff0c;但在深网络中容易造成梯度消失。 Softmax函数的作用。 Soft…

《Advanced RAG》-03-使用 RAGAs + LlamaIndex 进行 RAG 评估

摘要 文章首先介绍了 RAG 评估的三个主要部分&#xff1a;输入查询、检索上下文和 LLM 生成的响应。 提到了 RAGAs 提出的 RAG 评估指标&#xff0c;包括 Faithfulness、Answer Relevance 和 Context Relevance&#xff0c;以及 RAGAs 网站提供的两个额外指标&#xff1a;Conte…

Jenkins未授权访问漏洞 *

漏洞复现 步骤一&#xff1a;使用以下fofa语法进行产品搜索.... port"8080" && app"JENKINS" && title"Dashboard [Jenkins]" 步骤二&#xff1a;在打开的URL中...点击Manage Jenkins --> Scritp Console在执行以下命令..…

JS使用 navigator.clipboard 操作剪切板

注意&#xff1a;需要在安全域下才能够使用&#xff0c;比如&#xff1a;https 协议的地址、127.0.0.1、localhost safari浏览器需要打开配置&#xff0c;在地址栏输入 about:config&#xff0c;搜索 clipboard&#xff0c;将 asyncClipboard 由 false 改为 true&#xff0c;然…

8.3,8.4总结

1.改进渲染 // 加载头像图像InputStream inputStream new ByteArrayInputStream(message.getFileBytes());Image image new Image(inputStream); // 第二个参数表示是否缓存图片&#xff0c;根据需要设置imageView.setImage(image);// 设置头像视图大小imageView.setFitWidth…

安装eclipse时候 打开eclipse出现一连串英文

问题描述&#xff1a;打开eclipse失败&#xff0c;提示错误Version 1.8.xx of the JVM is not suitable for this product Version:11 or greater is required 本地已经有1.8.XX 的jdk&#xff0c;但因为新安装的eclipse需要JVM更高的版本。 原因&#xff1a;jdk版本太低 解…

基于随机森林、XGBoost、lightGBM的大气污染预测可视化系统【前后端交互】

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主数据介绍系统界面展示系统登陆展示系统主界面可视化展示机器学习模型预测展示框架界面功能每文一语 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 数据介绍…

【C语言】C语言期末突击/考研--结构体与C++引用

一、结构体--结构体对齐--结构体数组 1.1.结构体的定义、初始化、结构体数组 有时候需要将不同类型的数据组合为一一个整体&#xff0c;以便于引用。 例如&#xff0c;一名学生有学号、姓 名、性别、年龄、地址等属性&#xff0c;如果针对学生的学号、姓名、年龄等都单独定义一…

代码坏味道有24种?我看未必

微信公众号&#xff1a;牛奶 Yoka 的小屋 有任何问题。欢迎来撩~ 最近更新&#xff1a;2024/08/03 [大家好&#xff0c;我是牛奶。] 我在上一篇文章打开IDEA&#xff0c;程序员思考的永远只有两件事&#xff01;中&#xff0c;通过代码命名、重复代码、合格方法三个章节&#…

PXE实验

实验前准备 关闭VMware的dhcp 点击 编辑 点击 虚拟网络编辑器 选择 NAT模式 将dhcp取消勾选 准备两台虚拟机 一台试验机&#xff0c;&#xff08;网络环境正常并且有图形化的界面的rhel7&#xff09; 一台测试机 init 5 --------------> 开启图形化界面 如…

《C/C++实战进阶》介绍

&#x1f680; 前言 本文是《C/C实战进阶》专栏的说明贴&#xff08;点击链接&#xff0c;跳转到专栏主页&#xff0c;欢迎订阅&#xff0c;持续更新…&#xff09;。 专栏介绍&#xff1a;以多年的开发实战为基础&#xff0c;总结并讲解一些的C/C基础与项目实战进阶内容&…

AI用Alice_split_toolset切割音频的采样率

AI用Alice_split_toolset切割音频的采样率 目录 AI用Alice_split_toolset切割音频的采样率 一、Sample rate采样率的概念 二、Alice_split_toolset切割音频的参数 2.1、字符串参数--input_folder输入文件夹路径 2.2、字符串参数--output_folder输出文件夹路径 2.3、字符串…