时间: 2024-07-03 09:19:36 | 作者: 华体会app怎么样
1)哈佛结构-介绍哈佛结构通常要和冯.纽曼结构对比来介绍。我们熟悉的8086就是一种典型的冯.纽曼结构,它的程序和数据是共用同一个存储空间,CPU也是使用同一个来访问它们。那么,取指令和取数据势必分时来进行,这就限制了数据的流量。和它相对应的哈佛结构,则是不同。哈佛结构的典型特点是程序和数据是分立的空间,CPU对程序和数据的访问也是使用完全独立的两套总线。所以,相对于冯.纽曼结构,它可以同时从两个空间取指令和取数据,这就增加了数据流量。而且,因为两个总线互不相干,所以,程序总线和数据总线能做到不一样宽。在设计之初选择了哈佛结构,并基于程序总线位指令宽度的单片机系列,分别对应的是PIC低档系列,PIC16中档系列,以及PIC18系列单片机。这里要说明的是,数据总线位,所以不管它的指令宽度是多少,它仍然还是8位单片机。
2)指令流水线操作-大部分的单片机,取指令和执行的过程是顺序进行的。PIC单片机在设计时引入了指令流水线的设计,使得单片机的取指和执行可以同步进行。我们的角度来看下面的指令取指和执行过程图示。
从这个图示上,我们大家可以看到取指和执行是如何同步进行的,也可以理解到,指令可以在一个指令周期内执行。但是,当有程序分支时(如CALL,GOTO或直接修改PC)是例外的,需要多花一个指令周期。图示上标有*号的地方,你能够正常的看到,在执行CALL SUB_1这条指令时,同时预取了第4条指令BSF PORTA,3,程序是要调用SUB_1子程序,那么这条指令显然是错误预取的。但是不用担心,单片机的硬件会自动在下一个指令周期里刷掉被错误预取的指令4,同时在该指令周期内预取SUB_1标号处的指令,那么接下来的Tcy5就是执行子程序的指令了。从这个过程我们就能够理解,为什么程序分支时,需要两个指令周期了。
3)单字指令,长字指令-因为程序和数据是完全独立存储的,所以指令和数据的宽度可以不一样。PIC单片机的指令宽度有12位,14位和16位几种,分别对应低中高三档的系列。以中档PIC16系列单片机为例,它的指令字长是14位的,我们把它叫做长字指令。如何个“长”法,来看一个例子
PIC单片机指令示例:MOVLW0x55(解释,给W工作寄存器赋立即数55H)
从图示上,你可以清楚的看到PIC16的一条指令是一个14位的长字,这个长字的前面部分是操作码,后半部分是操作数。和其他单片机比较来看,同样功能操作的指令,会被翻译成操作码字节和操作数字节,两个字节。所以,从这里,你可以得到一个概念,就是,PIC的一条长字指令,大约等于其他单片机的两个字节的指令。反映到程序空间上,就是PIC的1K字的程序空间,大约相当于其他单片机的2K字节的程序空间。当然,这个比例不是绝对的,不同的代码会有不一样的比例结果,但是这个1:2的近似结果有助于你在选择PIC单片机型号时作为参考。对于长字指令,还有着另一个好处,就是:程序指针PC指向的任何地方都是一个指令长字,即使PC跑飞,所指向的也是一条合法的长字指令(因为操作码的设计覆盖了所有的二进制组合),这样你就可以方便地用“陷阱”或“填充”等手段来减小PC跑飞带来的误操作。相对应地,操作码和操作数分为两个字节的单片机,一定程序上,存在PC跑飞后把操作数当成操作码来译码的风险。尽管现在的单片机设计都有一定手段来克服这种PC错位,但是它还是没有PIC单片机这种单字指令来得方便。
上面就是PIC中档单片机的全部35条指令,这些指令可能对于初学者,显得很陌生,但是当你去看英文数据手册时,就会理解,这些指令,基本都是一句英文的首字母缩写,比如BTFSC,就是Bit Test File register Skip if Clear(位测试某f寄存器,如果为0则跳过一条指令)。一共就这35条指令,就算你一开始不习惯,要不断看指令表,但我想如果你开始写程序,一天下来应该就能记住所有的指令。想想别的单片机一百多条指令,某些日系的8位单片机竟有四百多条指令,不是那么容易背下来吧。
5)文档寄存器 - 英文的原文是file Register。在PIC单片机中只有两类寄存器,一类是W,Working Register工作寄存器,只有一个,相当于51的A累加器,其他的所有寄存器都是F寄存器,也就是文档寄存器。这里的“文档”,是一个形象的描述,你可以理解除了W之外的所有通用RAM和特殊功能寄存器都是一个个的文档,当需要操作的时候,取出某个文档,和W经过ALU中央运算单元运算后,结果既可以放到W里,也可以放到该文档寄存器里。这里要强调的是,所有的通用RAM和特殊功能寄存器(如端口,控制寄存器等)都是文档寄存器,所以对他们操作的指令都是一样的。象有些单片机,对端口访问,对普通RAM,对特殊功能寄存器的操作都要用不同的指令,相比起来,PIC单片机要方便得多。
下图是PIC单片机内部结构框图。当然在学习单片机时,不是必须要了解芯片内部究竟时如何工作的。但是,大略地看看这个图,可以对PIC的某些特点有个初步的印象。从图上你能够正常的看到程序总线和数据总线是相互独立的,在图的左下角你可以看到片内已经做好了上电复位,掉电复位,看门狗,振荡器起振延时器等为了增强单片机运行可靠性的模块,在程序指针(Program Counter)下面,你会看到一个和其他单片机不一样的地方,堆栈(Stack)。PIC单片机的堆栈是硬件堆栈,它和PC的宽度是一样的。当发生中断或者程序调用时,当前指令的PC+1(要清楚,前面讲过流水线,执行某条指令时,同时在预取PC+1处的指令)整个压入堆栈,返回时整个退栈。硬件堆栈和某些单片机在RAM空间里开辟的堆栈相比,有一个好处,就是不需要过多的担心因为堆栈的错误溢出而影响RAM区域,而且,你可以选择压栈后并不退栈,直接GOTO到其他处理。但是它也有自己的局限性,因为它是硬件的,所以堆栈的级数是有限的。对于PIC中档单片机,硬件堆栈只有8级,所以CALL的嵌套别超过7级;对于PIC18系列,硬件中断则有31级。或许,你会担心堆栈不够用,但是,实际上,一个程序CALL嵌套超过7级的实在很少,而且,可完全通过改变程序流程来保证堆栈不会溢出的。