当前位置: 首页 > news >正文

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.

相关文章:

  • Humanoid-Gym 开源人形机器人端到端强化学习训练框架!星动纪元联合清华大学、上海期智研究院发布!
  • 产品推荐 - 基于6U VPX的双TMS320C6678+Xilinx FPGA K7 XC7K420T的图像信号处理板
  • ORACLE基于归档号增量恢复
  • windows关闭copilot预览版
  • 分布式定时任务调度xxl-job
  • ElevenLabs用AI为Sora文生视频模型配音 ,景联文科技提供高质量真人音频数据集助力生成逼真音效
  • HTML—常用标签
  • Rust 语言的 async 关键字
  • Linux系统——Haproxy高性能负载均衡软件
  • 初阶数据结构之---二叉树的顺序结构-堆
  • 网站被插入虚假恶意链接怎么办?
  • 微软AI工程师向联邦贸易委员会(FTC)发出警告,对Copilot Designer的安全性表示担忧
  • Java高频面试之消息队列与分布式篇
  • docker安装ES、LogStash、Kibana
  • 【C++】什么是类与对象?
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • CSS 提示工具(Tooltip)
  • CSS实用技巧干货
  • ES6--对象的扩展
  • hadoop集群管理系统搭建规划说明
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • magento 货币换算
  • Promise初体验
  • SpiderData 2019年2月13日 DApp数据排行榜
  • spring boot 整合mybatis 无法输出sql的问题
  • yii2权限控制rbac之rule详细讲解
  • 从零开始学习部署
  • 给初学者:JavaScript 中数组操作注意点
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 前嗅ForeSpider采集配置界面介绍
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 使用putty远程连接linux
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 微信开源mars源码分析1—上层samples分析
  • 译自由幺半群
  • #每天一道面试题# 什么是MySQL的回表查询
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (04)odoo视图操作
  • (7)STL算法之交换赋值
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (多级缓存)多级缓存
  • (六)c52学习之旅-独立按键
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (四) 虚拟摄像头vivi体验
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)ObjectiveC 深浅拷贝学习
  • (转)人的集合论——移山之道
  • .net/c# memcached 获取所有缓存键(keys)
  • :=
  • :如何用SQL脚本保存存储过程返回的结果集
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [<MySQL优化总结>]