shupeng_avr 发表于 2008-8-16 15:31:23

AVR全局全能中断 #define sei() __asm__ __volatile__ ("sei" ::) 是

如题.

不理解__asm__ __volatile__ ("sei" ::) 是什么意思?

517456 发表于 2008-8-16 17:37:29

开中断

Etual 发表于 2008-8-16 21:48:14

GCC 嵌入汇编的写法
1,标准C语言没有实现开关中断,所以需要内联汇编来实现。

__asm__ __volatile__ ("sei" ::)

__asm__ 是关键字,标明后面的是汇编代码。
__volatile__标识这代码是可变的,防止被编译器优化,其实在这里没有用。
("sei" ::)
sei 就是汇编指令,后面两个冒号隔开了两个操作数,输入和输出。

这里都没有,所以留空,其实两个冒号不写也是可以的。 :)

shupeng_avr 发表于 2008-8-17 09:57:49

我知道这是一个开中断.为什么"sei"后面没有根相应的位怎么就开了中断呢?主要这是我不明白的地方.
同时谢谢2楼回答...
也希望二楼再详细的讲一下.我是刚开始学这个单片机.

shupeng_avr 发表于 2008-8-17 10:00:38

哦,对了.还有这句ICC里面的
#pragma interrupt_handler timer0_comp_isr:iv_TIM0_COMP
讲解一下这个..
是怎么跳过来执行中断的.

zht_omc 发表于 2008-8-17 13:01:34

楼主逗大家玩呢,为什么1+1 = 2呢

Etual 发表于 2008-8-17 14:20:35

很简单,因为AVR单片机不是我们设计的。人家设计的人说
“你用一条 sei 指令就可以开中断了”那么我们只能照着办 :)

当然,如果到时候你有能力设计MCU的时候,你也可以设计一个指令集
“我设计的指令集, nop 是开中断的!!!”那也没有人管你呢 ,(不被人扁的话 ....)
轮到人家照着办了~~~嘿嘿~~~

具体你参考一下AVR的汇编指令就OK了。sei没有参数的。

#pragma interrupt_handler timer0_comp_isr:iv_TIM0_COMP
我没有用ICCAVR,你问问其他人吧。
不过道理也很简单,都说了C语言没有实现开关中断的,所以必须做一些扩展
只是ICC用了 #pragma 作为扩展的关键字 interrupt_handler 再说明是中断处理
其实这些都是说给编译器听的,编译器会自动设置中断向量。

shupeng_avr 发表于 2008-8-17 15:12:27

谢谢大家了,新手。让你见笑了。

zxj1985092 发表于 2009-11-3 15:19:59

顶下!

kunL 发表于 2012-8-26 16:02:42

顶,新手有很多指令都不知道~tks{:smile:}

Kidult 发表于 2013-3-24 20:59:49

shupeng_avr 发表于 2008-8-17 10:00 static/image/common/back.gif
哦,对了.还有这句ICC里面的
#pragma interrupt_handler timer0_comp_isr:iv_TIM0_COMP
讲解一下这个..


#pragma interrupt_handler 是所有的中断服务程序开头必须有的,你照用就行了。timer0_comp_isr是对应的中断向量号,iv_TIM0_COMP
是中断服务程序(函数)的名称,必须要和你接下来要写的函数名称一样!比如:

#pragma interrupt_handler timer0_comp_isr:iv_TIM0_COMP
voidiv_TIM0_COMP()
{
            //中断服务程序代码
}



Kidult 发表于 2013-3-24 21:00:23

shupeng_avr 发表于 2008-8-17 10:00 static/image/common/back.gif
哦,对了.还有这句ICC里面的
#pragma interrupt_handler timer0_comp_isr:iv_TIM0_COMP
讲解一下这个..


ICC很好用的,

戴风海 发表于 2015-9-20 11:06:33

顶下{:smile:}{:smile:}
页: [1]
查看完整版本: AVR全局全能中断 #define sei() __asm__ __volatile__ ("sei" ::) 是