[Cortex-M3]-3-分散加载文件解析(.sct)

news2024/9/19 19:42:11

目录

1 分散加载文件.sct      

2 如何生成.sct文件

3 *(InRoot$$Sections) 说明

4 如何修改分散加载文件

5 已经初始化变量的初值,存储位置

6 +RW +ZI和+RO如何执行


1 分散加载文件.sct      

        MDK的分散加载主要是通过.sct文件实现的,链接器根据.sct文件的配置分配各个节区地址,生成分散加载代码,因此通过修改该文件可以定制具体节区的存储位置

        那为什么需要分散加载文件呢?不用可以吗?

        一般情况下,可以不独自编写分散加载文件,ARM链接器直接按照默认的方式来生成映像文件即可,但是在某些场合,希望将某些数据放在指定的位置,此时分散加载文件就发挥了非常发的作用。比如在下面几种情况:

  1. 复杂内存映射:如果必须将代码和数据放在多个不同的内存区域中,则需要使用详细指令指定将哪些数据放在哪个内存空间中。
  2. 不同类型的内存:许多系统都包含多种不同的物理内存设备,如闪存、 ROM、 SDRAM 和快速 SRAM。分散加载描述可以将代码和数据与最适合的内存类型相匹配。例如,可以将中断代码放在快速 SRAM 中以缩短中断等待时间,而将不经常使用的配置信息放在较慢的闪存中。
  3. 位于固定位置的函数:可以将函数放在内存中的固定位置,即使已修改并重新编译周围的应用程序。
  4. 使用符号标识堆和堆栈:链接应用程序时,可以为堆和堆栈位置定义一些符号。         

2 如何生成.sct文件

        在Options->Targets->Linker界面下面去掉默认选项,然后edit... 就可以在编辑界面中看到.sct文件了。

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00020000  {    
	//定义一个加载域,域地址0x08000000,域大小为0x00020000
    //load region size_region 所有代码需要下载到0x08000000 开始的区域中,且这个区域大小只有0x00010000 
  ER_IROM1 0x08000000 0x00020000  {  
	//load address = execution address 第一个运行时域必须和加载域起始地址相同,其大小一般也相同
    //只能是只读的代码段和只读数据段
   *.o (RESET, +First)        //启动代码的首次执行地址,RO执行域名称为ER_IROM1, 
    //将 RESET 段最先加载到本域的起始地址外
    //首次执行的地址为RESET标号所表示的地址,RESET 存储的是向量表
    //对应启动文件中的AREA    RESET, CODE, READONLY
   *(InRoot$$Sections)     
    //稍后文件中会单独讲到
   .ANY (+RO)
    //加载所有匹配目标文件的只读属性数据,包含:Code、 RW-Code、 RO-Data。
  }
  RW_IRAM1 0x20000000 0x00005000  {  
    //再定义一个运行时域,域基址0x20000000 
	//RW data 执行域是以0x20000000 开始的长度为0x00004000  一段区域
   .ANY (+RW +ZI)    //其中包括的是哪些文件
  }
}

3 *(InRoot$$Sections) 说明

        .sct本身并不能对映像实现“解压缩”,编译器读入.sct文件之后,会根据其中的各种地址生成启动代码,实现对映像的加载,而这一段代码就是*(InRoot$$Sections)它是__main()的一部分。这就是在汇编启动代码的最后跳转到__main()而不是跳向main()的原因之一。

        起始地址与加载域重合的执行域称为root region,*(InRootSections)必须放在这个执行域中,否则链接的时候会报错。

4 如何修改分散加载文件

如果需要修改分散加载文件,并使其生效可以通过以下步骤操作进行:

  1. 修改Options->Targets->Target 的onchip 的rom或者ram,容量地址必须和选择的芯片一致
  2. 修改某个文件的存储属性,在工程窗口中右击文件名字 Options for file ,然后出现窗口可以修改文件的存储属性
  3. 修改完,重新编译,点开.sct文件就可以看到.sct已经被修改了,然后可以看map文件可以看到相关变量函数地址信息已经改变。

5 已经初始化变量的初值,存储位置

        int tick = 20;        会放在哪里呢?

编译完成 

