ARM单片机中程序在ROM空间和RAM空间的分布(分散加载文件,Scatter-Loading Description File)

     对于 K e i l u V i s i o n I D E Keil\quad uVision\quad IDE KeiluVisionIDE,程序编译好之后,代码的下载位置( R O M ROM ROM空间)以及代码运行的时候使用的 R A M RAM RAM空间( R A M RAM RAM空间)默认在图1所示的红圈中的位置进行配置,但是这里的配置对于比较复杂的情况可能就不是太友好了,比如要配置从 S R A M SRAM SRAM启动(那么中断向量表就要放在地址 0 x 20000000 0x20000000 0x20000000开头的位置,图1所示的红圈中的配置大部分默认是从内部 F L A S H FLASH FLASH启动)。这时就可以利用分散加载文件来代替图1中红圈中的配置。如果要使用分散加载文件来代替图1中红圈中的配置的话需要将图2中红圈处的勾选取消并且蓝色圈的位置是分散加载文件的目录。

图1.
图2.

     和图1中红圈中的配置相同的分散加载文件如下所示:

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************LR_IROM1 0x08000000 0x00080000  {    ; load region size_regionER_IROM1 0x08000000 0x00080000  {  ; load address = execution address*.o (RESET, +First)*(InRoot$$Sections).ANY (+RO).ANY (+XO)}RW_IRAM1 0x20000000 0x00010000  {  ; RW data.ANY (+RW +ZI)}
}

     需要注意的是我这里不会详细的去讲解分散加载文件,对于这部分的内容我也没有详细的看,因为这部分内容似乎还挺多的,需要详细了解的可以去看一下图3的 A R M ARM ARM的官方文档。我这里只是记录一下我常用的几种配置。

图3.

     这里弄了一个简单且常见的例子(基于 S T M 32 F 103 Z E T 6 STM32F103ZET6 STM32F103ZET6芯片,片上 F L A S H FLASH FLASH为512 K B KB KB S R A M SRAM SRAM为64 K B KB KB),这里图4中的配置是基于从 S R A M SRAM SRAM启动的。这里只是简单的将中断向量表放在 S R A M SRAM SRAM区域从地址 0 x 20000000 0x20000000 0x20000000开头的 2 K B 2KB 2KB的区域, t e s t . c test.c test.c放在 S R A M SRAM SRAM区域从地址 0 x 20000800 0x20000800 0x20000800区域开头的 2 K B 2KB 2KB的区域,然后其它的代码都放在片上 F L A S H FLASH FLASH从地址 0 x 80000000 0x80000000 0x80000000开始的区域。

图4.

     这里程序编译完之后会生成3个 b i n bin bin文件,如图5和图6所示所示,这3个 b i n bin bin文件和图4中3个 l o a d r e g i o n load\quad region loadregion对应,这里生成 b i n bin bin文件的命令如图7所示。

fromelf --bin --output=..\bin\sct.bin  ..\obj\sct.axf
图5.
图6.
图7.

     这里还需要注意的是既然有三个 b i n bin bin文件,那可能就需要三部分的下载算法配置和这三个 b i n bin bin文件相对应(其实 b i n bin bin文件 E R _ I R O M 2 ER\_IROM2 ER_IROM2 b i n bin bin文件 E R _ I R O M 3 ER\_IROM3 ER_IROM3的地址区域是连续的,因此只用一个部分的下载算法配置也是可以了),如图8所示。如果有针对 S R A M SRAM SRAM区域的下载算法的话, b i n bin bin文件 E R _ I R O M 2 ER\_IROM2 ER_IROM2 b i n bin bin文件 E R _ I R O M 3 ER\_IROM3 ER_IROM3应该用针对 S R A M SRAM SRAM区域的下载算法。还有就是这里地址区域从 0 x 20000000 0x20000000 0x20000000 0 x 20000 F F F 0x20000FFF 0x20000FFF已经被 b i n bin bin文件 E R _ I R O M 2 ER\_IROM2 ER_IROM2 b i n bin bin文件 E R _ I R O M 3 ER\_IROM3 ER_IROM3占用了,因此提供给程序运行的 R A M RAM RAM区域以及下载算法用到的 R A M RAM RAM区域都不能用到这块区域,因此图8中 R A M f o r A l g o r i t h m RAM\quad for\quad Algorithm RAMforAlgorithm的配置以及图4中提供给程序运行的 R A M RAM RAM区域的配置都是从地址 0 x 20001000 0x20001000 0x20001000开始。

