单片机内存的合理使用对于一名嵌入式软件工程师来说是至关重要的,这深深关系到项目代码的稳定性。对于c语言程序的bug,最为致命、最难发觉的也是内存的使用不当造成的,这种奇葩现象。之前对这一块有过了解,可惜没有真正的领会其中的要害和内涵。大抵是平时写写代码玩的时候单片机资源足够多,也从来不会去理会内存够不够的问题。

背景大概是这样的:某个项目写到一个数据处理函数,这里需要进行大量数据处理和拼接长字符串,需要大量的中间变量作为转存(超过1k长度的大数组),我左思右想到底是用全局变量?还是局部变量?抑或是利用malloc申请一段内存来使用,当时果断使用了定义在函数内的局部变量,理由是局部变量所占用的内存在该函数运行完之后即会自动释放,这样只会在短时间内占用cpu的ram,至于不使用malloc的理由是怕堆生长太大覆盖了栈区的内存。然而....,如果在函数内使用大数组的局部变量有可能会造成全局变量区的内存被覆盖,难不成使用全局?这样不会占用太多的RAM嘛?

--------宁可牺牲掉RAM的部分资源作为固定的内存,也不要这种随时可能爆炸的定时炸弹(大数组局部变量),因为它可能在某个时间节点内突然申请一块巨大的内存,到时候内存覆盖刷掉了全局变量的地址就真的GG了。仔细一想局部变量大数组还真的是一枚定时炸弹,开始重新去审视和理解关于单片机内存相关的知识。

说了一大段废话....

以下是我对该内容的一个整理:

单片机内存被分为flash和sram(ram),在查看任何一款单片机的时候都会有它们的介绍,可以看看最近使用的合泰单片机HT32F2253的介绍

我们看到它的flash是128KB、SRAM是16KB。(其实它的内存还算挺大的........)

以下是我按照自己的理解画的的一个内存结构图:

初始化前:

初始化后:

嗯...可以看到,初始化时RW-data从flash拷贝到RAM,所以在程序跑起来了Rw-data是在RAM里面的。

其中:Code为程序代码部分
RO-data 表示 程序定义的常量const temp;
RW-data 表示 已初始化的全局变量
ZI-data 表示 未初始化的全局变量

