1 电脑程序运行过程与单片机的区别
由于电脑中的程序是存储在磁盘中的,而磁盘的读取速度非常慢,因此我们不可能从磁盘中直接读取当前要执行的代码,这样必然导致程序阻塞。好在,电脑的内存非常大,所以在程序执行之前,先把整个代码copy到内存中,然后CPU从内存中读取一条条指令,并运行。
为了合理利用和规划内存资源,除了操作系统的内存管理外,最重要的是内存的分段。对每一个进程,操作系统都会为其分配一片内存,同时将其分段为代码段、数据段、堆栈段等等,不同的段具有不同的属性,比如代码段一般是只读的,如下图所示。(参考博客:https://blog.csdn.net/iostream1001001/article/details/77112455)
单片机首先没有磁盘,其次内存非常小,显然这种方式运行程序是不可能的。但好的一点是,单片机的代码是保存在flash中,相当于电脑的固态硬盘或ROM,CPU读取flash的速度虽然慢于内存,但依然是非常快的。因此我们不需要将代码搬移到内存中,直接从flash中读取就行了。
因此单片机的程序执行过程是,根据flash中的代码为函数分配堆栈和静态存储区,然后CPU读取flash中的指令,并读写内存中的数据进行运算。下面转载博客https://blog.csdn.net/sinat_30146065/article/details/82221179来详细说明。
注意:应该不是所有单片机都是这个启动过程,经验证,msp430f6638运行过程中程序是存储在ram中的,而不是直接从flash取指令。实验过程如下:
msp430f6638的代码保存在首地址为0x8000的segment中,可以擦除,擦除时是按segment擦除。设计实验如下,首先点亮D3/D4两个LED,延时1s后全部熄灭,然后擦除代码段,之后为while(1)循环闪烁D4。代码如下:
#include <msp430.h>
#include <stdio.h>
int main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
printf("hello");
P2DIR |= BIT7; P2OUT |= BIT7;
P8DIR |= BIT0; P8OUT |= BIT0;