前言
为什么突然要写这样一篇文章呢?主要原因是因为最近一个项目最初没有计算好所需要的RAM空间,加上我对系统规划的不合理,导致了各种各样看上去十分玄学的问题。所以就需要对RAM进行一定的了解。
RAM
##RAM介绍
RAM,一个外行人也略知一二的词汇,初步的认知可以理解为程序在运行过程中的数据存储区域,其RAM容量越大,可以运行的负荷也就越大,用平常话来说叫带的动,那么详细来说,有哪些数据会存在RAM里面呢?
RAM中存储的数据主要是DATA还有BSS1,还有一些只读的数据有时也会存储在RAM当中,这些数据是我们程序在正常运行过程中,CPU需要调用到的,那为什么CPU不直接去内存拿而是需要这么一段RAM呢?
这是因为我们从RAM中读取数据要远远快于从FLASH中读取数据,RAM的中文名叫随机存储器,也就是说从该内存中任何一个位置读取数据的速度都是一样的,不过其代价是价格一般是FLASH的6倍,因此在每个项目开始时我们应当对RAM进行预计,确保自己的RAM在60%~70%之间,我觉得是比较合理的,这样既有利于去开发我们系统的稳定性,也可以比较随意的去添加新的功能去适应市场需求。
FLASH
FLASH在嵌入式的地位类似于手机的ROM ,其作用是为了存储只读数据和程序,这对很多产品而言是非常实际的功能,类似于手机,电视机,电子表等一切需要人们进行菜单设置的智能电子产品,FLASH存储即是不可或缺的功能,如果说RAM是嵌入式的神经,那么FLASH就是RAM的大脑,即便睡一觉醒来(掉电),也会记得之前的重要数据。
堆和栈
这是几乎每一个IT行业的人都需要知道的基本知识,堆和栈的主要区别是堆是先进后出,而栈是先进先出。
栈中存放的是程序中的局部变量,所以为什么中断里面不要嵌套太多层函数的原因就在这里,中断处理函数当中不允许做太多的事,而过多的有参数传递的函数封装会增加压栈的次数,所以中断里面尽量要干净明了。不要嵌套太多层。
而堆中的数据主要是对象,对于嵌入式而言更多的是数组,所以我们在挂操作系统任务分配内存的时候,其内容是存在堆中的,所以RAM大小的预估一定要考虑操作系统的影响,
指程序中未初始化或者初始化为0的全局变量和静态变量的区域。 ↩︎