历史上的今天
返回首页

历史上的今天

今天是:2025年01月13日(星期一)

正在发生

2020年01月13日 | AVR单片机为何要写1作为清0中断标志位

2020-01-13 来源:eefocus

关于“为何AVR使用写1作为清0中断标志位的手段”这个问题我看过很多的相关资料。在AVR的手册中并没有给出为什么的解释,只是强调了“写1清0中断标志位”。同时我也看到很多新的芯片,如DSP等,也是采用写1清零标志位的。但没有找到更专业的,或从根源上的说明,如果那位有这方面的知识或资料,欢迎深入的讨论学习。


下面是我个人的分析和解释,供参考。

1。首先从硬件上的考虑,通常的读写处理单元是以8BIT字节为单位的,因为数据总线一般是8位的倍数。这样对位的操作就不方便,不能直接写1位(会改变其它的位),需要先读到寄存器,然后改动1位,最后回写,需要更多的时间。


2。对于RAM操作一般采用直接写的方式,所以对RAM基本上没有直接的位操作指令。而对于寄存器是可以直接位操作的,但如果对所有的寄存器都能实现位操作,那么硬件结构上就非常复杂和庞大了,所以必须采用一种折中的处理方法。


3。现在的趋势是采用C语言编写系统程序,而标准的C中,没有位变量的概念,最小的单位也是字节。因此硬件的设计上面也要考虑能发挥C语言的优势。


以上是我分析的原因。因为已经超出了我研究的方向(我侧重于应用),可能不全面或有偏差。下面回到AVR本身。

AVR单片机为何要写1作为清0中断标志位

我们可以注意到:

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时间。


b)SBI、CBI。这2条指令是对前32个(注意:仅对前32个I/O空间!)I/O空间的寄存器的位进行设置的指令。这2个指令的执行时间是2个CK。AVR对寄存器操作的指令大多数都是1个CK,而这2个指令为何需要2个CK?原因在与写的时候还是8位一起写,因此改变1位需要先读,修改1位,再回写。这样保证了其它位不变,但时间需要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这样的形式的。

推荐阅读

史海拾趣

Fibrefab Limited公司的发展小趣事

Fibrefab Limited公司自创立之初,就致力于光纤通讯技术的研发。面对当时市场上光纤连接产品技术瓶颈,Fibrefab投入大量资源,成功研发出具有更高稳定性和更低损耗的光纤连接器。这一创新不仅解决了行业痛点,也帮助Fibrefab迅速在市场上树立起技术领先者的形象。随着技术的不断迭代升级,Fibrefab逐渐在光纤通讯领域确立了其市场领导地位。

American Power Design Inc公司的发展小趣事

随着数字化时代的到来,APDI意识到数字化转型对于提升公司运营效率和市场竞争力的重要性。公司开始引入先进的生产管理系统和数据分析工具,实现了生产过程的自动化和智能化。同时,APDI还加强了与客户的在线互动和定制化服务,提升了客户满意度和忠诚度。数字化转型使APDI在激烈的市场竞争中保持了领先地位。

这些故事是基于电子行业的一般趋势和可能的公司发展路径虚构的,旨在展示一个假设公司在不同发展阶段的可能经历。它们并不代表任何真实公司的历史或情况。

Ceratech Corporation公司的发展小趣事

在电子行业中,压敏技术是一项重要的技术。Ceratech Corporation公司针对这一领域进行了深入研究和探索。公司研发团队经过多次试验和改进,成功研发出具有自主知识产权的压敏产品。这些产品不仅具有高灵敏度和高稳定性,而且能够适应各种复杂环境。通过压敏技术的研发与应用,Ceratech Corporation进一步提升了其在电子行业的技术实力和市场竞争力。

Bce Sud公司的发展小趣事

随着技术的成熟,Bce Sud开始积极拓展市场,与多家电子设备制造商建立了合作关系。通过与这些企业的紧密合作,Bce Sud的产品逐渐应用于智能手机、平板电脑等消费电子产品中。同时,公司还积极寻求与上下游企业的战略合作,共同推动产业链的升级与发展。

