RO: 常量

ZI: 未初始化的全局变量

RW: 初始化的全局变量

Code: 程序本身

Code, RO-data,RW-data ..............flash

RW-data, ZIdata...................RAM

初始化时, RW会从flash被拷贝到RAM

Program Size: Code=1564 RO-data=336 RW-data=32 ZI-data=1832

Code就是flash. 证明: 我现在注释掉一行:

//delay_ms(300);

Program Size: Code=1556 RO-data=336 RW-data=32 ZI-data=1832

再注释一行:

//LED1=0;

Program Size: Code=1548 RO-data=336 RW-data=32 ZI-data=1832

再注释一行:

//LED0=1;

Program Size: Code=1544 RO-data=336 RW-data=32 ZI-data=1832

其他都没变, 只有Code变化了.

以这个为基础:

Program Size: Code=1556 RO-data=336 RW-data=32 ZI-data=1832

接下来, 加一个static的变量.

static u8 i;

Program Size: Code=1556 RO-data=336 RW-data=32 ZI-data=1832

发现没有任何变化, 就是静态变量, 你不赋值, 就不占任何空间, 编译器好聪明.

接着, 声明后马上赋值:

static u8 i=2;

编译结果:

Program Size: Code=1556 RO-data=336 RW-data=32 ZI-data=1832

竟然没有任何变化, 也就是说, 只是赋初始值, 也是没有使用的静态变量也不占任何空间.

加一行代码:

i=3;

Program Size: Code=1568 RO-data=336 RW-data=36 ZI-data=1836

可以看到Code有变化, RW-data也增加了4个字节, 因为32位的系统的关系吧. 然后ZI也是增加了4个字节

如果不赋初始值, 直接后面才给i一个3:

Program Size: Code=1568 RO-data=336 RW-data=36 ZI-data=1836

没变化, 即, static的变量, 申明时就赋值了.

如果把static去掉, 在函数内申明一个普通变量i, 则:

Program Size: Code=1560 RO-data=336 RW-data=32 ZI-data=1832

跟基础相比:

Program Size: Code=1556 RO-data=336 RW-data=32 ZI-data=1832

除了Code没变化.

增加define

#define iah 0x0f

Program Size: Code=1560 RO-data=336 RW-data=32 ZI-data=1832

没有任何变化

即编译期间, 所有define都会被自动替换.

可见:

1. Code就是编译后的机器码

2. RO就是Read Only, 即常量

3. static的变量, 在初始化的时候, 会从flash放进内存

4. 普通变量只会在栈和堆中存在, 并存活于函数作用域, 初始化的时候并不占用内存.

5. 只有const修饰符才会增加RO.

参考链接:

http://blog.csdn.net/winmenaruto/article/details/6256770

STM32内存跟FLASH问题的更多相关文章

  1. STM32片上Flash内存映射、页面大小、寄存器映射

    STM32片上Flash内存映射.页面大小.寄存器映射 STM32有4种Flash module organization,分别是:low-density devices(32KB,1KB/page) ...

  2. STM32 对内部FLASH读写接口函数(转)

    源:STM32 对内部FLASH读写接口函数 因为要用内部FLASH代替外部EEPROM,把参数放在STM32的0x08000000+320K处,其中20K是bootloader,300K是应用程序. ...

  3. 舵机&数据处理&stm32内存之堆栈溢出(遇到的问题)

    产品名称:TOWER PRO(辉盛)大扭力舵机MG996R (MG995升级产品)6v/11Kg厂家编号:MG996R产品净重: 55g产品尺寸: 40.7*19.7*42.9mm产品拉力: 9.4k ...

  4. STM32内存结构介绍和FreeRTOS内存分配技巧

    这是我第一次使用FreeRTOS构建STM32的项目,踩了好些坑,又发现了我缺乏对于操作系统的内存及其空间的分配的知识,故写下文档记录学习成果. 文章最后要解决的问题是,如何恰当地分配FreeRTOS ...

  5. STM32内存知识

    在了解STM32内存之前需要了解 MCU 的型号和MDK 中的.map 文件,很多刚学习 stm32 时都不会过多的去了解 MCU 的选型,是在太枯燥了.这里在从新了解一下,久了就熟悉了. 一.STM ...

  6. STM32内存映射

    一.概述 STM32内存映射是STM32的架构的重要组成部分,不可或缺. 二.STM32内存映射图 1.内存映射图--摘自<CM3权威指南> 2.内存映射图--摘自<STM32F10 ...

  7. 【转】STM32擦除内部FLASH时间过长导致IWDG复位分析

    @20119-01-29 [小记] STM32擦除内部FLASH时间过长导致IWDG复位分析

  8. 转载-STM32片上FLASH内存映射、页面大小、寄存器映射

    原文地址:http://blog.chinaunix.net/uid-20617446-id-3847242.html 本文以STM32F103RBT6为例介绍了片上Flash(Embedded Fl ...

  9. STM32 对内部FLASH读写接口函数

    因为要用内部FLASH代替外部EEPROM,把参数放在STM32的0x08000000+320K处,其中20K是bootloader,300K是应用程序. 原理:先要把整页FLASH的内容搬到RAM中 ...

随机推荐

  1. 利用DBMS_ROWID.ROWID_CREATE来找出事务等待的行数据

    在v$session视图中有四个字段,如下: Wait information in v$session view ROW_WAIT_OBJ# NUMBER Object ID for the tab ...

  2. Web:AJAX的详解

    Web中的AJAX技术: 1.介绍:全称:Asnchronous JavaScript and XML,即异步的JavaScript和XML功能:它不是某种编程语言,是一种无需加载整个网页的情况下能够 ...

  3. 建字段_添加数据_生成json.php

    <?php header("Content-Type:text/html;charset=utf8"); class db{ static $localhost = &quo ...

  4. 手动内存管理与ARC互相转换问题

  5. django关闭DEBUG后 static静态文件都访问不了

    Django框架仅在开发模式下提供静态文件服务.当我开启DEBUG模式时,Django内置的服务器是提供静态文件的服务的,所以css等文件访问都没有问题,但是关闭DEBUG模式后,Django便不提供 ...

  6. devexpress13学习系列(四)PDFViewer(4)

    PdfViewer的属性: CurrentPageNumber:显示当前页的页码. DocumentFilePath:当前文件. DocumentProperties:文件属性. PageCount: ...

  7. MD5和DES加密方法

        /// <summary>         /// MD5加密         /// </summary>         /// <param name=&q ...

  8. Leetcode: Majority Element II

    Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorit ...

  9. 转:Curl详解

    用途说明 curl命令是一个功能强大的网络工具,它能够通过http.ftp等方式下载文件,也能够上传文件.其实curl远不止前面所说的那些功能,大家可以通过man curl阅读手册页获取更多的信息.类 ...

  10. 压缩 & 解压缩 命令汇总:tar、zip & unzip、

    1. tar命令详解     格式:tar [-cxtzjvfpPN] 文件与目录 -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五 ...