控制/MCU
通常我们写的单片机程序放在哪里了?ROM和RAM有什么区别?有没有关系呢?程序又是怎么工作起来的?其实通常这些问题对于单片机初级工程师来说可能都是大大的问号,好多人可能会让单片机工作起来,比如有例程,然后根据烧录工具的流程走一遍就觉得会用单片机了,好多人会想单片机如此简单还有什么可学的。
太多人是不学底层的工作原理,也不想。觉得那么多库函数和例程,用起来就可以了。可是自己真的懂吗?碰到问题你会解决吗?所以还是会了别人不会的才是有更多选择的资本。
RAM:随机存储器,掉电数据会丢失,也就是会存储一些临时数据。
ROM:只读存储器,掉电数据不会丢失,主要存储程序数据以及常量数据或需要存储的变量数据
概念有了,到底是怎么工作起来的?
单片机运行时需要调用程序或者函数时就需要读取ROM,然后在RAM中执行这些程序或者函数的功能,所产生的临时数据也都存在RAM,掉电后临时数据就会丢失了。
程序经过编译、汇编、链接后生成HEX文件,然后再通过烧录器将HEX文件烧录到ROM中。
那么ROM是只读存储器,CPU只能从里面读数据,而不能往里面写数据,掉电后数据依然保存在存储器中。RAM是随机存储器,CPU可以从里面读取数据也可以写数据,掉电不保存。
那么这里就涉及到了单片机启动的过程了,就像我们电脑,手机这些设备开机都需要一个启动过程,就相当于初始化的过程,并不是直接跑到主程序的,单片机也是一样,这个就是启动流程,之后才会跑到主程序运行的。
启动流程我们拿ST的一款来说一下,其他厂家的也是大同小异的。通常,当处理器从复位启动时,它首先会访问 0 地址的向量表,复位时处理器首先读取向量表的前 2 个字,第一个字为堆栈指针 MSP 初始值;第二个字为复位向量,它表示程序执行的起始地址。当读取到复位地址之后,会自动跳到复位向量处开始执行程序。简单的说上电的时候就是要从地址0x0000 0000处开始的,那么从地址0处开始存储了一个向量表,就是我们说的中断向量表。换句话来讲,我们写的代码是在FLASH区域的,那么复位向量地址也是在FLASH区域,那么就相当于程序跳到了FLASH存储区开始执行代码。
那么RAM上电数据不是人为写入的,就是CPU写入的,就是上电启动后CPU开始从ROM中包含的所有程序内容第一行代码处开始执行指令的。然后为后面整个程序运行做准备,需要对RAM进行初始化。
首先是对变量分配地址空间,有已赋初值的全局变量,就需要将初值从ROM中拷贝到RAM中。
没有赋初值,就是随机值。
其次设置堆栈的地址,一般我们只用到栈空间,也就是中断处理时的“保护现场”和“恢复现场”的作用。
最后分配代码中的数据段,也是从ROM中拷贝到RAM中来分配起始地址。
启动之后完成这些准备工作就是根据不同的指令一条一条的执行了,发生中断的时候会根据中断向量表找到中断服务函数去执行中断,整个程序就这样的过程跑起来了。
全部0条评论
快来发表一下你的评论吧 !