图8.

     假设现在存储空间的分布按照图9的配置,则还有方法来指定变量或函数存储在指定的地址开始的存储空间,如图10和图11所示。图10将数组 g l o b a l _ a r r a y global\_array global_array放在从地址 0 x 20001000 0x20001000 0x20001000开始的存储空间,将数组 g l o b a l _ a r r a y _ e x t r a global\_array\_extra global_array_extra放在从地址 0 x 20009000 0x20009000 0x20009000开始的存储空间,但是从图9可以看出,这里配置的不论是 R O M ROM ROM区域还是 R A M RAM RAM区域都没有包含地址 0 x 20009000 0x20009000 0x20009000开始的存储空间,因此这里会对数组 g l o b a l _ a r r a y _ e x t r a global\_array\_extra global_array_extra专门生成一个 B I N BIN BIN文件,如图12所示,如果图8中下载算法的配置的 A d d r e s s R a n g e Address\quad Range AddressRange覆盖了地址 0 x 20009000 0x20009000 0x20009000开始的存储空间,则下载算法还是会把数组 g l o b a l _ a r r a y _ e x t r a global\_array\_extra global_array_extra下载到地址 0 x 20009000 0x20009000 0x20009000开始的存储空间里面去,否则会报算法缺失的错误。

图9.
图10.
图11.
图12.

     我们再来看一个例子,假设此时存储器的配置按照图1的配置,第一种情况如图13所示,这种情况我们在这里已经讲过了,这里数组 g l o b a l _ a r r a y global\_array global_array会被编译器自动分配到 S R A M SRAM SRAM区域(地址 0 x 20000000 0x20000000 0x20000000开始),属于全局区,打印出来的地址值也确实是在 S R A M SRAM SRAM区域。

图13.

     假设此时存储器的配置按照图1的配置,第2种情况如图14所示,这时数组 g l o b a l _ a r r a y global\_array global_array被指定存放到片上 F L A S H FLASH FLASH区域(地址 0 x 08001000 0x08001000 0x08001000开始),打印出来的地址值也确实是在 F L A S H FLASH FLASH区域。在上一种情况中,数组 g l o b a l _ a r r a y global\_array global_array在程序运行中是可读可写的,但是这里数组 g l o b a l _ a r r a y global\_array global_array在程序运行中就变成只读的了,这一点需要注意。因为此时数组 g l o b a l _ a r r a y global\_array global_array被放到了片上 F L A S H FLASH FLASH区域,而片上 F L A S H FLASH FLASH区域是不能随机写的,必须先擦除才能写。

图14.

     最后再提一下利用图15和图16的配置也可以把 t e s t _ s c t test\_sct test_sct函数放到从地址 0 x 20000800 0x20000800 0x20000800开头的 2 K B 2KB 2KB的区域。

图15.
图16.

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

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

相关文章

下载一些ROS的包的方式

