1.1.1.计算机程序运行的目的
程序 = 代码 + 数据
代码就是函数,表示加工数据的动作。
数据包括全局变量和局部变量,表示被加工的东西。
程序运行的目的要么重在数据结果(有返回值),要么重在过程(无返回值),要么既重视结果又重视过程。
1.1.2.计算机程序的运行过程
计算机程序的运行过程,其实就是程序中很多个函数相继运行的过程。程序是由很多个函数组成的,程序的本质就是函数,函数的本质就是加工数据的动作。
1.1.3.哈佛结构和冯诺依曼结构
哈佛结构:哈佛结构就是将程序的代码和数据分开存放的一种结构,而他们存放的位置可以是相同的也可以是不同的(ROM&RAM或者RAM),总之只要是分成两个部分单独访问的结构都可以叫哈佛结构。(例如:51的程序运行时,代码放在ROM(NorFlash)中原地运行,而数据则存放在RAM中随代码动作而变动;而S5PV210程序运行时,代码和数据都在DRAM中运行,但是DRAM中又划分了代码段和数据段,二者互不干扰。)哈佛结构的特点就是代码和数据单独存放,使之不会互相干扰,进而当程序出BUG时,最多只会修改数据的值(因为代码部分是只读的,不可改写),而不会修改程序的执行顺序。因此,这种结构大量应用在嵌入式编程。
冯诺依曼结构:冯诺依曼结构是将代码和数据统一都放在RAM中,他们之间一般是按照程序的执行顺序依次存储。这样就会导致一个问题,如果程序出BUG,由于程序没有对代码段的读写限定,因此,它将拥有和数据一样的读写操作权限。于是就会很容易的死机,一旦代码执行出现一点改变就会出现非常严重的错误。但是,冯诺依曼结构的好处是可以充分利用有限的内存空间,并使CPU对程序的执行十分的方便,不用来回跑。
1.1.4.程序运行为什么需要内存?
对于S5PV210的程序来说,程序运行时要存放代码和数据,代码放在DRAM的只读权限代码段,数据放在DRAM的可读可写数据段,程序要跑,内存是必要条件 。
1.1.5.内存管理
从OS角度讲:OS掌握所有的硬件内存,因为内存很大,所以OS把内存分成1个1个的页面(其实就是分块,一般是4KB),然后以页面为单位来管理。页面内用更细小的方式来以字节为单位管理。(OS的内存管理原理复杂,对于我们使用OS的人来说,我们无需了解细节。OS为我们提供了内存管理的一些接口,我们只需要用相应的API即可管理内存。例如C语言中使用malloc、free这些接口来管理内存)。
在没有OS时,也就是裸机程序中程序需要直接操作内存,编程者需要自己计算内存的使用和安排。
从语言角度讲:不同语言提供了不同的操作内存的接口
汇编:根本没有内存管理,汇编中操作内存时直接使用内存地址(如0xd0020010)
C:C语言编译器帮我们管理内存地址,我们都是通过编译器通过的变量名来访问内存的,OS下如果需要大块内存,可以通过API(mallos、free)来访问内存。裸机程序中需要大块内存需要自己定义数组等来解决。
C++:C++对内存的使用进一步封装。我们可以用new来创建对象(其实就是为对象分配内存),然后使用完了用delete来删除对象(其实就是释放内存)。所以C++比C更容易一些。但是C++中的内存管理还是要靠程序员自己来做,例如需要使用delete删除对象释放内存,如果忘记,就会造成内存不能释放,就是所谓的内存泄露。
JAVA/C#等:这些语言不直接操作内存,而是通过虚拟机来操作内存。这样虚拟机作为我们程序员的代理,来帮我们处理内存的释放工作。如果程序申请了内存,使用后忘记释放,那么虚拟机会帮我们释放。看起来,JAVA/C#比C/C++有优势,但是虚拟机回收内存的机制也是要付出一定的代价。
嵌入式物联网的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而错失高薪offer。不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。在评论区私信“嵌入式”0元领取学习资源,让你的学习之路更加顺畅!记得点赞、关注、收藏、转发哦!