一. STM32程序构成

  1.1. STM32的存储空间

    1.1.1. RAM

      1.1.1.1 单片机的RAM是SRAM.

      1.1.1.2. SRAM特点

        a.优点,速度快,不必配合内存刷新电路,可提高整体的工作效率,软件上不需要初始化SRAM。
                     b. 缺点,集成度低,功耗较大,相同的容量体积较大,而且价格较高,少量用于关键性系统以提高效率。
        c. SRAM使用的系统:
          (1)CPU与主存之间的高速缓存。
          (2)CPU内部的L1/L2或外部的L2高速缓存。
          (3)CPU外部扩充用的COAST高速缓存。

          (4)单片机内存单元

    1.1.2. FLASH

      1.1.2.1. 单片机的flash是NorFlash

      1.1.2.1. NorFlash 特点

        a. NOR可以直接使用,并可在上面直接运行代码。不需要初始化

        b. NOR flash带有SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内部的每一个字节

    1.1.3. NOR FLASH 和 NAND FLASH对比

      

      a.NOR与NAND特性的差别,主要是由于其内部“地址/数据线”是否分开导致的。由于 NOR的地址线和数据线分开,它可以按“字节”读写数据,符合 CPU 的指令译码执行要求,所以假如 NOR上存储了代码指令, CPU 给 NOR一个地址, NOR 就能向CPU 返回一个数据让 CPU 执行,中间不需要额外的处理操作。

      b.由于 NAND 的数据和地址线共用,只能按“块”来读写数据,假如 NAND 上存储了代码指令, CPU 给 NAND 地址后,它无法直接返回该地址的数据,所以不符合指令译码要求。 即不支持立即执行的特性(eXecute In Place),若代码存储在NAND上,可以先把它加载到RAM存储器上,再由CPU执行。  

  1.2. 空间排布

    1.2.1. keil编译信息分析

      1.2.1.1. code: 表示程序代码部分

      1.2.1.2. RO-data: 表示程序中定义的常量(如:const ,字符串)

      1.2.1.3. RW-data: 表示已初始化的全局变量

      1.2.1.4. ZI-data: 表示未初始化或初始化为0的全局变量

      1.2.1.5. 大小计算

        a. RO Size = Code + RO Data     (程序占用FLASH空间)

        b. RW Size = RW Data + ZI Data  (运行时程序占用RAM空间)

        c. ROM Size = Code + RO Data + RW Data (烧录时程序占用FLASH 空间的大小,bin文件)

          PS: 为什么bin文件不包含ZI Data

            答:因为ZI 数据都是0,只要程序运行前将ZI数据所在的区域(RAM区域)一律清零即可,如此节省了flash储存空间

