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 类的一…

python web开发-基于Flask+LeanCloud小店定时任务

在Python Web开发中,使用Flask框架进行Web应用的构建是非常常见的选择。同时,为了处理数据存储和提供云服务,LeanCloud作为一个BaaS(Backend as a Service)提供商,为开发者提供了丰富的功能。 要实现一个基…

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…

网站SE分析-主机IP

在网站SEO优化中&#xff0c;主机IP的选择和优化是一个至关重要的环节。本文将深入探讨主机IP对SEO的影响&#xff0c;并提出相应的优化策略。 物理位置与目标受众 主机的物理位置对网站的访问速度和用户体验有直接影响。因此&#xff0c;在选择主机时&#xff0c;应考虑目标…

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…

【Python】FTP库的介绍及用法

目录 1、应用场景 2、FTP-标准库 1、应用场景 FTP库&#xff08;ftplib&#xff09;在Python中的应用场景主要包括&#xff1a; 文件上传和下载&#xff1a; 通过FTP服务器&#xff0c;可以提供用于上传和下载文件的功能。这在需要在服务器和客户端之间共享数据的情况下非常…

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 …

太平医康养经理人是医疗资源的链接者

太平人寿通过构建资源整合平台&#xff0c;已成功将国际化医疗服务资源进行深度整合。目前&#xff0c;该公司已完成对英国著名医疗集团Circle Health在中国设立的首家医疗机构——圆和医疗的增资行动&#xff0c;并与新加坡知名的莱佛士私立综合医疗集团签订了业务合作协议。同…

js 中 callee 与 caller 的作用

1.caller 返回一个调用当前函数的引用 如果是由顶层调用的话 则返回 null &#xff08;举个栗子哈 caller 给你打电话的人 谁给你打电话了 谁调用了你 很显然是下面 a 函数的执行 只有在打电话的时候你才能知道打电话的人是谁 所以对于函数来说 只有 caller 在函数执行的时候才…

探索C++语言宝库:解锁基础知识与实用技能(类型变量+条件循环+函数模块+OOP+异常处理)

目录 [TOC](目录)一、C的基础知识1. 数据类型与变量2. 条件与循环3. 函数与模块 二、C的实用技能1. 面向对象编程&#xff08;OOP&#xff09;2. 标准模板库&#xff08;STL&#xff09;3. 异常处理 三、C的重要性与应用场景结语 欢迎阅读本篇博客&#xff0c;我们将深入探讨C语…