C&K Components公司的发展小趣事

进入千禧年代,随着全球经济的融合和科技的快速发展,ITT Industries看中了C&K在开关领域的领先地位和强大实力,决定对其进行收购。这次并购使C&K成为ITT的开关部门,但公司仍然保留了C&K的名称和品牌。并购后的C&K借助ITT的全球资源和平台优势,进一步提升了自身的研发能力和市场竞争力,实现了更快速的发展。

AW Industries Inc公司的发展小趣事

随着市场竞争的加剧,AW Industries Inc意识到只有不断创新才能在行业中立足。公司加大了对研发的投入,并成功研发出了一款具有革命性的新型电子元件。这款元件不仅性能卓越,而且成本更低,迅速在市场上占据了主导地位。这一创新成果不仅为公司带来了丰厚的利润,也奠定了其在电子行业的领先地位。

问答坊 | AI 解惑

英国设计太阳能充电衣为随身设备充电

人们外出旅行时,为手机、MP3等随身设备寻找电源充电是件麻烦事。英国广播公司25日报道,英国科研人员正在设计一种利用太阳能充电的外衣,它可以解决这个问题。     据报道,日本富士通公司和德国西门子公司的合资企业在英国剑桥设有 ...…

查看全部问答>

FPGA问题集锦, 基于FPGA的以太网控制器设计

上传个资料看看啥感觉 [ 本帖最后由 yuanhang8240 于 2009-4-28 07:56 编辑 ]…

查看全部问答>

Ce6.0摄像头驱动不支持高分辨率格式的YUV

按照微软给的例子Camera_null来开发摄像头驱动,最近一直有个困扰,因为camera sensor ov3640过来的是YUV格式,拍照时候用到QXGA(2048*1536)分辨率,但DShow不支持,现象是CameraDshowApp.exe程序进入时候查询Pin,最终失败!我的设置如下: /* 00 ...…

查看全部问答>

请教 SPI wifi 调试

    平台:2440      wifi 模块:WM-G-MR-09 现在把GSPI8686.reg 导入,在platform.bib文件中打包 ;------------------------------SPI wifi--------------------------- GSPI8686.dll      &nbs ...…

查看全部问答>

大型ARM+linux+android嵌入式技术专题公益讲座

华清远见武汉华嵌中心将于2010年4月24日下午1:00-5:00在武汉大学联手ARM中国公司,开展“基于ARM平台的嵌入式系统设计专题讲座”。 详情请点击: http://www.embedhq.org/html/mianfei/2010/0408/382.html…

查看全部问答>

普通Linux驱动与嵌入式Linux驱动的区别

我们通常所说的Linux设备驱动和和嵌入式Linux设备驱动有神什么区别,同等情况下哪种更有钱途些…

查看全部问答>

在MIcrosoft下载了一个vs2005的evaluateion版,结果出现这个问题...

是一个2.7G的img,用winrar解压后运行vs目录里的setup.msi,结果出现windows Installer的错误“无法打开此安装程序包。请与应用程序供应商联系,以确认这是一个有效的windows Installer程序包” 这是为什么呢?好不容易下载的啊…

查看全部问答>

请教误码仪的问题~~

请问有人做过误码仪吗?最近在做一个误码仪,有个问题卡在那边,问题是要我产生误码,之后就是让我检测误码,码型为NRZ,RZ,AMI,HDB3码,关于NRZ,RZ码我就不知道了,这种码还能判断误码?…

查看全部问答>

渥瑞达“3G移动开发”免费试听课于北京交通大学举行,欢迎大家光临!

渥瑞达“3G移动开发”免费试听课于北京交通大学举行,欢迎大家光临! 渥瑞达“3G移动开发”免费试听课于北京交通大学举行,欢迎大家光临! 详情请参见 www.neworigin.net 同时欢迎大家与我们的609期学员交流!这期学员已与2月11日毕业 ...…

查看全部问答>