运算器以完成二进制的算术/逻辑运算部件ALU为核心,再加上暂存器TMP、累加器ACC、寄存器B、程序状态标志寄存器PSW及布尔处理器。

打开网易新闻 查看更多图片

累加器ACC是一个八位寄存器,它是CPU中工作最频繁的寄存器。在进行算术、逻辑运算时,累加器ACC往往在运算前暂存一个操作数(如被加数),而运算后又保存其结果(如代数和)。寄存器B主要用于乘法和除法操作。

标志寄存器PSW也是一个八位寄存器,用来存放运算结果的一些特征,如有无进位、借位等。其每位的具体含意如下所示。

对用户来讲,最关心的是以下四位。

1.进位标志CY(PSW7)。它表示了运算是否有进位(或借位)。如果操作结果在最高位有进位(加法)或者借位(减法),则该位为1,否则为0。

2.辅助进位标志AC。又称半进位标志,它反映了两个八位数运算低四位是否有半进位,即低四位相加(或减)有否进位(或借位),如有则AC为1状态,否则为0。

3.溢出标志位OV。MCS-51反映带符号数的运算结果是否有溢出,有溢出时,此位为1,否则为0。

4.奇偶标志P。反映累加器ACC内容的奇偶性,如果ACC中的运算结果有偶数个1(如11001100B,其中有4个1),则P为0,否则,P=1。

PSW:由于PSW寄存器存放程序执行中的状态,故又叫程序状态字。运算器中还有一个按位(bit)进行逻辑运算的逻辑处理机(又称布尔处理机)。

打开网易新闻 查看更多图片

文章相对比较长,字数比较多,大家可以先打开头像关注我,之后慢慢看,///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像左下角黑色字体加我也能领取哦。最近比较闲,带做毕设,带学生参加省级或以上比赛///

控制器

控制器是CPU的神经中枢,包括定时控制逻辑电路、指令寄存器、译码器、地址指针DPTR及程序计数器PC、堆栈指针SP等。

程序计数器PC是由16位寄存器构成的计数器。要单片机执行一个程序,就必须把该程序按顺序预先装入存储器ROM的某个区域。单片机动作时应按顺序一条条取出指令来加以执行。因此,必须有一个电路能找出指令所在的单元地址,该电路就是程序计数器PC。当单片机开始执行程序时,给PC装入第一条指令所在地址,它每取出一条指令(如为多字节指令,则每取出一个指令字节),PC的内容就自动加1,以指向下一条指令的地址,使指令能顺序执行。只有当程序遇到转移指令、子程序调用指令,或遇到中断时,PC才转到所需要的地方去。

存储器

存储器是单片机的又一个重要组成部分。其中每个存储单元对应一个地址,256个单元共有256个地址,用两位16进制数表示,即存储器的地址(00H~FFH)。存储器中每个存储单元可存放一个八位二进制信息,通常用两位16进制数来表示,这就是存储器的内容。存储器的存储单元地址和存储单元的内容是不同的两个概念,不能混淆。

虽说接触了好久的单片机或者说嵌入式开发,不过对于有些概念还是比较模糊,因此此系列将会从一些零碎的小知识点出发,慢慢的遍历整张嵌入式开发的地图。

这次先来看一下中断向量表。

至于为什么会提到中断向量表,主要是因为我自己在学习嵌入式Linux开发的过程中,好像学到的所有开始阶段都是要通过汇编完成的,好像没有汇编程序,整套系统就无法运行,那作为一套完整的系统,究竟从上电开始程序究竟是怎么运行起来的,发生中断的时候,程序又是怎么跳转到指定的函数去执行的呢,在这里将会给大家一个一个具体的轮廓,从感性上理解,究竟系统是怎么工作起来的。

程序是从main函数执行的吗???

首先明确一点,单片机上电开始执行的第一条指令肯定不是我们在main函数中写的第一条指令,在此之前,我们需要汇编程序完成一些初始化的工作,那么这时候有一个问题,

汇编程序的第一条代码从哪里开始运行的呢??

在ARM架构的芯片下,不出意外,程序都是从0X00000000最开始的位置执行的,那程序从这里运行,接下来要完成什么工作呢,那就不得不提到中断向量表,说是中断向量表,不如说是从0X00000000开始的固定的一段内容。 这段内容以四个字节为单位,每个字节保存一个地址,当芯片处于不同的状态时,就会根据这段内容跳转到对应的地址去执行对应的程序。 以Cortex-A7的i.MX6ULL芯片为例,可以看到,从0开始的每四个字节对应一个中断类型,这个表的顺序是固定的,每个位置存储的都是一个要跳转到的地址。

打开网易新闻 查看更多图片

那么知道了每个位置存放一个跳转地址之后,我们的程序究竟是怎么开始的。

对单片机感兴趣的朋友可以找我我录制了一些关于单片机的入门教程有需要的童鞋找我拿就行免费的私信我“林老师”就可以拿点击打开我的头像就能领取

芯片上电程序执行流程

当芯片上电以后,我们在上面表格中寻找一个于程序上电比较接近的中断,毫无意外,我们选择复位中断,平常玩单片机的时候,大家不都是出了bug,队友就说,复位一下单片机吧,这里的复位可以是我们去按单片机的复位按钮,也可以断电重新上电,所以重新上电约等于复位这个思想在我们的脑子里是根深蒂固的。

那么结果显而易见,芯片上电了,他发现自己是重新上电而产生的复位中断,由上图可知,那么程序会在0X00开始执行,但是这个地方只保存了一个地址,那么程序跳转到0X00之后会立马跳转到这个位置保存的地址执行,程序就跳转到了另一个地方,然后在这里通过汇编代码进行堆栈设置,为C语言运行创造条件,最后再跳转到main函数执行,这才是真正到了main函数。