franksunny的个人技术空间
获得人生中的成功需要的专注与坚持不懈多过天才与机会。 ——C.W. Wendte

 

关于变量的存储问题

 

以前从事上位机程序代码的编写,压根不用很具体的考虑变量的具体存放位置,只知道以下概念就行了:

1. 堆区( heap ):由程序员申请分配和释放,属动态内存分配方式,变量存放于动态存储区,若程序员不释放,程序结束时可能会由 OS 回收。不过这个内存分配很容易引起问题,如果申请的内存不释放就会造成内存泄漏;如果释放的不是所要释放的内存,则轻者引起程序运行结果出错,重者系统崩溃。在C/C++语言中就是用mallocfree(C++常用newdelete)申请和释放的内存。

2.栈区( stack ):编译器自动分配释放,存放函数的形参值、局部变量的值,也是属于动态内存分配方式,存放位置也为动态存储区,它由系统分配,所以执行效率也高,不过自由度小,声明时就得决定其具体大小。

3.全局区(静态区)( static ):全局变量和静态变量的存储是放在一块的,属于静态存储区,而且初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放,所以也不会造成内存问题。

除了以上的变量外,还有两类存放位置,文字常量区和程序代码区,两者都是由系统分配和释放,且文字常量区和前面三区合成为程序数据区,与程序代码区相对应。

以上所讲的内存,都只是RAM而并非ROM,因为在上位机编程中我们不可能去动内存储器的ROM,通常说的内存条就是RAM。(记得上周跟华为的人面试,还在那边胸有成竹地讲RAMROM呢,现在想来真是惭愧得很)

 

现在工作中用到MSP430Flash类型的mcu,在编程时考虑就不能那样迷迷糊糊的了,首先mcu给的RAM毕竟有限,能到4K已经很贵了,为此很多变量像表格数据之类的必须和程序一起放到ROM中去。

我用到的IAREWB for 430的编译器,它内在规定就是加const 定义的变量和代码段被放到ROM中,全局(以及静态)变量和局部变量的位置仍然在RAM中,这些量显然掉电时也是会跟着掉的。不是说const的定义的是“常量”吗,是不能更改的啊,但是我要用到的变量是要更改的,那该怎么办呢?不错我们在程序中是不能直接进行修改这些数据量了,但是可以通过写flash操作来对其进行修改。也许有人会觉得我大惊小怪,大概因为我以前学单片机不够用心吧,总之到现在用的时候才知道些ROMRAM的确切不同。

上面提到的const定义的“常量”及其它具体的关于constC/C++语言中的用法,可以参看Effictive C++More Effictive C++以及网络上其它人的总结。以下给出一些别人总结的转载,我觉得还是蛮有益。如果有侵权,请通知本人

存储器外存储器

1.         内存储器

1.       内存的基本概念

内存(内存储器)是微型计算机主机的组成部分,用来存放当前正在使用的或随时要使用的程序或数据。

CPU可以直接访问内存。

微机以字节为单位线性地组织内存储器,每个存储单元(一个字节)都有一个唯一的编号。24位地址总线可以提供的地址编号为224=16M字节。

内存储器按其工作特点分为:只读存储器ROMRead-Only Memory)和随机存取存储器RAMRandom Access Memory)。

2.   RAM的种类

 动态内存DRAMDynamic RAM):需要周期性地给电容充电(刷新)。这种存储器集成度较高、价格较低,但由于需要周期性地刷新,存取速度较慢。一种叫做SDRAM的新型DRAM,由于采用与系统时钟同步的技术,所以比DRAM快的多。当今,多数计算机用的都是SDRAM

 静态内存SRAMStatic RAM):静态RAM是利用双稳态的触发器来存储"1""0" 的。"静态"的意思是指它不需要像DRAM那样经常刷新。所以,SRAM比任何形式的DRAM都快得多,也稳定得多。但SRAM的价格比DRAM贵得多,所以只用在特殊场合(如高速缓冲存储器Cache)。

3.       内存条

内存集成电路比CPU芯片小一些,通常封装在一条形电路板上,俗称内存条。

4.       高速缓冲存储器

为提高CPU的处理速度,当今计算机中大都配有高速缓冲存储器(cache),也称缓存,实际上是一种特殊的高速存储器。

缓存的存取速度比内存要快,所以就提高了处理速度。