(以上这一段是copy的,原地址在:http://anlx27.iteye.com/blog/1575848)

而栈区(stack)、堆区(heap)、全局区(静态区)(static)、文字常量区和程序代码区和上面所介绍的code、RO-data等的关系。

1、栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 这些值是可读写的,那么stack应该被包含在RW-data(读写数据存储区),也就是单片机的sram中。

2、堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。可以理解,这些也是被包含在单片机的sram中的。

3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统释放。这些数据也是可读可写的,和stack、heap一样,被包含在sram中。

4、文字常量区:常量字符串就是放在这里的。这些数据是只读的,分配在RO-data(只读数据存储区),则被包含在flash中。

5、程序代码区:存放函数体的二进制代码,可以想象也是被包含在flash,因为对于MCU来说,当其重新上电,代码还会继续运行,并不会消失,所以存储在flash中。

(然而上这一段还是copy的,原地址在:http://www.51hei.com/mcu/4293.html)

下面是网上找的例子:

int a = 0;          // RW-data 全局初始化区
char *p1;           // ZI-data 全局未初始化区
const int b = 0;    // RO-data 只读变量区
main(void)
{int b;            // RW-data 栈区 char s[] = "abc"; // RW-data 栈区char *p2;         // RW-data 栈区char *p3 = "123456";     // "123456/0" 在Ro-data 常量区,p3在RW-data 栈区static int c =0;         // 全局(静态)初始化区 rw-data -> static区p1 = (char *)malloc(10);p2 = (char *)malloc(20); // 分配得来的10和20字节的区域就在Rw-data 堆区strcpy(p1, "123456");    // "123456/0" 放在常量区,编译器可能会将它// 与p3所指向的"123456"优化成一个地方
}

所以,重点来了,在实际编程中,应当实时关注.map的内容来判断单片机内存的使用情况。

在keil中,右击工程就会出现opne map flie的选项,打开它,浏览到最后一段

可以看到该工程占用单片机ram12.43kb,flash13.91kb。

关于单片机内存解释的整理相关推荐

  1. 关于单片机内存解释的整理(学习笔记篇)

    成就更好的自己 学习笔记篇 本文为转载,原文为CSDN博主dtj-ee 原文链接:https://blog.csdn.net/sinat_30146065/article/details/822211 ...

  2. 51单片机内存动态分配

    51单片机内存动态分配 序言 最近玩51单片机碰到一个问题,51中malloc函数并不能像在PC上一样正常运行,这涉及到了内存池的概念.下面就来演示一下如何在单片机上也可正常使用动态内存分配. 初始化 ...

  3. 一个简单而强大的单片机内存管理器-不带内存碎片整理

    单片机简单内存管理器 本代码基于无操作系统的STM32单片机开发.功能强大.可申请到地址空间连续的不同大小的内存空间,且用户接口简单,使用方便 转载请注明出处:http://blog.csdn.net ...

  4. java虚拟机的内存模型_JVM(Java虚拟机)内存模型(转载/整理)

    Java虚拟机包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回收堆和一个存储方法域.JVM是为Java字节码定义的一种独立于具体平台的规格描述,是Java平台独立性的基础. 对于字节码指令集不感兴 ...

  5. 51系列单片机开发培训资料整理

    第一部分 开发工具相关 Keil uVision2 压缩编译后的程序大小    http://blog.csdn.net/ex_net/article/details/7200406 第二部分 STC ...

  6. Ubuntu内存清理经验整理

    本文档用于整理记录清理ubuntu内存过程中的经验. 首先,可以使用内置程序"Disk Usage Analyzer"分析,直观看到哪些文件夹占用内存较大. 另外,也可以使用指令d ...

  7. 操作系统学习笔记(八):连续内存分配——碎片整理

    系统运行过程中,碎片越来越多,很可能无法获取需要的较大的内存空间.我们需要解决这个问题,这就是碎片整理的意义,可以通过碎片整理获得更大的连续内存空间,以便于满足进程的应用空间需求.碎片整理是通过调整进 ...

  8. STC89C52单片机定时器2详细整理

    51单片机是我自学的第一款单片机,那时正好是过春节,想起那个寒假,外面下着大雪,有时还会传来一两声爆竹的炸响,而我一个人在房间里摆弄单片机开发板,反复调试程序的时光,真是难忘! 我自认为这款单片机所有 ...

  9. 内存溢出_容易造成单片机内存溢出的几个陷阱

    [小宅按] 关于程序变量和内存分配,都是需要我们时刻关注的问题.我相信有不少人在这块犯过很多的错误,也可能说明我们基础不够扎实,编写程序的习惯也不够好. 总结一下关于程序的变量和内存方面的概念,虽然是 ...

最新文章

  1. 什么是闭包,我的理解
  2. junit测试@注解
  3. xcode 4.2 如何调试 EXC_BAD_ACCESS
  4. 第一届WebRTCon在上海举行
  5. Linux中以单容器部署Nginx+ASP.NET Core
  6. 虚拟化之四:虚拟化备份策略已成数据安全的焦点!
  7. pppoe拨号的外网ip无法ping通_【思唯网络学院】 五大网络概念:IP地址、子网掩码、网关、DHCP服务和PPPoE拨号...
  8. c++快速读取配置文件
  9. python 捕获多个异常_Python捕获多个异常
  10. 桌面被恶意软件放上几个ie图标删除不了怎么办?
  11. Django-天天生鲜项目
  12. Player-Controlled Cameras
  13. 深度学习中梯度消失原因、梯度爆炸及解决方案
  14. 控制天象,世间的最强者!
  15. 论文投稿指南——中国(中文EI)期刊推荐(第6期)
  16. 应聘华为的朋友小心了,应聘华为的悲惨遭遇!
  17. 软件测评师教程之软件测试基础
  18. 教程:FFmpeg命令行参数命令合集01.
  19. 【汇编语言实战】一元二次方程ax2+bx+c=0求解(含源码与过程截屏,可修改参数)
  20. 常用正则表达式-IP地址

热门文章

  1. Problem D: 平面上的点——Point类 (IV)
  2. 加载本地gradle配置
  3. 我的世界1.7.10服务器稳定内核,我的世界1.7.10[MCPC+][家用+专用+稳定][服务端客户端]仙人服务端简单整合...
  4. UVaOJ 401 Palindromes
  5. 计算机控制系统根据,计算机控制系统试题答案[汇编].pdf
  6. 无线牵起多个网络—美的无线网络解决方案
  7. 记一次测试工程师的线上面试
  8. 以太网控制器模块设计
  9. Java EE中Ajax技术简单实现
  10. Sqlite研究系列-1