本学习是基于嵌入式的C语言学习记录(课程内容来源于某位老师的网络课程,为了证明不是在打广告,就不写出老师的名字了,感谢。)
--------------------------------------------------
首先弄明白程序是什么?计算机为什么需要编程?
编写程序的目的是为了去运行,从而得到一些结果。顾名思义计算机就是用来计算的,所以计算机的所有程序就是在计算,那么计算机在计算什么呢?当然是在计算数据,因此,数据是程序的重要组成。推出:计算机程序 = 代码 + 数据。那么程序运行后得到的结果就是:代码 + 原始程序 = 新的数据。
从形象的宏观上看,代码就是加工数据的动作,数据就是代码所要加工的东西。
例如下面几行代码(一个简单函数):此函数(num_p)就是执行两个数的相加代码,它执行的动作是将两个数据(形参int num_1 ,int num_2)相加,得到一个新的数据。
int num_p(int num_1 ,int num_2)
{
return num_1 + num_2;
}
计算机程序运行过程
计算机程序运行的过程就是多个函数相机运行的过程。程序是由多个函数组成,函数是程序的本质,函数的本质工作就是加工数据。
为什么需要内存
首先要知道什么是内存:(硬件和逻辑两个角度)
从硬件角度:内存实际上是电脑的一个配件(一般叫内存条)。根据不同的硬件实现原理还可以把内存分成SRAM和DRAM(DRAM又有好多代,譬如最早的SDRAM,后来的DDR1、DDR2·····、LPDDR)
从逻辑角度:内存是这样一种东西,它可以随机访问(随机访问的意思是只要给一个地址,就可以访问这个内存地址)、并且可以读写(当然了逻辑上也可以限制其为只读或者只写);内存在编程中天然是用来存放变量的(就是因为有了内存,所以C语言才能定义变量,C语言中的一个变量实际就对应内存中的一个单元)。
内存是用来存储数据的,是编程和程序运行的本质需求,英文名(一般也是这样叫)是RAM,有DRAM和SRAM之分。根据存储方式的不同,内存有冯诺依曼结构和哈佛结构两种。 冯诺依曼结构是:数据和代码放在一起。哈佛结构是:数据和代码分开存在。比如:在S5PV210(本人目前正在学习的芯片)中运行的linux系统上,运行应用程序时:这时候所有的应用程序的代码和数据都在DRAM,所以这种结构就是冯诺依曼结构;在单片机中,我们把程序代码烧写到Flash(NorFlash)中,然后程序在Flash中原地运行,程序中所涉及到的数据(全局变量、局部变量)不能放在Flash中,必须放在RAM(SRAM)中。这种就叫哈佛结构。
单说内存
从逻辑角度来讲,内存实际上是由无限多个内存单元格组成的,每个单元格有一个固定的地址叫内存地址,这个内存地址和这个内存单元格唯一对应且永久绑定。
逻辑上的内存就好象是一栋无限大的大楼,内存的单元格就好象大楼中的一个个小房间。每个内存单元格的地址就好象每个小房间的房间号。内存中存储的内容就好象住在房间中的人一样。
理想条件下,内存可以有无限大(因为数学上编号永远可以增加,无尽头)。但是现实中实际的内存大小是有限制的,譬如32位的系统(32位系统指的是32位数据线,但是一般地址线也是32位,这个地址线32位决定了内存地址只能有32位二进制,所以逻辑上的大小为2的32次方)内存限制就为4G。实际上32位的系统中可用的内存是小于等于4G的(譬如我32位CPU装32位windows,但实际电脑只有512M内存)。
内存的量化
对于内存的量化,前人、大佬们已经订好了规则。一般有四种:位、字节、半字和字。有些地方会有双字,但据我所知不常用,而且半字、字和双字这三个单位的大小是依赖变化的。
对于任意的系统平台来说,一位就是1bit,一个字节就是8bit,是永远不会变化的。
半字、字和双字在一些系统中大小是不定的,但是有一点是不变的:双字的大小永远的字的大小的两倍,字的大小永远是半字的两倍。
内存位宽(硬件和逻辑两个角度)
从硬件角度讲:硬件内存的实现本身是有宽度的,也就是说有些内存条就是8位的,而有些就是16位的。那么需要强调的是内存芯片之间是可以并联的,通过并联后即使8位的内存芯片也可以做出来16位或32位的硬件内存。
从逻辑角度讲:内存位宽在逻辑上是任意的,甚至逻辑上存在内存位宽是24位的内存(但是实际上这种硬件是买不到的,也没有实际意义)。从逻辑角度来讲不管内存位宽是多少,我就直接操作即可,对我的操作不构成影响。但是因为你的操作不是纯逻辑而是需要硬件去执行的,所以不能为所欲为,所以我们实际的很多操作都是受限于硬件的特性的。譬如24位的内存逻辑上和32位的内存没有任何区别,但实际硬件都是32位的,都要按照32位硬件的特性和限制来干活。