原文地址http://blog.sina.com.cn/s/blog_898f36590100ya2l.html

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

以下为摘抄:

一:什么时候使用scatter file:

1、存在复杂的地址映射:例如代码和数据需要分开存放在多个区域。

2、存在多个存储器类型:包含Flash, ROM, SDRAM,快速SRAM。我们根据代码与数据的特性把他们发在不同的存储器中,比如中断处理部分放在快速SRAM内部来提高响应速度,而把不常用到的代 码放到速度比较慢的Flash内。

3、函数的地址固定定位:可以利用Scatter file实现把某个函数放在固定地址,而不管其应用程序是否已经改变或重新编译。

4、利用符号确定堆和堆栈。

5、内存映射的IO:利用scatter file可以实现把某个数据段放在精确的地址处。因此对于嵌入式系统来说scatter file是必不可少的,因为嵌入式系统采用了ROM, RAM和内存映射的IO。

分散加载文件(即scatter file后缀为.scf)是一个文本文件,通过编写一个分散加载文件来指定ARM连接器在生成映像文件时如何分配RO,RW,ZI等数据的存放地址。如果不用SCATTER文件指定,那么ARM连接器会按照默认的方式来生成映像文件,一般情况下我们是不需要使用分散加载文件的。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我现在的板子是STM32F429,外接了SDRAM,NandFlash,我想用sct文件的主要原因是要用到了nandflash,想把yaffs移植上去,但yaffs里面有大量的malloc,STM32F429的片内sram不足以完成这些malloc,故想到把堆放到SDRAM里面去,因此我的sct文件如下:

LR_IROM1 0x08000000 0x00100000 { ; load region size_region  加载域,起始地址是0x08000000,大小是0x00100000
ER_IROM1 0x08000000 0x00100000 { ; load address = execution address 执行地址,就是链接地址
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00030000 { ; RW data
.ANY (+RW +ZI)
}
}

ARM_LIB_HEAP 0xC0000000 0x80000 { ; 指定堆栈地址
RW_HEAP 0xC0000000 0x80000 {  
.ANY (HEAP)
}
}

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

分析下面这个sct文件

ARM_LIB_HEAP 0x20100000 EMPTY 0x100000-0x8000         #堆开始于0x20100000这个地址,长度是正值,说明向高地址增长,大小是(0x100000-0x8000)
{
}

ARM_LIB_STACK 0x20200000 EMPTY - 0x8000                     #EMPTY后面的长度是负值,则表示0x20200000是这个执行区的结束地址,换句话说就是栈的起始地址是0x20200000,地址向下增长,大小是0x8000,那么结束地址就是(0x20200000-0x8000)
{
}

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

再看下面这个复杂点的sct文件:

LR_IROM1 0x08000000 0x00100000 { ; load region size_region
ER_IROM1 0x08000000 0x00100000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}

RW_IRAM_DATA 0x20000000 0x00030000 { ; RW data                                                                                                   #所有+RW,+ZI段的数据全部放在0x20000000这里,分配的大小是0x00030000,但这个空间不一定会用完,从下面的定义来看,真正的大小可以用

.ANY (+RW +ZI)                                                                                                                                                                  #ImageLimit(RW_IRAM_DATA)来表示,这是在编译的时候就决定了的
}

ARM_LIB_STACK 0x20030000 EMPTY -(0x20030000 - ImageLimit(RW_IRAM_DATA)) ; Stack region growing down    #没找到ImageLimit(RW_IRAM_DATA)的含义,猜测是程序编译出来的所有(+RW,+ZI)段的大小,这个大小在编译的时候就可以确定,这里只引用其值
{ }                                                                                                                                                                                          # 相当于RW数据是从0x20000000开始运行,地址向上增长,而栈的起始地址是从0x20030000地址开始,往下增长,RW和栈共用0x30000空间的

RW_ERAM 0xD0000000 0x00800000 { ;Extern SDRAM                                                                                                     #将main.c编译时RW/ZI段所以的内容放到片外SDRAM起始地址0xD0000000的地方,大小是0x00800000,;类似上面,这个空间不一定会用完
main.o(+RW +ZI)
}

ARM_LIB_HEAP +0 EMPTY (0xD0800000 - ImageLimit(RW_ERAM)) ; Heap region growing up                                      #分配堆的空间,起始地址是从前一个执行区偏移0字节开始,这个地址其实就是0xD0000000+ImageLimit(RW_ERAM),长度为正值,
{ }                                                                                                                                                                                           #因此地址向上增长,说白了就是main函数运行起来所使用的内存之外的所以内存全部分配给了堆
}