二. 程序是否需要加载到RAM中?

  2.1. 单片机是否需要?

    2.1.1. 把程序从flash加载到RAM需要bootloader,(其实程序也可以直接下载到RAM中运行,只不过重启程序就没有了。在flash刷新次数受限(一般flash可以刷新1000次左右)直接烧录程序到RAM调试程序。

    2.1.2. 单片机RAM较小程序太多无法加载全部程序

    2.1.3. 单片机执行分三个步骤:取指令,分析指令,执行指令。取指令任务是根据PC值从地址总线上读出指令。虽然从RAM取指令速度远大于ROM,但单片机自身运行速度不高,并不影响速度

     2.1.4. 总结:虽然单片机可以把程序加载到RAM, 但真的真的没必要这么干。

  2.2. 运行Linux系统为什么需要?

    2.2.1. linux程序比较大,很少用norflash储存程序,而是用nandFlash或sd储存,故这类储存 不符合CPU 的指令译码执行要求。

    2.2.2. 运行linux系统的cpu。其运行频率非常高,远大于ROM读写速度,从rom取指会严重影响速度。故系统会把程序拷贝到RAM执行。

    2.2.3. 总结:运行Linux系统时程序必须加载到RAM

      

    

为何单片机程序不用加载到RAM的更多相关文章

  1. [转] Linux下程序的加载、运行和终止流程

    TAG: linux, main, _start DATE: 2013-08-08 原文地址: http://blog.csdn.net/tigerscorpio/article/details/62 ...

  2. 动态符号链接的细节 与 linux程序的加载过程

    转: http://hi.baidu.com/clivestudio/item/4341015363058d3d32e0a952 值得玩味的一篇分析程序链接.装载.动态链接细节的好文档 导读: by ...

  3. 支付宝小程序室内地图导航开发-支付宝小程序JS加载esmap地图

    如果是微信小程序开发,请参考微信小程序室内地图导航开发-微信小程序JS加载esmap地图文章 一.在支付宝小程序里显示室内三维地图 需要满足的两个条件 调用ESMap室内地图需要用到小程序web-vi ...

  4. 使 IIS 6.0 可以在 64 位 Windows 上运行 32 位应用程序 试图加载格式不正确的程序。

    原文 使 IIS 6.0 可以在 64 位 Windows 上运行 32 位应用程序 试图加载格式不正确的程序. win7 64位操作系统上边运行IIS网站应用的时候,提示错误"试图加载格式 ...

  5. java程序的加载过程

    昨天笔试阿里有个求java程序加载过程的题目很是复杂,回来研究了好久才有点明白,整理一下.原题代码如下,判断输出: public class StaticTest { public static in ...

  6. 微信小程序分包加载实战

    "离线包"机制 微信小程序采用的是类似离线包加载方案,以转转小程序为例,当用户第一次打开时会先下载好所有代码,然后再加载页面:当用户再次进入转转小程序时,会直接使用已下载的代码,省 ...

  7. 微信小程序 - 分包加载

    小程序开发大家都知道,对主包的大小进行了限制,从最初的1M变成了现再的2M,一般情况下是够用了:但是偶尔可能会出现超出2M的可能,我们可以对小程序进行分包加载. 1.小程序分包加载 a. 某些情况下, ...

  8. 「小程序JAVA实战」 小程序默认加载的页面和生命周期(八)

    转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-08/ 小程序如何加载的呢?生命周期!源码:https://github.com/limingios ...

  9. IOS 应用程序启动加载过程(从点击图标到界面显示)

    今天帮同事解决问题的时候发现,程序BUG是由加载过程引起的.所以当局部代码没有问题,但是程序一运行却总不是我们想要结果的时候,我们应该想想是不是因为我们忽略了试图加载过程的原因.下面我们用一个例子来简 ...

随机推荐

  1. python中json对象转换出错解决方法

    今天在使用python中的json转换碰到一个问题: 接收一个post的json字符串: s={"username":"admin","passwor ...

  2. Cassandra 集群配置

    集群机制 一致性哈希(数据一致性) Token Range Partitoner Gossip协议(流言,无中心获取领导者) 用于在环内节点之间传播状态信息 周期运行,每次在环中随机挑选一个对象节点, ...

  3. linux-selinxu---性能 -8

    sed -ri.bk '/^SELINUX=/s/(SELINUX=)(.*)/\1disabled/' /etc/selinuconfig 修改并备份 脚本打开关闭 selinux if [[ &q ...

  4. 实战build-react(四)一个模块的进化过程

    主框架结构 home/index.js    //模块主文件 创建Topic模块 阶段一  基础代码 import React, { Component } from 'react'; import ...

  5. BZOJ 4883: [Lydsy1705月赛]棋盘上的守卫 最小生成树 + 建模

    Description 在一个n*m的棋盘上要放置若干个守卫.对于n行来说,每行必须恰好放置一个横向守卫:同理对于m列来说,每列 必须恰好放置一个纵向守卫.每个位置放置守卫的代价是不一样的,且每个位置 ...

  6. npm安装源修改为淘宝源

    npm安装源修改为淘宝源 标签(空格分隔): 编译 原:https://cnodejs.org/topic/4f9904f9407edba21468f31e npm安装源修改为淘宝源 镜像使用方法(三 ...

  7. mysql学生成绩排名,分组取前 N 条记录

    转载  https://blog.csdn.net/jslcylcy/article/details/72627762 score表: CREATE TABLE `score` ( `student_ ...

  8. linux 汇编函数调用

    edi第一个参数 esi第二个参数 edx第三个参数 rax保存结果 C++代码如下: char* demo(char* a,int b){ static char* buf=0; if(!buf)b ...

  9. JS数组方法的的返回值和是否改变该数组总结

    concat() 方法 concat() 方法用于连接两个或多个数组. 该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本. 返回值 返回一个新的数组.该数组是通过把所有 arrayX 参数添 ...

  10. 【flask_sqlalchemy】动态CURD类

    环境: flask_sqlalchemy mysql from app import db class Curd(object): def __init__(self,modelName): self ...