在KEIL下查看单片机编程内存使用情况
原文链接:https://blog.csdn.net/D_azzle/article/details/83410141
截至到目前为止,本人接触单片机也有将近一年的时间。这一年以来也接触过了很具代表性的单片机,比如51、HT32、STM32等等。但是呢对于单片机的内存一直不了解,一直到现在,在一次单片机编程时我用到了malloc函数为指针分配内存空间。不知道为什么内存一直分配不成功。
所以这才去了解单片机的内存。下图是KELI编译成功后的输出信息。

在这里,我们先只关心Program Size这一行:
Code:代码指令占用的空间;
RO-data:Read Only Data的缩写。它的意义是只读常量占用的空间,比如const型常量、字符串常量等等;
RW-data:Read Write Data的缩写。它的意义是可读可写并且已初始化了的遍历所占用的空间,比如全局变量,静 态变量等等;
ZI-data:Zero Initialize Data的缩写。它的意义是以0初始化的变量,比如未初始化赋值的全局变量、静态变量等等;
而对单片机烧写程序时,FLASH被占用的空间大小为:Code + RO Data + RW Data,但是程序运行时使用到的RAM空间大小为:RW Data + ZI Data。
Why?
FALSH中被占用的空间 == 代码指令 + 只读数据值 + 已初始化变量的值。那么为什么程序运行时占用RAM空间大小 == RW Data + ZI Data呢?
我们都知道,在代码运行机制上单片机不同于PC,单片机的程序通常是在FALSH中直接取指执行,而PC是先把程序拷贝到RAM中再取指执行。因此单片机的RAM中不会存在Code拷贝(除非使用特殊方法强行使程序拷贝到了RAM中执行)。另外单片机RAM中也不会存在RO-data拷贝,因为RO-data是只读数据,为了节省RAM空间,这种数据在执行时直接从FLASH中取出使用,无需再复制到RAM。又由于RW Data和ZI Data是可读可写数据,为了供程序运行时正常读写,于是就会被放在单片机的RAM中(单片机的FLASH区不能被程序改写)
那么对于局部变量来说(RW Data和ZI data都是指的是全局变量或者静态变量),在C语言中全局变量和静态变量在RAM中都有一个特定的地址(存于静态区),而局部变量没有特定的地址。因此局部变量会被存放于堆栈中,当函数入栈时系统就会在栈顶开辟一段内存供局部变量使用,函数出栈时该内存就会被释放掉(静态局部变量除外)。
那么单片机程序在运行时RAM的使用量就等于RW Data + ZI Data了吗?还有没有其他因素会导致RAM占用变化?
玩过PC的都知道,一个程序在运行时它在内存中的占用情况是会随时改变的,这其中可能有压栈入栈和堆块的申请与释放等事件发生,那么在单片机里难道就没有这样的过程了吗?
其实单片机的RAM中也有堆栈区,因此程序运行时RAM的使用量就不会再等于RW Data + ZI Data了。(STM32的堆栈是存放于SRAM中的)而是等于 RW Data + ZI Data + Stack_Size + Heap_Size;
另外编译器并不会给变量一个内存,而是在内存中为变量指定一个地址,然后让其他变量不会重复指向该地址。在编译时编译器会把变量名用地址替换掉,这样也就达到了“编译器给变量分配了内存”的效果。那么,因为编译器为每个变量分配地址且不会让该地址被占用,由此可知RW Data 和 ZI Data这两块数据在被分配好内存之后一直会处于无法被回收的状态。因此如果没有新的程序烧录至单片机,RW Data + ZI Data区占用的空间是不会变的。
而对于堆栈区,堆栈区的大小是由启动文件确定的。函数入栈、出栈的过程变化的只是区内的数据而不是堆栈区的大小(入栈数量超过了栈区的大小限制则为爆栈)。因此没有新的程序烧录至单片机,堆栈区的大小也不会改变。
结论:ARM单片机中的FLASH占有量 == Code + RO Data + RW Data,程序运行时RAM的占有量 == RW Data + ZI Data + Stack_Size + Heap_Size
。
在KEIL下查看单片机编程内存使用情况的更多相关文章
- 操作系统复习——如何查看一个进程的详细信息,如何追踪一个进程的执行过程 ,如何在 Linux 系统下查看 CPU、内存、磁盘、IO、网卡情况?epoll和select区别?
1. 如何查看一个进程的详细信息,如何追踪一个进程的执行过程 通过pstree命令(根据pid)进行查询进程内部当前运行了多少线程:# pstree -p 19135(进程号) 使用top命令查看(可 ...
- Linux查看CPU和内存使用情况 【转】
Linux查看CPU和内存使用情况 在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分析系统状况的需要.在 CentOS 中,可以通过 top 命令来查看 CPU 使用状况.运行 ...
- 测试页面,页面里边一次加载50张不同的图片,每张5M以上,查看浏览器的内存使用情况
测试页面 1.需要你写个测试页面,页面里边一次加载50张不同的图片,每张5M,查看浏览器的内存使用情况 2.可以10张 递增的方式测试 3.图片需要缩放,比如所有图片缩放成600*800的比例 目的 ...
- Linux查看CPU和内存使用情况总结
Linux查看CPU和内存使用情况:http://www.cnblogs.com/xd502djj/archive/2011/03/01/1968041.html 在做Linux系统优化的时候,物理内 ...
- 如何正确查看Linux机器内存使用情况
如何正确查看Linux机器内存使用情况 背景 只要工作上涉及到Linux机器,基本上都会有这样一个需求,查看内存使用情况,但是怎么看才正确呢?之前使用的是top命令,一直存在一个误区. 为什么top命 ...
- 如何使用Linux命令行查看Linux服务器内存使用情况?
一个服务器,最重要的资源之一就是内存,内存够不够用,是直接关系到系统性能的关键所在. 本文介绍如何查看Linux服务器内存使用情况, 1.free命令 free -m [root@localhost ...
- linux下对进程按照内存使用情况进行排序
linux下对进程按照内存使用情况进行排序的命令为:ps aux --sort -rss 详细解说参见 http://alvinalexander.com/linux/unix-linux-proce ...
- 查看Linux服务器内存使用情况
一个服务器,最重要的资源之一就是内存,内存够不够用,是直接关系到系统性能的关键所在. 本文介绍如何查看Linux服务器内存使用情况, 1.free命令 free -m [root@localhost ...
- ubuntu下查看服务器的CPU详细情况
https://www.cnblogs.com/liuq/p/5623565.html 全面了解 Linux 服务器 - 1. 查看 Linux 服务器的 CPU 详细情况 ubuntu下查看服务器的 ...
随机推荐
- 学习seo赚钱一定要有超前的思路和眼光
http://www.wocaoseo.com/thread-100-1-1.html 日子过的真是快,一天又一天,一年又一年,虽然过年的脚步将近,火车票的问题还是没有解决,昨天忙活了半 ...
- 如何解决 iframe 无法触发 clickOutside
注:(1)非原创,来自https://blog.csdn.net/weixin_33985679/article/details/89699215.https://zhuanlan.zhihu.com ...
- Vue基础(二)---- 常用特性
常用特性分类: 表单操作 自定义指令 计算属性 侦听器 过滤器 生命周期 补充知识(数组相关API) 案例:图书管理 1.表单操作 基于Vue的表单操作:主要用于向后台传递数据 Input 单行文本 ...
- nodejs打包成桌面程序(exe)的进阶之路
nodejs打包成桌面程序(exe)的进阶之路 node js bat 前端 计划任务 前言:最近的研究,请大佬们细品 第一篇 - 任务计划程序篇 说真的研究到将nodejs打包成可执行的exe文件是 ...
- Android开发之下载服务器上的一张图片到本地java代码实现HttpURLConnection
package com.david.HttpURLConnectionDemo; import java.io.FileOutputStream; import java.io.IOException ...
- 常见的开源 License
目录 什么是开源软件 什么是 license 商业许可证与开源许可证 对开发者的影响 开源许可证的类型 如何选择开源许可证 什么是开源软件 开放源代码的软件.假设有一天自我感觉代码能力不错,写了个小工 ...
- 字符串对象跟xml格式的转换
package com.sunshen.jfids.testWebService.task; import java.io.File; import java.io.StringWriter; imp ...
- shell 设置进程数运行
问题描述 在服务器上提交任务时,需要限制运行的核的数目.程序本身是单线程的,但是不同的输入参数需要跑很多组,粗暴的方法是开多个终端,不断地去提交任务.但这比较麻烦,可以用 shell 实现. 基础 首 ...
- Vue 下拉刷新及无限加载组件
原文 https://github.com/wangdahoo/vue-scroller 主题 Vue.js Vue Scroller Vue Scroller is a foundational ...
- linux6.4内核由2.6升级成3.6
安装CentOS 6.4之后,内核默认是2.6.32.由于docker需要3.0以上的内核,所以需要对内核进行升级. 1. 安装必要组件# yum -y install ncurses-devel # ...