关于“为何AVR运用写1作为清0中止标志位的手法”这个问题我看过许多的相关材料。在AVR的手册中并没有给出为什么的解说,仅仅强调了“写1清0中止标志位”。一起我也看到许多新的芯片,如DSP等,也是选用写1清零标志位的。但没有找到更专业的,或从本源上的阐明,假如那位有这方面的常识或材料,欢迎深化的评论学习。
下面是我个人的剖析和解说,供参阅。
1。首先从硬件上的考虑,一般的读写处理单元是以8BIT字节为单位的,由于数据总线一般是8位的倍数。这样对位的操作就不便利,不能直接写1位(会改动其它的位),需求先读到寄存器,然后改动1位,最终回写,需求更多的时刻。
2。关于RAM操作一般选用直接写的办法,所以对RAM根本上没有直接的位操作指令。而关于寄存器是能够直接位操作的,但假如对一切的寄存器都能完成位操作,那么硬件结构上就非常复杂和巨大了,所以有必要选用一种折中的处理办法。
3。现在的趋势是选用C言语编写体系程序,而规范的C中,没有位变量的概念,最小的单位也是字节。因而硬件的规划上面也要考虑能发挥C言语的优势。
以上是我剖析的原因。由于现已超出了我研讨的方向(我侧重于运用),或许不全面或有误差。下面回到AVR自身。
咱们能够留意到:
1。AVR没有“位”空间,也就是说没有独自的“位”地址,一切的位寻址是依据8位的寄存器的,所以根本寻址办法是以寄存器为主的。
2。因而AVR没有专门的位寻址指令,它自身的位操作指令很少,都是在寄存器寻址的基础上,对寄存器的某位进行操作。
3。除了对状况寄存器SREG中的位有直接的操作指令外(SREG太特别了,有必要要有专用的位操作指令),能够对其它寄存器的位操作的指令只要2个。
a)BST、BLD。这个指令的周期是1CK,他是将SREG中的T标志位与32个通用寄存器的位之间交流数据的指令。假如要对32个寄存器的1位进行设置的话(比方置1),有必要先运用指令将SREG中的T置1,然后运用BLD指令将T的值写到寄存器的某位。需求2个CK时刻。
4。正是由于第3点(b),所以PA、PB、PC、PD等I/O口的寄存器均在前32个I/O空间,这样就完成了便利的独自的按位操控I/O口了。
5。不同C编译器,位处理是不同的。ICC、IAR根本没有扩展位处理,按规范C来处理,由于他们考虑的可移植性愈加多些。而CVAVR扩展了位变量(放在32个作业寄存器中)和位操作(仅能对I/O空间前32个寄存器),因而用户运用起来更便利些。但要留意,对I/O空间后32个寄存器,CVAVR也不能完成位操作的。
最终看一下中止标志位的处理。在AVR中对中止标志位的处理是依据不同状况选用不同的处理办法的,在上面的英文阐明中现已给出了解说。有的是进入履行中止由硬件铲除,有的是读某个寄存器后由硬件铲除。而软件铲除一般是写“1”,为什么?
看一下M16的手册,发现外部中止标志寄存器GIFR(0X3A)、和T/C的中止标志寄存器TIFR(0X38),都在I/O空间的后32个地址中,并且全部是中止标志寄存器。因而不管是ICC、IAR、仍是CVAVR,必定不能运用SBI、CBI指令对位操作了,只能是对1个寄存器8位一起写操作了。
那么,一般在C中怎么改动1方位1呢?一般我们以为正确的句子是:XXXX |= 0B00000001;其功用是将XXXX先读出,然后同0B00000001或,使最低位为1,其它位坚持不变。实际需求3条汇编指令的。改动1方位0:XXXX &= 0B11111110;相同需求3条汇编指令的。
AVR选用写“1”清“0”中止标志位(写“0”不影响标志位),那么句子就能够直接运用TIFR = 0B00000001了,只需求2条汇编。将最低位的标志位清“0”,一起确保了其它标志位的不变。(!!!留意,反而运用TIFR |= 0B00000001是过错的!!!由于,假如其它的位自身是1的话,这样反而也被清掉了)
别的,写“0”清“0”中止标志位的话,那么写“1”到中止标志位的话应该怎么界说呢?中止标志位应该是硬件置1的,假如软件能够置1,会带来更多的费事。
实际上,上面的英文解说仍是不全面的,简单引起一些误解。
a)只能关于TIFR、GIFR运用TIFR = 0B00000001这样的句子,由于只要这两个寄存器中,全部都是中止标志位。
b)而关于一些其它的中止标志位,假如它地点的寄存器中还有一些对错中止标志位的,就有必要运用XXXX |= 0B00000001的写法了。
c)关于非中止标志位的设置,仍是有必要运用XXXX |= 0B00000001这样的方式的。
来历;21ic