多数现代计算机都配有两级缓存。

一级缓存也叫主缓存,或内部缓存,直接设计在CPU芯片内部。一级缓存容量很小,通常在8KB ~ 64KB之间。

二级缓存也叫外部缓存,不在CPU内部而是独立的SRAM芯片,其速度比一级缓存稍慢,但容量较大,多在64KB ~ 2MB之间。人们讨论缓存时,通常是指外部缓存。

CUP需要指令或数据时,实际检索存储器的顺序是:首先检索一级缓存,然后二级缓存,再往后是RAM

5.       只读存储器

只读存储器(Read Only Memory,缩写ROM)不能写入而只能读出数据,其中的信息是在制造时一次写入的。

只读存储器常用来存放固定不变、重复使用的程序、数据或信息,如存放汉字库、各种专用设备的控制程序等。最典型的是ROM BIOS(基本输入/输出系统),其中部分内容适用于启动计算机的指令,内容固定但每次开机时都要执行。存储在ROM中的指令叫微程序,这样的ROM成为固件。

其他形式的只读存储器

 可编程只读存储器PROMProgrammable ROM):一种空白ROM,用户可按照自己的需要对其编程。输入PROM的指令叫作微码,一旦微码输入,PROM的功能就和普通ROM一样,内容不能消除和改变。

 可擦除的可编程的只读存储器E-PROMErasable Programmable ROM),可以从计算机上取下来,用特殊的设备擦除其内容后重新编程。

 闪存(flashROM,它不像PROMEPROM那样只能一次编程,而是可以电擦除,重新编程。闪存ROM常用于个人电脑、蜂窝电话、数字相机、个人数字助手等,其容量在1 ~ 40MB之间。

6.       CMOS存储器

CMOSComplementary metal oxide)互补金属氧化物半导体

计算机需要保存一些配置信息,如硬盘驱动器和键的类型;日期、时间以及其它启动计算机所需要的信息等。他们不需要频繁变化,又不能一成不变,需要时(升级或更换设备)要适当变化。

CMOS存储器可以满足这种要求。计算机关机后仍能维持其中存储的信息。COMS中的信息可以改变,比如计算机更换硬盘之后,可以通过执行CMOS配置程序与机器交互,更改CMOS中的信息。

2.         外存储器

外存储器一般不直接与微处理器打交道,外存中的数据应先调入内存,再由微处理器进行处理。为了增加内存容量,方便读写操作,有时将硬盘的一部分当做内存使用,这就是虚拟内存。虚拟内存利用在硬盘上建立"交换文件"的方式,把部分应用程序(特别是己闲置的应用程序)所用到的内存空间搬到硬盘上去,以此来增加可使用的内存空间和弹性;当然,容量的增加是以牺牲速度为代价的。交换文件是暂时性的,应用程序执行完毕便自动删除。

磁盘存储器 有以下三部分组成: 软磁盘驱动器 软磁盘控制器 软磁盘片:3.5英寸5.25英寸两种 3.5英寸软磁盘:

     磁道(track):从外向里编号为0 ~ 79,共80道。

扇区(sector):在每个磁道上划分18个扇区,编号为0 ~ 17,共18个扇区。每个扇区的容量为512K个字节。

簇(cluster):若干个扇区构成一个簇,它是磁盘存储分配的单位。

格式化:用户对软盘的初始化操作,其包括磁道数、扇区数的划分以及软盘初始信息的写入。 软盘容量的计算公式: 80 18 512 2=1474560字节=1440K字节≈1.44MB 写保护口:若该口可以透光,则此盘处于写保护状态,即:只能读取信息,不能写入数据。反之,可读可写。

 

关于SDRDDRRAMBUS公司RDRAM  关于当前PC用内存条方面的一个帖子

 

posted on 2007-06-01 15:00 frank.sunny 阅读(3059) 评论(2)  编辑 收藏 引用 所属分类: 硬件开发概念扫盲

FeedBack:
# re: 关于变量的存储问题
2007-06-04 14:05 | picasa
挺全面  回复  更多评论
  
# re: 关于变量的存储问题
2008-01-14 20:21 | qi
很棒的总结!!  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理



常用链接

留言簿(13)

随笔分类

个人其它博客

基础知识链接

最新评论

阅读排行榜

评论排行榜