ROS Index 我们可以去ROS Index网站下载一些我们需要的包。打开浏览器在网址框输入index.ros.org。或者点击此处链接ROS Index 在这个网站中我们可以浏览并找到我们需要的包,也可以下载它的源代码或者仅安装到我们的系统中来使用。(安装过程在终端中进行…

植物病虫害:YOLO水稻虫害识别数据集(6类,五千余张图像,标注完整)

YOLO水稻虫害识别数据集,包含褐飞虱,绿叶蝉,正常叶片,稻虫,二化螟,蝇蛆6个类别,共五千余张图像,yolo标注完整。 适用于CV项目,毕设,科研,实验等 …

零、自然语言处理开篇

目录 0、NLP任务的基础——符号向量化 0.0 词袋模型 0.1 查表/One-hot编码 0.2 词嵌入模型/预训练模型 0.2.0 Word2Vec (0)CBOW (1)Skip-gram 0.2.1 GloVe 0.2.2 WordPiece 0.2.3 BERT 0.2.4 ERNIE NLP自然语言处理&am…

Java 的 System 类常用方法介绍

Java 中的 System 类是一个final类,它提供了与系统相关的属性和方法。它是一个内置的类,可以直接使用,不需要实例化。System 类提供了标准输入、标准输出和错误输出流,以及对外部定义的属性和系统环境的访问。下面是 System 类的一…

LCR 132. 砍竹子 II

解题思路&#xff1a; 由于数量级较大&#xff0c;需要使用long以及快速幂求余 下图便于理解快速幂求余 class Solution {public int cuttingBamboo(int bamboo_len) {if(bamboo_len < 3) return bamboo_len - 1;int b bamboo_len % 3, p 1000000007;long rem 1, x 3;f…

【PHP+代码审计】PHP基础——数据类型

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

012集——显示高考天数倒计时——vba实现

以下代码实现高考倒计时&#xff1a; Sub 高考倒计时() 高考日期 CDate("06,07," & Year(Date)) If Date > 高考日期 Then高考日期 CDate("06-07-" & Year(Date) 1) End If 年月日 Year(Date) & "年" & Month(Date) &am…

Springboot+vue的项目申报管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的项目申报管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09…

低密度奇偶校验码LDPC(九)——QC-LDPC译码器FPGA全并行设计

往期博文 低密度奇偶校验码LDPC&#xff08;一&#xff09;——概述_什么是gallager构造-CSDN博客 低密度奇偶校验码LDPC&#xff08;二&#xff09;——LDPC编码方法-CSDN博客 低密度奇偶校验码LDPC&#xff08;三&#xff09;——QC-LDPC码概述-CSDN博客 低密度奇偶校验码…

蓝牙系列七:开源蓝牙协议栈BTStack数据处理

继续蓝牙系列的研究。 在上篇博客,通过阅读BTStack的源码,大体了解了其框架,对于任何一个BTStack的应用程序都有一个main函数,这个main函数是统一的。这个main函数做了某些初始化之后,最终会调用到应用程序提供的btstack_main,在btstack_main里面首先做一些初始化,然后…

C语言指针——常量字符串和 变量字符串

常量字符串和 变量字符串 常量字符串和变量字符串是在编程中常见的两种字符串类型&#xff0c;它们有以下区别&#xff1a; 值的不可变性&#xff1a;常量字符串的值是不可变的&#xff0c;一旦被定义&#xff0c;就不能修改。而变量字符串的值是可变的&#xff0c;可以随时修…

重建大师6.2版本的建模效果出现下图中模糊的情况,是什么原因?

可能是因为坐标原点设置的不对&#xff0c;图例中的三角网都出现了精度损失的问题。 坐标原点设置的具体操作&#xff1a;提交产品后&#xff0c;在弹出的界面&#xff0c;可以设定坐标原点。 重建大师是一款专为超大规模实景三维数据生产而设计的集群并行处理软件&#xff0…

C语言之练手题

题目1&#xff1a; 思路&#xff1a;我们定义两个变量left和right分别为数组的左端下标和右端下标。 左端下标的元素为奇数时&#xff0c;left继续往前走&#xff0c;为偶数时就停下 右端下标的元素为偶数时&#xff0c;right- -往回走&#xff0c;为奇数时停下 停下后对应的元…

(3)应用与信息

文章目录 前言 3.1 FlightDeck FrSky发射器应用程序 3.2 MAVLink2数据包签名(安全) 3.3 MAVLink高延迟协议 3.4 无线地面站连接中继器 1 概述 2 组件 3 设置 3.5 遥测无线电区域条例 3.6 用于OpenTX的Yaapu遥测脚本 前言 FlightDeck FrSky Transmitter AppMAVLink2 …

Xmind拿来主义快速高效,Xmind思维导图模板合集

一、素材描述 本套Xmind模板&#xff0c;大小153.57M&#xff0c;共有310个文件。 二、素材目录 01-学习模版&#xff08;46套模板&#xff09; 02-知识结构&#xff08;88套模板&#xff09; 03-生活计划&#xff08;26套模板&#xff09; 04-商务模版&#xff08;44套模…

就业班 2401--3.8 Linux Day14--阿帕奇+LNMP(编译安装)

一、WEB服务器 ^世上最重要的事&#xff0c;不在于我们在何处&#xff0c;而在于我们朝着什么方向走。^ 1、WEB服务简介 # 目前最主流的三个Web服务器是Apache、Nginx、 IIS。 - WEB服务器一般指网站服务器&#xff0c;可以向浏览器等Web客户端提供网站的访问&#xff0c;让全…

20-Java备忘录模式 ( Memento Pattern )

Java备忘录模式 摘要实现范例 备忘录模式&#xff08;Memento Pattern&#xff09;保存一个对象的某个状态&#xff0c;以便在适当的时候恢复对象 备忘录模式属于行为型模式 摘要 1. 意图 在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对…

JVM 的垃圾回收机制以及垃圾回收算法的详解

目录 1、JVM 的垃圾回收机制 2、识别垃圾 2.1、引用计数 2.2、可达性分析 3、垃圾回收算法 3.1、标记-清除 3.2、复制算法 3.3、标记-整理 4、分代回收 1、JVM 的垃圾回收机制 对于&#xfeff;程序计数器&#xfeff;、&#xfeff;虚拟机栈&#xfeff;、&#xfe…

CSS顶部与JS后写:网页渲染的奥秘

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【Qt】不透明指针(Opaque Pointer)在Qt源码中的应用

目录 什么是不透明指针&#xff08;Opaque Pointer&#xff09;不透明指针在Qt代码中的应用Qt中与不透明指针相关的一些宏 什么是不透明指针&#xff08;Opaque Pointer&#xff09; GeeksforGeeks中给的定义如下&#xff1a; An opaque pointer is a pointer that points to …