mdk下栈地址相关的知识梳理

news2024/11/17 19:41:56

mdk中,堆栈地址范围不像在gcc工程中那么容易看出来。过程被mdk隐藏了,单纯从代码层面不好看出来。但是基本的流程是这样的:先确定代码其他部分使用RAM的情况,然后紧跟着已使用的RAM地址,在剩下的RAM地址中分配Stack_Size大小来作为栈的范围使用(Stack_Size在启动文件中定义)。

1.启动文件中堆栈范围的指定

在这里插入图片描述
__initial_sp 这个参数是栈顶地址,因为栈的增长是向下增长,所以这个参数就是栈顶,我设置的栈尺寸是0x400,所以栈的地址范围是 __initial_sp ~ (__initial_sp - 0x400),__initial_sp 这个参数是keil编译代码之后计算出来的,有多种方法确定。

2.确定__initial_sp数值

2.1.方法:1:通过map文件

编译代码,编译完成之后,双击工程名打开map的文件,在里面搜索__initial_sp,即可看到__initial_sp的值:
在这里插入图片描述

2.2.方法2:mdk仿真查看内存空间

Debug执行代码,然后查看运行地址最开始的四个字节的数据:
在这里插入图片描述

2.3.方法3:根据RW-data + ZI-data

在这里插入图片描述
因为SRAM的基地址是0x20000000,加上基址,就是0x200007B0,结果和上面一致。

3.自定义栈顶地址__initial_sp

3.1.方法1:直接修改启动文件

Stack_Size    EQU    0x00000400

;ADDR_STACK_TOP    EQU    0x20020000
; 0x2001FC00 = ADDR_STACK_TOP - Stack_Size

             AREA |.ARM.__AT_0x2001FC00|, DATA, NOINIT, READWRITE, ALIGN=3
Stack_Mem    SPACE    Stack_Size
__initial_sp

其中ARM.__AT_0x2001FC00指定了栈区域的启始地址为:0x2001FC00,则__initial_sp的值为:0x2001FC00 + 0x00000400 = 0x20020000。

3.2.方法2:通过.sct文件

  • 1.设置.sct文件:
;*************************************************************
; *** Scatter-Loading Description Filegenerated by uVision ***
; *************************************************************
 
LR_IROM1 0x08000000 0x00020000  {      ; load region size_region
 
  ER_IROM1 0x08000000 0x00020000 {        ; load address = executionaddress
      *.o (RESET, +First)
      *(InRoot$$Sections)
      .ANY (+RO)
  }
 
  RW_IRAM1 0x20000000 0x00005000 {         ; RW data
      .ANY (+RW +ZI)
  }
 
  RW_IRAM2 0x20004800 UNINIT 0x00000800 {  ; STACK ADDRESS
      startup_stm32f10x_md.o (STACK)
  }
 
  RW_IRAM3 0x20004600 UNINIT 0x00000200 {  ; HEAP ADDRESS
      startup_stm32f10x_md.o (HEAP)
  }
 
}

其中:
RW_IRAM2 0x20004800 UNINIT 0x00000800 //设置栈起始地址为0x20004800,栈大小为0x00000800

RW_IRAM3 0x20004600 UNINIT 0x00000200 //设置堆起始地址为0x20004600,堆大小为0x00000200

如图:
在这里插入图片描述

  • 2.在启动文件中设置堆栈大小
    在这里插入图片描述
    此处设置的堆栈大小要与第一步一致,否则将会以这次设置的大小为准,第一步设置的堆栈大小将失效。

  • 3.设置存储区分配地址方式;

    如下图所示设置,Scatter file选择第一步设置好的.sct文件:
    在这里插入图片描述

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

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

相关文章

电商数据分析方案和BI强强联合,一站式做分析

搭建一个电商大数据分析平台需要哪些条件?总的来说需要一套满足电商数据分析需求的方案,一个能够提供强大数据计算分析功能和数据可视化图表的平台,比如电商数据分析方案和奥威BI软件这样的组合。 电商数据分析方案BI软件,一站式…

提前出击:如何在故障降临之前解决设备问题?

在现代工业生产中,设备故障和停机时间对企业来说是极具挑战性和成本高昂的问题。为了解决这一问题,预测性维护作为一种先进的维护策略应运而生。本文将探讨预测性维护的概念以及如何通过它在设备故障之前解决问题。 预测性维护是一种基于设备运行数据和分…

111.实战网页建立移动导航

本节课我们建立一个移动导航&#xff0c;如下图所示 首先添加这个button <button class"btn-mobile-nav"><ion-icon class"icon-mobile-nav" name"menu-outline"></ion-icon><ion-icon class"icon-mobile-nav"…

SpringBoot 使用 EmbeddedDatabaseBuilder 进行数据库集成测试

SpringBoot 使用 EmbeddedDatabaseBuilder 进行数据库集成测试 在 SpringBoot 应用程序中&#xff0c;我们可以使用 EmbeddedDatabaseBuilder 进行数据库集成测试。EmbeddedDatabaseBuilder 是一个测试工具&#xff0c;可以让我们在内存中启动嵌入式数据库&#xff0c;并进行测…

PHY芯片的使用(二)使用Vivado SDK调试网络

在使用ZYNQ或者FMQL的以太网时都需要在Vivado BD中勾选Enet0/1,最好也勾选上UART0/1。 如果就使用这两个外设就可是直接生成bit然后导出硬件启动SDK了。 SDK建立工程中有以太网相关的工程&#xff0c;选用最简单的即可如下图。使用这个工程除了选Enet还要选用串口&#xff0c;…

【C】C语言实现三子棋小游戏

