Keil中的Code,RO,RW,ZI分别表示什么?

在使用keil开发STM32应用程序时,点击Build后在Build Output窗口中经常会有如下信息:

这里写图片描述

以前一直好奇这几个参数和实际使用的STM32芯片中Flash和SRAM的对应关系,于是上网搜了一圈,做如下总结:

  • 这些参数的单位是Byte
  • 图中几个参数分别代表 
    • Code:代码的大小
    • RO:常量所占空间
    • RW:程序中已经初始化的变量所占空间
    • ZI:未初始化的static和全局变量以及堆栈所占的空间
  • 上述参数和芯片Flash以及SRAM的对应关系是 
    • Flash占用大小=Code+RO+RW
    • SRAM占用大小=RW+ZI

不知道有没有人会像我一样好奇为什么RW参数同时参与了Flash和SRAM占用量的计算。这是因为Flash部分的属性是Read-Only的,而SRAM虽然是Read-Write但里面数据不能掉电保存,所以只能把已经初始化的值保存到ROM里,上电后再拷贝到SRAM中进行读写操作,即两部分都需要留出RW变量所占用的空间。这里给出的解释比较详细,在此我参照着用STM32F407ZGT6图解一下。 
STM32F407ZGT6的Flash大小为1MB,SRAM大小为(128KB+64KB)。这里SRAM之所以分开表示是因为在芯片内部前面的128KB和后面的64KB地址不是连续的,后面的64KB在ST官方叫做CCM (core coupled memory) ,据说是由内核直接访问的,不能由外设访问(见原帖2楼)。下面给出的示意图中只标出了前面的128KB的SRAM空间。红色部分表示STM32F407ZGT6提供的Flash和SRAM大小。

这里写图片描述

结合上图说下STM32F407ZGT6的启动过程(采用Cortex-M4、Cortex-M3内核的芯片基本都是这个过程):上电后首先从0x00000000(映射到0x08000000,这里只考虑从内部Flash启动)处获得中断向量表,然后在运行用户代码之前会在标号2处有一段引导代码负责把存在Flash中的初始化变量的值Copy到SRAM中对应的变量位置(标号3),之后把ZI区域全部清零(标号4),之后才正式开始运行用户代码(标号5)。

对于详细的启动过程,这个帖子写得比较详细,可以试试~

参考资料: 
http://stackoverflow.com/questions/5430284/rom-and-ram-in-arm 
http://blog.csdn.net/he_ning/article/details/35226125 
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/4027.html 
http://anlx27.iteye.com/blog/1575848

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

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

相关文章

linux mmap 内存映射 mmap() vs read()/write()/lseek()

From: http://www.perfgeeks.com/?p723 通过strace统计系统调用的时候,经常可以看到mmap()与mmap2()。系统调用mmap()可以将某文件映射至内存(进程空间),如此可以把对文件的操作转为对内存的操作,以此避免更多的lseek()与read()、write()操作…

[react] React组件的构造函数是必须的吗?

[react] React组件的构造函数是必须的吗? 构造函数并不是必须的,对于无状态组件,内部没有维护自己的state,只接收外部传入的props 是不需要声明构造函数的 个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易&#x…

为什么dos下的com文件都要org 0100h呢?为什么系统启动时要org 07c00h呢

这是因为 .com 载入内存后的起始偏址就是100h. 前面的100h字节是该程序的PSP 部分. 所以, 为了程序中对地址引用的正确, 必需加上org 100h语句。----------------------------------------------------------------------------------------------------------------…

Qt中的TableWidget初始化表头、行高、选中、自动扩展和接受修改