STM32F4的sct文件理解的更多相关文章

  1. 代码中函数、变量、常量 / bss段、data段、text段 /sct文件、.map文件的关系[实例分析arm代码(mdk)]

    函数代码://demo.c #include<stdio.h> #include<stdlib.h> , global2 = , global3 = ; void functi ...

  2. 读取本地文件理解FileReader对象的方法和事件以及上传按钮的美化。

    一.FileReader对象 用来把文件读入内存,并且读取文件中的数据.FileReader对象提供了异步API,使用该API可以在浏览器主线程中异步访问文件系统,读取文件中的数据. 浏览器支持情况, ...

  3. Express static 托管静态文件 理解

    今天偶尔看了一下服务端渲染,遇到了express.static, 在以前学习webpack配置服务端渲染时,也使用express.static 中间件,两者配置不太一样,由于当时也没有认真学,所以 一 ...

  4. 使用Nexus管理maven仓库,setting文件理解

    来到新公司对很多陌生的技术一头雾水,以前在工作中没有真正使用过maven,于是强迫自己蛋定下来一个一个的突破,下面是我对maven的setting配置文件的理解,由于是现学的,难免可能会理解偏差,还请 ...

  5. STM32F4 输入输出(GPIO)模式理解

    stm32的GPIO的配置模式有好几种,包括: 1. 模拟输入: 2. 浮空输入: 3. 上拉输入: 4. 下拉输入: 5. 开漏输出: 6. 推挽输出: 7. 复用开漏输出: 8. 复用推挽输出   ...

  6. vue的package.json文件理解

    参考文档: https://www.cnblogs.com/tzyy/p/5193811.html#_h1_0 https://www.cnblogs.com/hongdiandian/p/83210 ...

  7. mysql文件理解

    mysql_Innodb的undo_log和redo_log 原创 2014年10月28日 11:26:34   众所周知,mysql支持多种存储引擎,现在常用的是MyISAM和InnoDB.MyIS ...

  8. Https:证书生成 .p12 .keyStore 和 .truststore文件理解

    当我们需要SSL证书时,可以自动生成SSL证书,但是每个系统都申请一次证书会比较麻烦,所以用到了如下几个文件格式:   .p12(PKCS #12) 我们的每一个证书都可以生成一个.p12文件,这个文 ...

  9. stm32F4各个库文件的作用分析

    system_stm32f4xx.c:This file contains the system clock configuration for STM32F4xx devices. /** **** ...

随机推荐

  1. Win10系列:VC++绘制几何图形1

    本小节主要介绍如何使用Direct2D来绘制几何图形,其中会使用到FillGeometry函数和FillEllipse函数,FillGeometry函数用于填充几何图形的内部区域,而FillEllip ...

  2. flask+apache+mod-wsgi部署遇到的坑

    首先,看到这种方式部署,我也有疑问,为什么不用nginx,gunicorn.接手的项目,就先按照前人思路run起来. 线上使用ubuntu系统,apache2,而给我玩耍的测试机是centos6.5, ...

  3. x多进程

    #!/usr/bin/env python3 # -*- coding: utf-8 -*- ''' from multiprocessing import Process import os #子进 ...

  4. vs2013 跳过IE10

    安装 VS2013要安装IE10,却安装不了..以下为跳过IE10,直接安装VS2013方法 复制以下代码,保存为bat文件 @ECHO OFF :IE10HACK REG ADD "HKL ...

  5. 8.3 C++格式标识和操纵器

    参考:http://www.weixueyuan.net/view/6409.html 总结: 我们需要借助格式标识符来控制cout对象的输出格式. 在ios_base类中,系统已经定义了很多格式标识 ...

  6. ORA-02049: 超时: 分布式事务处理等待锁

    java.sql.SQLSyntaxErrorException: ORA-02049: 超时: 分布式事务处理等待锁 ORA-06512: 在 "HECDEV.BGT_JOURNAL_BA ...

  7. 3-D models provided some resources

    http://d-earth.jamstec.go.jp/GAP_P4/ http://ds.iris.edu/ds/products/emc-earthmodels/

  8. Tap 模拟手势点击坐标

    前言:有时候元素怎么都定位不到,没办法就只能坐标定位了,不过这个坐标定位不准确,换个手机就可能定位不到了,这是一个下下策的定位方式. tap用法 1.tap是模拟手指点击页面上元素语法有两个参数,第一 ...

  9. 1) 上传多张图片时 ,对 $_FILES 的处理. upload ; 2)fileinput 上传多张图片. 3) 修改,删除的时候删除原来的资源,图片 update, delete , 删除 4)生成器中两个字段上传图片的时候,要修改生成器生成的代码

    1上传多张图片, 要对 $_FILES进行 重新处理. //添加 public function addCourseAlbumAction() { $CourseAlbumModel = new Co ...

  10. c#继承中的函数调用实例

    using System;   namespace Test {     public class Base     {         public void Print()         {   ...