跟电师傅学单片机(6):单片机工作过程
头条号:电工人家,专门请电师傅讲解单片机应用技术,倾力奉献,机会难得,力求做到图文并茂、通俗易懂。欢迎电工电子爱好者关注和阅读,留言讨论,共同学习与提高,分享和普及电知识。
课前一语:你的好运气藏在你的实力里,也藏在你不为人知的努力里,你越努力,就越幸运!
单片机的工作过程:
就是不断取指令和执行指令的过程,一步一步地执行下去。
演示过程举例:
MOV A,#09H;把数据09H送到累加器A中。
机器码:74H 09H;74H代表累加器A,09H是数据(data)。
指令-机器码-说明
机器码:
是单片机能识别的指令,是存放在存储器里面的,是从单片机存储单元0000H开始放起。
要想被单片机内部识别和执行,十六进制要换算成二进制。
十六进制74H=二进制0111,0100;
十六进制09H=二进制0000,1001;
0000H:0111,0100;先放在存储单元000H
0001H:0000,1001;再放在存储单元001H
程序计数器(PC)作用:
始终是指示下一条将要执行指令的地址,当指令被取出来后,它会自动加1,又会指向下一条将会执行指令的地址。在程序运行过程中,它相当于一个指挥棒,它指到那里,程序就运行到那里,程序就会执行这条指令。
执行指令演示:
执行指令流程图
取指令:
程序计数器PC先将地址0000H,通过红色箭头路线传送到地址译码器中,通过地址译码得出:是要在存储器单元0000H中取0111,0100(74H),通过红色箭头路线传送到指令寄存器中进行译码,通过指令译码得出:是要将09H这个数据传送到累加器A中。当地址0000H被取出后,程序计数器PC自动加1变为0001H,也就是下一条将要执行的地址。
执行指令:
程序计数器PC将地址0001H,通过紫色箭头路线传送到地址译码器中,通过地址译码得出:是要在存储器单元0001H中取数据0000,1001(09H),通过紫色箭头路线传输到累加器A中,指令执行完毕。
当地址0001H被取出后,程序计数器PC自动加1变为0002H,也就是下一条将要执行的地址。为取下一条指令作准备。
编程目的:
就是编制正确的程序放入存储器中,由单片机自动取指令和执行指令,并输出程序相对应的控制信号。
详解单片机程序的运行过程
从单片机上知道,在上电的那一刻,MCU的程序指针PC会被初始化为上电复位时的地址,从哪个地址处读取将要执行的指令,由此程序在MCU上开始执行(当然在调用程序的 main之前,还有一系列其他的的初始化要做,如堆栈的初始化,不过这些我们很少回去修改)。PC在上电时,和MCU差不多,不过读取的是BIOS,有它完成了很多初始化操作,最后,调用系统的初始化函数,将控制权交给了操作系统,于是我们看到了Windows,Linux系统启动了。
如果将操作系统看作是在处理器上跑的一个很大的裸机程序(就是直接在硬件上跑的程序,因为操作系统就是直接跑在CPU上的,这样看待是可以的,不过这个裸机程序功能很多,很强大),那么操作系统的启动很像MCU程序的启动。前者有一个很大的初始化程序完成很复杂的初始化,后者有一段不长的汇编代码完成一些简单的初始化。这一点看,它们在流程上是很相似的。
详解单片机程序的运行过程
如果是系统上的程序启动呢?它们是由系统来决定的。Linux上在shell下输入。/p后,首先检查是否是一个内建的shell命令;如果不是,则shell假设他是一个可执行文件(Linux上一般是elf格式),然后调用一些相关的函数,将在硬盘上的p文件的内容拷贝到内存(DDR RAM)中,并建立一个它的运行环境(当然这里边还有内存映射,虚拟内存,连接与加载,等一些其他东西),准备执行。
由以上可知,单片机上的程序和平时在系统上运行的程序,在启动时差异是很大的(如果将程序调用main以前的动作,都抽象为初始化的话,程序的启动可以简化为:建立运行环境+调用main函数,这样程序的执行差异是不大的)。因为单片机上跑的程序(裸机程序),是和操作系统一样跑在硬件上的,它们属于一个层次的。过去之所以没有区分出单片机上的程序和PC机上的程序的一些差异,就是没有弄明白这一点。
由此,以前的一些疑惑也就解开了。为什么在单片机上的程序不怎么使用malloc,而PC上经常使用?因为单片机上没有已经写好的内存管理算法的代码,而在PC上操作系统里运行的程序,libc已经把这些都做了,只需要调用就可以了。如果在单片机上想用动态内存,也可以,但是这些代码要自己去实现,并定义一个相应的malloc,有时候一些公司会给提供一些库函数可能会实现malloc,但是因为单片机上RAM内存十分有限,如果不知道它的运行方式,估计会很危险。同样,因为在PC的系统上运行的程序与逻机程序的不同,裸机程序不会有动态链接,有的只是静态链接。
关于程序在执行时,从哪里读取指令,哪里读取数据,也曾因为没有弄清楚系统上的程序和裸机程序之间的区别,而疑惑了很久。虽然在《微型计算机原理》课上知道程序运行时,从内存中读取指令和数据进行执行和回写。但是单片机上只有几K的RAM,而flash一般有几十K甚至1M,这个时候指令和数据都在内存中吗(这里指的内存仅指RAM,因为PC上我们常说的内存就是DDR RAM memory,先入为主以至于认为单片机上也是这样,还没有明白其实RAM和Flash都是内存)?这不可能,因为课上老师只说内存,但是PC上内存一般就是DDR RAM,不会是硬盘,硬盘是保存数据的地方;由此类比时,自己把自己弄晕菜了,单片机的RAM对应于DDR RAM,那Flash是不是就对应于硬盘了呢?在CSAPP上明白了,PC上之所以都在DDR RAM上,是速度的因素。
硬盘的速度太慢,即使是即将到来的SSD比起DDRRAM,还是差着几个数量级,所以拷贝到DDRRAM中。这时,一个程序的代码和数据是连续存放的,其中代码段是只读区域,数据段是可读写区域(这是由操作系统的内存管理机制决定的)。运行时,再将它们拷贝到速度更快的SRAM中,以得到更快的执行速度。而对于,单片机而言工作频率也就几M,几十M,从Flash中与从RAM中读的差异可能并不明显,不会成为程序执行的瓶颈(而对于PC而言,Flash的速度太慢,DDRRAM的速度也是很慢,即使是SRAM也是慢了不少,于是再提高工作频率也提高不了程序的执行速度,所以现在CPU工作频率最快是在2003左右。一个瓶颈出现了。
为了提高CPU的使用率,换个角度想一下,既然不能减少一段程序的执行时间,就在同样的时间执行更多的程序,一个核执行一段程序,两个核就可以执行两段程序,于是多核CPU成为了现在的主流)。所以裸机程序指令就在Flash(Flash memory)中存放,而数据就放在了RAM中(flash的写入次数有限制,同时它的速度和RAM还是差很多)。更广泛说,在单片机上RAM存放data段,bss段,堆栈段;ROM(EPROM,EEPROM,Flash等非易失性存储设备)存放代码,只读数据段。本质上说,这和PC上程序都在RAM中存放是一样的,PC 上是操作系统规定了可读与可写,而单片机上是依靠不同的存储设备区分了可读与可写(当然现在的Flash是可读写的,如果Flash没有写入次数限制,速度又可以和RAM相差不多,单片机上是不是只要Flash就可以了呢(直接相当于PC上的DDRRAM)?这样成本也会比一个RAM,一个Flash低,更节省成本,对于生产商更划算)。
对于单片机的程序执行时指令和数据的存放与读取,理解如下:
对单片机编程后,程序的代码段,data段,bss段,rodata段等都存放在Flash中。当单片机上电后,初始化汇编代码将data段,bss段,复制到RAM中,并建立好堆栈,开始调用程序的main函数。以后,便有了程序存储器,和数据存储器之分,运行时从Flash(即指令存储器,代码存储器)中读取指令 ,从RAM中读取与写入数据。RAM存在的意义就在于速度更快。
无论是单片机也好,PC也罢,存在的存储器金字塔都是一致的,速度的因素,成本的限制导致了一级级更快的存储器的更快速度与更高的成本。应该说,对于它们的理解,就是存储器金字塔的理解。
相关问答
单片机 是怎么 工作 ?[回答]很多小伙伴是不是都不知道单片机是如何工作的呢?不过没关系,现在就由旺扬科技小编为大家揭晓,希望对大家有所帮助。单片机的工作过程就是一个不断...
单片机 是如何 工作的 呢?[回答]单片机的工作过程就是一个不断“取指令-分析指令-执行指令”的过程。深圳市凌芯微电子有限公司多年来已服务于上千家芯片公司,如有需要可通过官网咨...
单片机 开机的基本步骤?单片机开机基本步骤如下:1.内核初始化;2.强制PC指针指向中断向量表的复位中断向量执行复位中断函数;3.在复位中断函数中调用SystemInit函数,初始化时钟,...
单片机 内部由哪几部分构成?各部分电路的主要功能是什么?_作业帮[最佳回答]单片微型计算机是制作在一块集成电路芯片上的计算机,简称单片机.它包括微处理器(CPU),用RAM构成的数据存储器,用ROM构成的程序存储器,定时/计数器,...
C51 单片机 中断系统的 工作过程 ?c51单片机中断系统包括请求、响应、执中断服务程序和退出4个工作过程。中断请求需要在程序中事先设置允许/禁止、优先级、请求模式等。响应中断时,单片机会在...
单片机 由哪几部分组成,最小系统是什么?答1.单片机由中央处理器(含部分特殊功能寄存器)、内部RAM、程序存储器、各种外设(IO端口、定时器、串行接口、中断处理电路等等)及对应控制寄存器、时钟电路...
PLC是以扫描方式 工作的 , 单片机 是以什么方式 工作的 啊?PLC的工作方式为循环扫描。由于计算机每个时间点只能做一个工作,所以PLC是通过循环的工作方式来完成控制的,每个循环周期按次序分为三个阶段,即输入采样、程...
51 单片机 T0定时器4种方式的定时时长分别是多少 - 懂得51单片机最大硬件定时时间,就是定时器能定时的时间,最长时间=65536*TcTc=fosc/12,fosc是单片机的晶振频率。以频率=12M为例吧,Tc=1us最大定时时间=6...
如果我想能看懂 单片机的 程序,需要怎样学习语言?非常感谢你发来的邀请,我很高兴回答你的问题!现在单片机编程语言主要有两种,一种是汇编语言、一种是C语言。汇编语言要求要对单片机内部结构有要熟悉,由于其...
单片机 温度报警器实验步骤?温度报警器就是需要温度传感器不停地对监控的对象进行检测,例如pt100温度传感器,pt100传感器是不同温度下,阻值会不同,在同一温度下,阻值是相同的。根据这个...