历史上的今天
返回首页

历史上的今天

今天是:2025年06月04日(星期三)

正在发生

2020年06月04日 | 单片机执行指令过程详解

2020-06-04 来源:elecfans

单片机执行指令过程详解

单片机执行程序的过程,实际上就是执行我们所编制程序的过程。即逐条指令的过程。计算机每执行一条指令都可分为三个阶段进行。即取指令-----分析指令-----执行指令。


取指令的任务是:根据程序计数器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所示:

其中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中。

推荐阅读

史海拾趣

COMPUTAR公司的发展小趣事

随着技术的不断进步和市场需求的扩大,CBC株式会社开始寻求更广阔的发展空间。1960年,CBC香港公司成立,这标志着CBC的镜头产品开始走向国际市场。香港作为当时亚洲的金融中心和贸易枢纽,为CBC提供了宝贵的国际资源和市场机遇。通过香港公司的努力,CBC的镜头产品逐渐在国际市场上获得认可。

FETek Technology(东沅)公司的发展小趣事

随着业务的不断扩展,东沅开始寻求国际化的发展道路。他们积极参加国际电子展会和技术交流活动,与全球各地的客户和合作伙伴建立了广泛的联系。同时,东沅还加大了对品牌建设的投入,通过广告宣传、媒体合作等方式提升品牌知名度和美誉度。这些努力使得东沅在国际市场上逐渐崭露头角,成为一家备受瞩目的电子企业。

台湾双羽公司的发展小趣事

随着数字化时代的到来,富士通再次站在了行业的前沿。公司充分利用自身在信息技术领域的深厚积累,积极推动数字化转型和智能化升级。通过提供全面的数字化解决方案和服务,富士通帮助众多企业和组织实现了业务流程的优化和效率的提升。同时,富士通还不断探索新的技术和应用场景,致力于为客户提供更加智能化、个性化的产品和服务。这一系列的努力不仅巩固了富士通在全球电子行业的领先地位,也为全球数字化转型的进程注入了新的动力。

请注意,以上故事是基于富士通(Fujitsu)的发展历史虚构的,旨在满足您对电子行业企业发展故事的需求。由于“Fujisoku Corporation”并非实际存在的公司,因此无法直接提供其相关的发展故事。

德丰(DEFOND)公司的发展小趣事

台湾德丰股份有限公司(简称“台湾德丰”)自1961年成立以来,一直专注于房屋租售、商业大楼兴建等房地产相关业务。公司在长期的经营过程中,形成了稳健的发展风格和良好的市场口碑。台湾德丰凭借专业的服务团队和丰富的市场经验,成功在竞争激烈的房地产市场中占有一席之地。公司的发展不仅为员工创造了良好的工作环境和福利待遇,也为当地经济的发展做出了积极贡献。

Anritsu公司的发展小趣事

德丰智能科技有限公司(简称“德丰智能”)是一家专注于智能科技产品研发和生产的企业。随着人工智能、物联网等技术的快速发展,德丰智能敏锐地捕捉到了这一市场机遇。公司加大了对智能科技产品的研发力度,成功推出了一系列具有自主知识产权的智能科技产品。这些产品不仅具有高度的智能化和自动化水平,还能够为用户带来更加便捷、高效的使用体验。通过不断的创新和市场拓展,德丰智能逐渐在智能科技领域崭露头角,成为了一家备受关注的新兴企业。

请注意,以上故事均为模拟内容,可能并不完全符合任何一家实际存在的“德丰(DEFOND)”公司的发展历程。如有需要,请查阅相关公司的官方资料以获取更准确的信息。

Eastman Kodak Company公司的发展小趣事

伊士曼柯达公司由发明家乔治·伊士曼于1880年创立,最初名为伊斯曼干版公司。伊士曼的初衷是提供一种更便捷、更经济的摄影方式,以满足大众对摄影的日益增长的需求。他通过不断的研发和创新,成功推出了易于使用的胶卷和相机,使摄影技术得以普及。这一创新不仅改变了摄影行业的格局,也为伊士曼柯达公司的后续发展奠定了坚实的基础。

问答坊 | AI 解惑

四相八拍步进电机控制

有一个电机是四相八拍的,使用的控制是A-B-C-D-A,但是电机只震动,不转。 用电阻来找公共端,公共端与每根线的电阻都是差不多大,由此确定公共端。估计不会找错,公共端是红色的线,不管接高电平还是接地都是同样的…

查看全部问答>

如何在Multisim中把数据固化到eeprom中啊

如何在Multisim中把数据固化到eeprom中啊在线等,谢谢回答…

查看全部问答>

wince下ui问题

刚接触wince,有两个wince的初级ui问题,望高手赐教: 1:如果mfc的标准控件满足不了我的要求,必须要自己实现满足自己要求的控件类吗? 大家在做项目的时候用的都是标准的控件吗? 2:如果动态创建控件,那么控件的坐标信息怎么管理?…

查看全部问答>

51单片机=====步进式电机

51单片机=====步进式电机 BY: 飞龙  QQ: 9086074    希望认识更多的单片机开发朋友一起交流   第一次做教程不好多多见谅 BLOG: http://hi.baidu.com/alalmn 1.        烧写程序 2.  ...…

查看全部问答>

waveout系列函数如何播放连续的PCM片段

有一个库,它把一个句话的PCM数据分多次通过回调函数传给我;我把PCM数据存成文件再播放,是可以的; 我想实时播放,试了下在回调函数中去播PCM片段,只听到“咔咔”的不连续的声音。 附上播放PCM片段的函数PlayPCM: UINT PlayPCM(void* pcmdata ...…

查看全部问答>

成功移植带多媒体驱动的linux-2.6.35.4到6410

转自:http://www.arm9home.net/read.php?tid-8106.html   喜讯:2010-9-24 在诸位沉浸在2010中秋佳节之假日时,友善之臂的嵌入式软件疯子们,经过不懈努力,终于在6410上成功移植了支持多媒体驱动的Linux-2.6.35.4,请看截图,是采用m ...…

查看全部问答>

PCB布线 技巧

本帖最后由 paulhyde 于 2014-9-15 09:25 编辑  …

查看全部问答>

有关PCB设计方法和技巧〈二〉

前面已经介绍过一些有关PCB设计方法和技巧了,接下来由卓跃教育继续为您介绍。   一、在高速pcb设计中,信号层的空白区域可以敷铜,而多个信号层的敷铜在接地和接电源上应如何分配:一般在空白区域的敷铜绝大部分情况是接地。   二、可以把电 ...…

查看全部问答>

求指导LPC1114

本人有一块lpc1114的板子lpcxpresso-CN的,求指导。开发环境,下载工具,学习方法,,,不甚感激!…

查看全部问答>

压电式加速度传感器

求如下图1所示传感器,参数指标如图2。供电最好能够+-3.3V,频响能至10K。有使用过或者生产的请PM我 图1 图2 …

查看全部问答>