单片机履行指令进程详解
单片机履行程序的进程,实际上便是履行咱们所编制程序的进程。即逐条指令的进程。计算机每履行一条指令都可分为三个阶段进行。即取指令—–剖析指令—–履行指令。
取指令的使命是:依据程序计数器PC中的值从程序存储器读出现行指令,送到指令寄存器。
剖析指令阶段的使命是:将指令寄存器中的指令操作码取出后进行译码,剖析其指令性质。如指令要求操作数,则寻觅操作数地址。
计算机履行程序的进程实际上便是逐条指令地重复上述操作进程,直至遇到停机指令可循环等候指令。
一般计算机进行作业时,首要要经过外部设备把程序和数据经过输入接口电路和数据总线送入到存储器,然后逐条取出履行。但单片机中的程序一般事前咱们都已经过写入器固化在片内或片外程序存储器中。因此一开机即可履行指令。
下面咱们将举个实例来说明指令的履行进程:
开机时,程序计算器PC变为0000H。然后单片机在时序电路效果下主动进入履行程序进程。履行进程实际上便是取出指令(取出存储器中事前寄存的指令阶段)和履行指令(剖析和履行指令)的循环进程。
例如履行指令:MOV A,#0E0H,其机器码为“74H E0H”,该指令的功用是把操作数E0H送入累加器,0000H单元中已寄存74H,0001H单元中已寄存E0H。当单片机开端运转时,首要是进入取指阶段,其次第是:
1 程序计数器的内容(这时是0000H)送到地址寄存器;
2 程序计数器的内容主动加1(变为0001H);
3 地址寄存器的内容(0000H)经过内部地址总线送到存储器,以存储器中地址译码电跟,使地址为0000H的单元被选中;
4 CPU使读操控线有用;
5 在读指令操控下被选中存储器单元的内容(此刻应为74H)送到内部数据总线上,由于是取指阶段,所以该内容经过数据总线被送到指令寄存器。
至此,取指阶段完结,进入译码剖析和履行指令阶段。
由于本次进入指令寄存器中的内容是74H(操作码),以译码器译码后单片机就会知道该指令是要将一个数送到A累加器,而该数是在这个代码的下一个存储单元。所以,履行该指令还必须把数据(E0H)从存储器中取出送到CPU,即还要在存储器中取第二个字节。其进程与取指阶段很类似,仅仅此刻PC已为0001H。指令译码器结合时序部件,发生74H操作码的微操作系列,使数字E0H从0001H单元取出。
由于指令是要求把获得的数送到A累加器,所以取出的数字经内部数据总线进入A累加器,而不是进入指令寄存器。至此,一条指令的履行完毕。单片机中PC=0002H,PC在CPU每次向存储器取指或取数时主动加1,单片机又进入下一取指阶段。这一进程一向重复下去,直至收到暂停指令或循环等候指令暂停。CPU便是这样一条一条地履行指令,完结一切规则的功用。
关于一款MCU来说,在功能描绘的时分都会告知sram,flash的容量巨细,关于初学者来说,也不会去考虑和理睬这些东西,拿到东西就只用。其实不然,这些量都是十分重要的,细心想想,代码为什么能够运转,代码量是多少,界说的int、short等等类型的变量究竟是怎样分配和存储的,这些问题都和内寸有联系。
首要单片机的内存能够巨细分为ram和rom,这儿就不再解说ram和rom的区别了,咱们能够将其等效为flash和sram,其间依据flash和sram的界说可得,flash里边的数据掉电可保存,sram中的并不能够,可是sram的履行速度要快于flash,能够将单片机的程序分为code(代码存储区)、RO-data(只读数据存储区)、RW-data(读写数据存储区)和ZI-data(零初始化数据区)。在MDK编译器下能够观察到在代码中这4个量的值,如下图1所示:
图1:
其间code和RO-data存储在flash中,所以两者之和为单片机中flash需求分配给它们的空间巨细(而且等于代码所生成的.bin文件巨细),别的RW-data和ZI-data存储在sram中,相同两者之和为单片机中sram需求分配给它们的空间巨细。
别的,咱们必然会想到栈区(stack)、堆区(heap)、大局区(静态区)(staTIc)、文字常量区和程序代码区和上面所介绍的code、RO-data等的联系。
1、栈区(stack):由编译器主动分配开释 ,寄存函数的参数值,局部变量的值等。其操作方法类似于数据结构中的栈。 这些值是可读写的,那么stack应该被包含在RW-data(读写数据存储区),也便是单片机的sram中。
2、堆区(heap):一般由程序员分配开释, 若程序员不开释,程序完毕时或许由OS收回 。能够了解,这些也是被包含在单片机的sram中的。
3、大局区(静态区)(staTIc):大局变量和静态变量的存储是放在一块的,初始化的大局变量和静态变量在一块区域, 未初始化的大局变量和未初始化的静态变量在相邻的另一块区域,程序完毕后由体系开释。这些数据也是可读可写的,和stack、heap相同,被包含在sram中。
4、文字常量区:常量字符串便是放在这儿的。这些数据是只读的,分配在RO-data(只读数据存储区),则被包含在flash中。
5、程序代码区:寄存函数体的二进制代码,能够幻想也是被包含在flash,由于关于MCU来说,当其从头上电,代码还会持续运转,并不会消失,所以存储在flash中。
综上所述,MCU的内存分配根本如此,其间并没有说到存储空间所对应的flash和sram地址,这些后边还会讲到!如有过错,请纠正。