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

news2024/11/16 10:31:47

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

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

相关文章

JavaWeb中的前端工程化

本笔记基于【尚硅谷全新JavaWeb教程,企业主流javaweb技术栈】https://www.bilibili.com/video/BV1UN411x7xe?vd_sourcea91dafe0f846ad7bd19625e392cf76d8总结 第七章 前端工程化 一、前端工程化开篇 1.1 什么是前端工程化 前端工程化是使用软件工程的方法来单独…

借用BI系统又快又灵活地完成财务数据分析

和其他BI软件相比,奥威BI软件在财务分析上的表现十分突出,不仅能快速对接金蝶ERP,完成科目多变的财务指标计算分析,把复杂财务数据变得通俗易懂,还支持自助分析。从奥威BI软件的表现上看,说它是一款BI财务分…

[MIT6.5840]Lab3A leader election

文章目录 Part 3A: leader election大致框架详细过程数据结构初始化选举计时器选举过程心跳机制 LeaderRPC其他函数 测试结果完整代码 Part 3A: leader election 实验地址 https://pdos.csail.mit.edu/6.824/labs/lab-raft.html 论文地址 https://pdos.csail.mit.edu/6.824/pa…

【乐吾乐2D可视化组态编辑器】后端API接口文档

后端API接口文档 乐吾乐2D可视化组态编辑器demo:https://2d.le5le.com/ 采用前后端分离架构,乐吾乐后端服务提供一整套完整的web组态编辑器的所有数据接口,包含2D/3D图纸接口服务、文件接口服务和用户接口服务等,安装包版本提…

Linux 文件系统、动静态库

个人主页:仍有未知等待探索-CSDN博客 专题分栏: Linux 目录 一、文件系统 1、了解磁盘的存储结构 1.基本知识 2.磁盘中盘片为什么高速旋转? 3.磁头为什么要左右摇摆? 4.如何找到一个指定位置的扇区? 5.文件在磁盘…

英语口语成人英语生活英语口语表达四六级英语培训柯桥小语种学习

全红婵向外国人展示金牌夺冠后,全红婵向外国友人展示金牌。视频中,一位外国男子对全红婵说:“How are you?”全红婵回应:“Good!Good!全红婵比出“拿捏”手势对方说全红婵是奥运冠军&#xff0c…

使用es-hadoop同步hive和es之间数据

💻近期在华为云连接es时的时候发现不能输入账号密码,后面联系华为工程师了解到,华为云默认是非安全模式,即不需要输入账号密码。 如果对你有所帮助,欢迎点赞收藏关注不迷路哦💓 目录 使用es-hadoop同步h…

CentOS7.6 服务器负载均衡——LVS-DR实战案例

目录 1、前期环境准备 1.准备两台主机 1. 设置主机名 2. 设置IP地址然后重启网卡 3. 关闭防火墙和selinux 二、配置LVS服务器 1. LVS准备VIP和路由 2. 设置路由转发 3. LVS设置负载均衡条目/规则 1. 设置IPVSADM 4. LVS让配置永久生效: 三、设置WEB集群 …

spring操作数据库

xml版 程序结构 配置文件 dbUtil-阿帕奇提供操作数据库的插件 核心类&#xff1a;QueryRunner .query() 查询 .update() 增删改 <dependencies><!-- spring --><dependency><groupId>org.springframework</groupId><artifactId>spri…

【Unity编辑器】EditorWindow的使用

文章目录 前言创建一个Editor窗口Unity引擎目前中焦的窗口Editor窗口鼠标悬停Editor窗口场景编辑更改监听主窗口停靠下最大化窗口设置窗口的小图标获取中焦窗口Window.ShowNotificationWindow.SendEventEditorWindow.OnHierarchyChange()EditorWindow.OnProjectChange() 前言 …

谷歌搜索垄断案:历史是否会重演微软的宿命?

美国法官在本周一作出裁决&#xff0c;确认Google在搜索市场拥有垄断地位&#xff0c;并援引了二十多年前的微软案作为参考。卡多佐法学院的法学教授Sam Weinstein&#xff0c;也曾是司法部反垄断律师&#xff0c;他指出政府始终在明示或暗示地将本案建立在微软案的基础上。面对…

Unity效果优化之抗锯齿

Unityde 基于HDRP渲染管线的抗锯齿处理的设置参考图&#xff1a; 前提&#xff1a;需要导入HDRP的插件包才行&#xff0c; 该参数设置能保证在PC版上抗锯齿效果非常好&#xff0c; 英文版&#xff1a;

《向量数据库指南》——向量搜索:从简单到复杂,生产级部署的挑战与策略

向量搜索并非轻而易举! 向量搜索,也称为向量相似性搜索或最近邻搜索,是一种常见于 RAG 应用和信息检索系统中的数据检索技术,用于查找与给定查询向量相似或密切相关的数据。业内通常会宣传该技术在处理大型数据集时非常直观且简单易用。一般来说,您只需将数据输入到 Embed…

k8s—Prometheus+Grafana+Altermaneger构建监控平台

目录 一、安装node-exporter 1.下载所需镜像 2.编写node-export.yaml文件并应用 3.测试node-exporter并获取数据 二、Prometheus server安装和配置 1.创建sa(serviceaccount)账号&#xff0c;对sa做rabc授权 1&#xff09;创建一个 sa 账号 monitor 2&#xff09;把 sa …

C++ | Leetcode C++题解之第330题按要求补齐数组

题目&#xff1a; 题解&#xff1a; class Solution { public:int minPatches(vector<int>& nums, int n) {int patches 0;long long x 1;int length nums.size(), index 0;while (x < n) {if (index < length && nums[index] < x) {x nums[i…

系统时间的获取 | 文件操作相关函数 |报错函数 | makefile

系统uid/gid的获取 1.getpwuid 功能:根据用户id到/etc/passwd文件下解析获得结构体信息 参数:uid:用户id 返回值:成功返回id对应用户的信息 ;失败返回NULL 2.getgrgid 功能:根据gid到/etc/group文件中解析组信息 参数:gid:组id 返回值:成功返回组信息;失败返回NULL 系统时间的…

【新械专栏】球囊型冷冻消融导管获批上市

近日&#xff0c;国家药品监督管理局批准了上海安钛克医疗科技有限公司“球囊型冷冻消融导管”创新产品注册申请。 该产品由球囊型冷冻消融导管、手动回缩器组成&#xff0c;与特定冷冻消融仪联合使用&#xff0c;用于治疗成人患者药物难治性、复发性、症状性的阵发性房颤。 该…

Python中的 `break` 语句:掌握循环控制的艺术

Python中的 break 语句&#xff1a;掌握循环控制的艺术 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕…

Go语言内存管理:从理论到实战

1. 引言 1.1 内存管理的重要性 内存管理是编程中的一个重要环节&#xff0c;它涉及到内存的分配与释放&#xff0c;对于程序的性能和稳定性有着至关重要的影响。不当的内存管理会导致内存泄漏、内存溢出等问题&#xff0c;从而影响程序的正常运行。特别是在大型项目中&#xf…

ttwid、x-bogus、a-bogus、msToken、byted_acrawler等直播参数说明和获取方式

可以参考开源项目&#xff1a;https://github.com/Sjj1024/douyin-live 桌面端的直播间项目&#xff1a;https://github.com/Sjj1024/LiveBox ttwid参数 ttwid类似客户端id&#xff0c;即便是游客模式&#xff0c;也可以对页面数据进行埋点统计&#xff0c;通过收集ttwid下的…