已经初始化的变量,是被放入RW属性的输入节中,而这些变量的初值,是被放入ROM/Flash中的。

        那这些初值是谁在何时将它们恢复到RAM中的?

        ZI属性输入节中的变量所在RAM又是谁在何时给用零初始化的呢?

接下来继续下一个章节来继续梳理《7 +RW +ZI和+RO如何执行》

6 +RW +ZI和+RO如何执行

  1.  硬件复位后,第一步是执行复位处理程序,程序的入口在启动代码里(启动代码里面讲过);
  2.  初始化堆栈指针、执行完用户定义的底层初始化代码(SystemInit函数)后,接下来的代码调用了__main函数;
  3. __main函数会调用一些列的C库函数,完成代码和数据的复制、解压缩以及ZI数据的零初始化,数据的解压缩和复制,其中就包括将储存在ROM/Flash中的已初始化变量的初值复制到相应的RAM中去。(解释了上一章节的问题:那这些初值是谁在何时将它们恢复到RAM中的?
  4. 对于一个变量,它可能有三种属性,用const修饰符修饰的变量最可能放在RO属性区,已经初始化的变量会放在RW属性区,那么剩下的变量就要放到ZI属性区。默认情况下,ZI数据的零初始化会将所有ZI数据区初始化为零,这是每次复位后程序执行C代码的main函数之前,由编译器自主完成。
  5. 要在C代码中设置一些变量在复位后不被零初始化,那一定不能任由编译器“自主完成”,要用一些规则,约束一下编译器。这时候我们的.sct的作用就显示出来了。在分散加载文件中,使用UNINIT来修饰一个运行时域。可以避免__main对该区节的ZI数据进行零初始化。(解释了上一章节的问题:ZI属性输入节中的变量所在RAM又是谁在何时给用零初始化的呢?);

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

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

相关文章

黄菊华老师,Python毕业设计毕设辅导教程(2):Python开发准备,Window 平台安装 Python

Python3 开发准备 Python3 可应用于多平台包括 Windows、Linux 和 Mac OS X。 Unix (Solaris, Linux, FreeBSD, AIX, HP/UX, SunOS, IRIX, 等等。)Win 9x/NT/2000Macintosh (Intel, PPC, 68K)OS/2DOS (多个DOS版本)PalmOSNokia 移动手机Windows CEAcorn/RISC OSBeOSAmigaVMS/…

网络安全专业学习路线

​最专业、全面的网络安全学习路线来咯~(虽然是网络安全学习路线,但重心还是在Web安全上) 展示学习路线之前,建议大家先了解一下这几个问题,既是认清形势,也是认清自我: 为什么要学网络安全&a…

二 TypeScript 基础(初识和语法)

变量 什么是变量 变量是存储信息的容器,其中的值(内容)是可变的。 变量的声明 我们使用var关键字来声明变量,新的关键字let来声明带有(块级作用域)属性的变量。 var a 或者 let a 使用 来赋值 var a 1; //如果只声明变量,井没有赋值的话,该变量的值为 undef…

初识TypeScript编译器(tsc)

须知少时凌云志, 曾许人间第一流。 哪晓岁月蹉跎过, 依旧名利俩无收。 文章目录1. 安装 TypeScript2. 熟悉tsc的编译选项3. 编译.ts文件4. TS报错后那JS呢4.1 通过noEmitOnError禁止在出错的情况下编译出JS目标文件5. 查看编译生成的JS文件5.1 通过targe…

数据库分库分表方案

一、数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service来看就是,可用数据库连接少甚至无连接可用。接下来就可以想象了吧(并发…

文华财经期货量化短线策略支撑压力指标公式,短线行情无未来函数多空均线红涨绿跌信号

很多人从行情历史走势图发现,金叉行情上涨,死叉行情下跌的规律,告诉大家那些完美冬形只是过去式而已,行情震荡时,指标失灵可以把你震荡到爆仓。我们也会经常发现不好的指标在很多情况下会相互矛盾,这个指标…

[程序人生] [世界杯] 程序员世界杯的熬夜调节套餐 - 茶叶篇

🍁简介 最近看世界杯熬夜,搞点小酒(百威/威士忌/各种洋酒) 配花生米,再搞点串 简直人生不要太爽, 但是!!! 问题来了,几天下来 喉咙不适,肺部不适觉得痰多, 查了一下是酒辛辣食品太多了!早上萎靡不振咖啡提神…

车载诊断新驱动——远程诊断

文章目录 前言一、远程诊断作用二、解决方案三、现状和趋势总结前言 今天是2022年12月5日,终于迎来了疫情尾声的消息。 分享一段喜欢的文字,避免自己成为高知识低文化的工科男: 与其热闹着引人注目,步步紧逼,不如趋向…

基于springboot的作业管理系统设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

软件测试基础篇(3)

测试用例:围绕着软件需求文档来进行设计测试用例 测试用例:本质上是一种集合,是为了实施测试而向被测试系统发出的一组集合,实施测试集合,这个集合的操作者设计者就是测试人员,这组集合的内容包括:测试环境,操作步骤&a…

【JavaScript】用echarts绘制饼图

🙋‍ 哈喽大家好,本次是JavaScript专栏echarts板块第一期 ⭐本期内容:用echarts绘制饼图 🏆系列专栏:JavaScript 👍一起学习,一起加油! 文章目录前言效果图思路准备一个dom基于准备好…

网络安全对避免勒索软件侵害的5个原因

近几年来,勒索病毒已成为全球最热门的关键字之一,已造成了及其严重的经济损失。许多企业意识到这种情况,并试图集中精力保护自己免受这类威胁。在这里本人结合案例分享出5个原因,以让更多企业避免勒索软件的侵害。 原因1.勒索软…

【C++】模拟实现STL容器:list

目录 一、list的介绍 二、list的排序 三、迭代器 1、list的迭代器失效问题 2、迭代器的功能分类 3、list迭代器的模拟实现 3.1普通迭代器 3.2const迭代器 4、迭代器价值 5、迭代器operator->的重载 四、模拟实现时遇到的困惑及注意点 1、调用拷贝构造时&#xf…

Spring Cloud Gateway核心过滤器之请求限流详解

环境:SpringBoot2.4.13 Spring Cloud Gateway3.0.1 概述 RequestRateLimiter GatewayFilter工厂使用一个RateLimiter实现来确定当前请求是否允许继续。如果不是,返回HTTP 429 - Too Many Requests(默认情况下)的状态。 该过滤器接受一个可选的keyReso…

基于51单片机的贪吃蛇游戏设计

1绪 论 1.1本课题研究的背景及意义 随着当今社会的发展,人们的生活节奏变得越来越快,人们开始逐渐的融入全球化的世界。人们已经不再局限于一小块天地,加班,出差已经占据了现代人生活的绝大部分。这个时候,一款简单易携…

ChatGPT 体验和思考

一、体验 1、辅助写代码 2、检查代码(遗憾的是,不一定是对的) 3、分析代码 4、帮你了解/入门一项陌生的技术 小结: AI 会慢慢成为程序员的得力帮手,但目前来看,似乎还是不够成熟。 当然,大多…

《软件工程》2013年期末试卷

北京信息科技大学《软件工程》2013年期末试卷

青岛山水新城二期景观设计 全套设计

目录 1前言 2 1.1 青岛市地理位置与自然概况 2 1.2 山水新城小区概况 3 1.3设计的目的和意义 4 1.4小区园林景观设计现状和发展趋势 5 2本论 6 2.1设计依据 6 2.1.1 平面规划图 6 2.1.2 国家及地方有关规定及标准 6 2.2 设计指导思想 6 2.2.1 “以人为本”的设计理念 6 2.2.2 “…

PHP毕业设计毕设辅导课(1):PHP 基础语法

PHP 基础语法 PHP 脚本在服务器上执行&#xff0c;然后将纯 HTML 结果发送回浏览器。 PHP 基本的语法和输出 PHP 脚本可以放在文档中的任何位置。 <?php // PHP 代码 ?>PHP 脚本以 <?php 开始&#xff0c;以 ?> 结束&#xff0c;代码示例如下&#xff1a; …

[附源码]Python计算机毕业设计Django天狗电子商城系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…