一 电脑程序运行过程与单片机的区别
我们平常使用的电脑的程序是存储在磁盘中的,由于磁盘的读取速度很慢,所以为了避免程序阻塞,电脑在程序执行之前,会把整个代码复制到内存中,CPU从内存中读取指令,然后去运行。
为了合理利用和规划内存资源,除了操作系统的内存管理外,最重要的是内存的分段。对每一个进程,操作系统都会为其分配一个内存,同时将其分段为代码段、数据段、堆栈段等等,不同地段具有不同的属性。
电脑的运行模式不合适单片机使用,因为单片机没有磁盘,而且内存小。单片机的代码是保存在flash中,类似电脑的固态硬盘,CPU读取flash的速度慢于内存,但是这个速度已经很快了。
因此单片机的程序执行过程是,根据flash中的代码为函数分配堆栈和静态存储区,然后CPU读取flash中的指令,并读写内存中的数据进行运算。
二 单片机内存分配与c语言变量的存储位置
合理使用单片机的内存对于一名工程师来说是至关重要的,因为关系到项目代码的稳定性,一款产品是否能在市场生存的第一步就是要稳定。内存使用不合理也会造成程序BUG的出现,而且产品表现出来的形式也是千奇百怪,一些工程师就因为这个问题饱受折磨。
如果在项目中遇到大数组时,我们会遇到一个问题是该选择全局变量还是选择局部变量。局部变量所占用的内存在该函数运行完之后即会自动释放,这样只会在短时间内占用cpu的ram;用全局变量会占用许多的RAM资源。局部变量有一个潜在的不确定因素有可能会造成全局变量区的内存被覆盖。
这个时候我们宁可牺牲掉RAM的部分资源作为固定的内存,也不要埋下隐患(大数组局部变量),做产品要讲究稳定,避免后面要花费大量的人力物力去处理。处理好了产品的前途也毁掉一半了。
初始化时RW-data从flash拷贝到RAM,当程序启动完毕后Rw-data的存储位置就到RAM里了。
而栈区(stack)、堆区(heap)、全局区(静态区)(static)、文字常量区和程序代码区和RO-data等的关系。
1、栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 可读写的值(stack)包含在sram中。
2、堆区(heap):由程序员分配释放,包含在单片机的sram中的。
3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统释放。包含在sram中。
4、文字常量区:常量字符串储存的地方。数据是作为只读用的,分配在RO-data(只读数据存储区),包含在flash中。
5、程序代码区:存放函数体的二进制代码,可以想象也是被包含在flash,因为对于MCU来说,当其重新上电,代码还会继续运行,并不会消失,所以存储在flash中。
三RAM、EEPROM和flash的区别
存储器分为两大类:ram和rom。
ram 即 random access memery,可以随时存取数据的一种存储器,也就是可以读(取)也可以写(存)的存储器。通常作为操作系统或其他正在运行中的程序的临时数据存储介质。现在的单片机里面使用的RAM属于静态RAM或SRAM,这个和电脑用的内存条有所不同,只要你把数据写入SRAM后,只要不断电,或者不清除掉,这个数据就一直保存在那里。电脑使用的动态RAM,要不断给它加刷新脉冲才能保存数据。
ROM 即 Read Only Memory,只读式存储器,用作程序存储器,除了指令外,还包括运行程序必须的某些固定数据。
ROM 最初是不能编程,后来出现了prom,只能写一次,直到EPROM的出现改变了这一个现状,只要把芯片放在紫外线下照一下就可以擦除掉,这个改动拯救了一大批程序员,程序员终于可以随意地修改rom中的内容了,同时也提高了工作效率。
狭义的EEPROM:这种rom的特点是可以随机访问和修改任何一个字节,可以往每个bit中写入0或者1。这是最传统的一种EEPROM,掉电后数据不丢失,可以保存的时间非常地长,可以擦写100w次。具有较高的可靠性。
flash属于广义的EEPROM,因为它也是电擦除的rom。但是为了区别于一般的按字节为单位的擦写的EEPROM,我们都叫它flash。flash做的改进就是擦除时不再以字节为单位,而是以块为单位,一次简化了电路,数据密度更高,降低了成本。上M的rom一般都是flash。
这期我们的分享就到这里,喜欢的点个赞关注一下谢谢大家!
领取专属 10元无门槛券
私享最新 技术干货