一、需求 设置QT中的TableWidget样式,初始化表头,行高和颜色,行选中,是否修改,是否自动扩展宽度等。 二、代码 void MainWindow::TimerListInit() {QStringList InfHeader;int columnNum;columnNum 7;ui->table…

JTAG、SWD接口定义

版权声明:本文为博主原创文章,转载请注明。 博客已转到 http://blog.csdn.net/upc_xbt https://blog.csdn.net/u014124220/article/details/50829713Jlink仿真器接口仿真器端口连接目标板备注1. VCCMCU电源VCCVCC2. VCCMCU电源VCCVCC3. TRSTTRSTTest ReS…

[leedcode 215] Kth Largest Element in an Array

Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element. For example,Given [3,2,1,5,6,4] and k 2, return 5. Note: You may assume k is always valid, 1 ≤ k ≤ arrays lengt…

Ubuntu 修改默认的PDF打开方式

Ubuntu自带了可以打开PDF的文档编辑器,如GIMP和文档查看器,但这些自带的文档编辑器并不是很好用,很可能会产生乱码,以至于不方便…… 由于在WIN下对foxit的产品感觉很满意,并且知道它也为linux做了一个PDF查看器&#…

[react] React组件的构造函数有什么作用?

[react] React组件的构造函数有什么作用? 在react的新的写法中,每一个组件都是一个类,这个很符合es6的语法规范,在es6中要想创建一个对象,就要调用相应的构造函数, react的组件渲染有两种情况,第一种情况是…

高级Linux程序设计第五章:进程间通信

From: http://www.cnblogs.com/forfuture1978/archive/2010/04/29/1723417.html 五种进程间通信的方式: 共享内存(shared memory):其允许多个进程通过读写同一块内存地址来相互通信。 内存映射(Mapped memory):其和共享内存相似,…

Qt 给应用程序添加图标

一、需求 给应用程序.exe添加图标。 二、代码 1、资源文件中添加进去main.ico 32X32pt 2、xxxx.pro文件中 添加RC_ICONS main.ico

#pragma pack(push,1)与#pragma pack(1)的区别

这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式。#pragma pack (n) 作用:C编译器将按照n个字节对齐。#pragma pack () 作用:取消自定义字节对齐方式…

Drainage Ditches - poj 1273(网络流模板)

题意:1是源点,m是汇点,求出来最大流量,没什么好说的就是练习最大流的模板题 ************************************************************** 先用Edmonds-Karp的算法做一下试试吧重边贡献了 1W,要加上所有的重边才算…

sawmill全方位日志分析大师

Sawmill 是一套崭新的集中式(中文)日志报表系统,除了提供收集设备或服务的日志,整合、分析成有效报表外,并能降低企业成本与信息管理人员减少学习报表时间,且能于全球各地上网即可获得IT信息。 集中式 : 集中整合各式设…

[react] React中在哪捕获错误?

[react] React中在哪捕获错误? 在react 15 极其以前的版本中,组件内的UI异常将中断组件内部状态,导致下一次渲染时触发隐藏异常。React并未提供友好的异常捕获和处理方式,一旦发生异常,应用将不能很好的运行。而React 16版本有所…

VC6.0 控件Radio Button的使用

From: http://www.cppblog.com/Lee7/archive/2007/09/13/32152.html 使用方法: 1.建立一个基于对话框的用用程序,在其中加入三个Radio Button,ID分别为: IDC_RADIO1,IDC_RADIO2,IDC_RADIO3 2.控件的初始化: 在对话框类的OnInitDialog中加入代码: …

Qt 实现QT控件中的QLabel显示图片并自适应显示

一、需求 实现QT控件中的QLabel显示图片,并自适应显示。 二、代码 QImage Image; Image.load(":/image/image/logo.jpg"); QPixmap pixmap QPixmap::fromImage(Image); int with ui->label_logo->width(); int height ui->label_logo->…

linux RTC 驱动模型分析

linux RTC 驱动模型分析RTC(real time clock)实时时钟,主要作用是给Linux系统提供时间。RTC因为是电池供电的,所以掉电后时间不丢失。Linux内核把RTC用作“离线”的时间与日期维护器。当Linux内核启动时,它从RTC中读取时间与日期,…

Install Docker Mac OS X

检查 Mac OS version 要求必须是 OS X 10.6 Snow Leopard or newer to run Boot2Docker安装 Boot2Docker 列表内容下载地址:https://github.com/boot2docker/osx-installer/releases/download/v1.7.0/Boot2Docker-1.7.0.pkg 下载后点击安装,就是按照提示…

linq to sql报错,

以上是由于我把关联表中的string类型写成int类型所导致的,记一下,备用。转载于:https://www.cnblogs.com/server126/archive/2011/05/25/2057416.html

[react] React怎样引入svg的文件?

[react] React怎样引入svg的文件&#xff1f; import React from react; import logo from ./logo.png; // Tell Webpack this JS file uses this imagefunction Header() {// Import result is the URL of your imagereturn <img src{logo} alt"Logo" />; } …