这里写目录标题 游戏的整体框架游戏函数的具体实现&#xff08;这里的函数声明都放到game.h中&#xff0c;函数的实现在game.c中&#xff09;初始化棋盘函数玩家下棋电脑下棋判断输赢判断棋盘是否满了 游戏的逻辑及game()的实现game.hgame.ctest.c 今天带大家用C语言来实现我们…

C语言进阶教程(再论指针和数组3)

文章目录 前言一、a和&a的区别二、数组作为函数参数总结 前言 本篇文章继续讲解指针和数组。 一、a和&a的区别 1.数组名&#xff08;例如 a&#xff09;表示整个数组。当使用数组名时&#xff0c;它会被解释为对整个数组的引用。例如&#xff0c;可以使用 a[0] 来访…

Cadence Allegro PCB设计88问解析(二十九) 之 Allegro中泪滴的使用

一个学习信号完整性仿真的layout工程师 通常添加泪滴的目的是&#xff1a;在一些接插器件或者大焊盘的时候&#xff0c;增强信号线与焊盘之间的连接强度&#xff0c;提高可靠性&#xff1b;二是为了保持高速信号的阻抗连续性&#xff0c;防止阻抗突变等&#xff0c;造成信号完整…

2023年杭州/广州/深圳NPDP产品经理认证线上班报名

产品经理国际资格认证NPDP是新产品开发方面的认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会&#xff08;PDMA&#xff09;成立于1979年&#xff0c;是…

【数据存储概念】大端存储小端存储

这里写目录标题 大小端介绍大端小端存储的特征如何判断大小端 大小端介绍 本文采用整形来举列子说明大端存储和小端存储的区别及原理 特别注意&#xff1a;大小端模式是指字节序的大小端模式&#xff0c;当一个数据的所占的内存大于一个字节时&#xff0c;就会按照大端或小端…

vscode配置eigen3

目录 1. 头文件包含 2. c_cpp_properties.json 3. CMakeList.txt 4. 完整代码 1. 头文件包含 // Eigen 核心部分 #include <Eigen/Core> // 稠密矩阵的代数运算&#xff08;逆&#xff0c;特征值等&#xff09; #include <Eigen/Dense> 2. c_cpp_properties.…

Linux部署: (根据进程号自动关闭jar程序)或jenkins自动化部署

目录 1. 简单部署方式 1.1 在项目部署位置 1.2 上传需要启动的jar包 复制包名 ps: 注意: 打包时候需添加build依赖 1.3 特别注意一下jar包需要添加的配置和依赖 1.4 根据此jar包名字进行编写shell脚本(启动) 1.5 编写shell脚本关闭(通过进程号关闭) 1.6 vim shutdown…

基于Python+Dlib+OpenCV个人换脸应用智能实现(深度学习+机器视觉)含全部工程源码及视频演示(仅供个人学习,请勿商用)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境相关库包安装 模块实现1. 准备数据2. 提取面部标记3. 调整脸部对齐4. 混合图像5. 校正颜色6. 转换函数7. 交互式界面设计 系统测试工程源代码下载其它资料下载 前言 本项目利用Dlib提供的机器学习、数值计算、图…

Linux远程管理工具

在使用远程管理工具之前&#xff0c;应先设置宿主机 Windows 与虚拟机 Linux 能够连通。这里要注意 VMware 的网卡设置&#xff0c;Linux 中更改网络设置可以使用 ifconfig 和 setup 命令&#xff0c;若还是无法进行远程连接&#xff0c;要么就是 SSH 服务没有启动&#xff0c;…

Vlan(Access、Trunk、Hybrid)与ARP(免费ARP)讲解

目录 Vlan讲解 Vlan标签 二层接口类型 ARP ARP的作用 ARP地址解析报文讲解 免费ARP报文讲解 ARP缓存表 Vlan讲解 Vlan&#xff08;Virtual Local Area Network&#xff09;虚拟局域网&#xff0c;将一个物理的LAN在逻辑上划分为多个广播域&#xff1b;可以理解为一个V…

【MySql】MySql视图

文章目录 视图概念基本使用创建视图修改视图对基表有影响修改基表对视图有影响删除视图 视图规则和限制OJ题目 视图概念 视图就是一张虚拟表&#xff0c;其内容由查询定义。与真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化影响到基表&#xff0…

[Web程序设计]实验: 开发工具使用

一、实验目的 &#xff08;1&#xff09;掌握web应用运行所必须的服务端软件使用。 &#xff08;2&#xff09;掌握web应用开发所必须的开发工具使用。 二、实验内容 Tomcat的安装及使用&#xff1b;使用idea开发一个简单的web应用。 三、实验要求 &#xff08;1&#xf…

baichuan-7B的测试教程

1.百川模型介绍 baichuan-7B不仅在C-Eval、AGIEval和Gaokao中文权威评测榜单上,以显著优势全面超过了ChatGLM-6B等其他大模型,并且在MMLU英文权威评测榜单上,大幅领先LLaMA-7B。baichuan-7B是由百川智能开发的一个开源的大规模预训练模型。基于Transformer结构,在大约1.2万…

【Linux】详解进程控制 ( fork函数 | 写时拷贝 | 进程退出 | 进程等待 )

fork函数fork函数初识fork返回值问题fork常规用法 写时拷贝进程退出进程退出码进程退出场景进程如何退出 进程等待僵尸进程进程等待的方法 fork函数 fork函数初识 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而…

第42步 深度学习图像识别:Mobilenet建模(Tensorflow)

基于WIN10的64位系统演示 一、写在前面 &#xff08;1&#xff09;Mobilenet MobileNet是谷歌研究团队于2017年发布的一种轻量级的深度学习网络架构。这种架构特别适用于移动设备和嵌入式设备上&#xff0c;因为它的模型体积小&#xff0c;计算量少&#xff0c;但又能保持相…