avr中断嵌套嵌套包含达到极限怎么办

热搜TAGS:
AVR复位和中断处理及中断嵌套【转载】
AVR复位和中断处理及中断嵌套【转载】----------------非常感谢原作者,谢谢。AVR提供了几种不同的中断源。这些中断和复位向量在程序存储器空间内都有自己单独的程序向量。所有中断都被分配一个私有的使能位,要想使能某一中断,就要向其使能位写入逻辑1,而且要把状态寄存器中的全局中断使能位置1。程序存储器空间最低的一些地址,被默认定义为复位和中断向量。完整的向量列表见“中断”部分。该列表也决定了不同中断的优先级。地址越小,优先级越高。RESET具有最高的优先级,其次是INT0——外部中断请求0。详细讨论见“中断”部分。当某个中断产生时,全局中断使能位I被清零,所有中断都被禁止。用户程序可以向I位写入1,以实现中断嵌套。所有已使能的中断就可以中断当前的中断程序。当从中断指令——RETI——的执行返回时,I位被自动置位。基本上有两种类型的中断。第一种是由事件触发的,把中断标志置位。对于这些中断,程序计数器被引导到实际的中断向量,以执行中断处理程序,同时硬件把相应的中断标志清除。通过向要清除的标志位位置写一个逻辑1,也可以被清除中断标志。如果中断使能位被清除后,相应的中断条件发生时,中断标志将被设置,而后保持到中断被使能为止,或者由软件把标志清除。类似地,如果在全局中断使能位被清除后,一个或多个中断条件产生时,相应的中断标志将被设置,并保持到全局中断使能位被设置为止,然后按优先级顺序执行。第二种中断,只要中断条件存在,就会被触发。这些中断没有必要具有中断标志。如果中断条件在中断被使能前消失,那么中断将不被触发。当AVR从一个中断中退出时,它一般会返回主程序,并且执行再执行一条指令后,才会响应后续的中断。注意,当进入中断程序时状态寄存器不会自动保存,当从中断程序返回时,它也不会自动恢复。这必须由用户软件来完成。当使用CLI指令禁能中断时,中断将立即被禁能。当CLI指令执行后,将没有中断再被执行,即使中断在CLI执行的同时发生。下例所示为怎样使用CLI指令来避免在定时的EEPROM写时序期间避免产生中断。汇编代码例子inr16, SREG; 保存SREG值 在定时程序中禁能中断sbiEECR, EEMWE; 开始写入EEPROMsbiEECR, EEWEoutSREG, R16; 恢复SREG值(I位)C代码例子charcSREG;cSREG = SREG;/* 保存SREG值*//* 在定时程序中禁能中断 */_CLI ();EECR|= (1EECR|= (1SREG=cSREG;/* 恢复SREG值(I位) */当使用SEI指令来使能中断时,紧跟在SEI后面的指令将在任何后续的中断前被执行,示例如下。汇编代码例子 置位全局中断使能 进入休眠,等待中断; 注意:将在任意中断前进入休眠C代码例子_SEI();/* 置位全局中断使能_SLEEP();/* 进入休眠,等待中断 *//* 注意:将在任意中断前进入休眠 */中断响应时间对于所有使能的AVR中断,中断执行响应最少为四个时钟周期。在四个时钟周期之后,实际中断处理程序的向量地址被执行。在这四个时钟周期内,程序指针(PC)被压入堆栈。该失量正常为一到中断程序的跳转,并且该跳转花费三个时钟周期。如果中断发生在一个多周期指令的执行期间,在中断被响应前,该指令要执行完毕。如果当MCU在休眠模式中有中断产生,那么该中断响应时间要再增加四个时钟周期。这是由于从选择的睡眠模式中唤醒需要启动时间。从中断处理程序返回需要四个时钟周期。在这四个时钟周期内,程序指针(两个字节)从堆栈中被弹出,堆栈指针加2,SREG的I位被置位。这篇文章是我对AVR单片机中断的总结。因为在设计中遇到了这个问题(我频繁地使用了定时中断,并且使用了串口中断(一次)),凭着调试出现的现象以及我的经验,我觉得定时器出现了自身嵌套的情况。这在51单片机中是根本不可能出现的。于是我到网上寻求帮助。在QQ群里问过很多人,有些不知道,有些嗤之以鼻,说太简单了,追问之下,才不屑一顾地说标志位要等执行完中断程序才清除的,只能执行高优先级中断。我觉得他们是错的,但是他们在群里都是AVR的牛人了,我用AVR才不到6个月,跟他们争辩没有结果(也许他们没有遇到过我这种情况,实时性要求并不是很高,所以没有注意到这个问题)。我想到了佟老师(《AVR单片机与GCC编程》的作者,网名芯艺),于是向他咨询了这个问题,下面是他的回答:中断嵌套的问题请问进入中断服务程序后,中断标志位(非全局标志位)会立刻清零吗?还是等中断服务程序执行完了才自动清零?中断可不可以自己嵌套自己?芯艺:一般数据手册中写着"进入中断服务程序之后该标志自动清零".说明一进入中断程序硬件自动清除标记志. 关于第二个问题,主页上已贴出一篇文章,请参考!文章:中断可不可以自己嵌套自己下面是我做的一个串口接收中断自已嵌套自己的例子.#include#include#include//初始化void uart_init(void){UBRRH=0;UBRRL=47;//8MHzUCSRB=_BV(RXEN)|_BV(TXEN)|_BV(RXCIE);}//串行口写一字节void uart_putc(uint8_t c){loop_until_bit_is_set(UCSRA,UDRE);UDR=c;}//串口接收中断//void USART_RXC_vect(void) __attribute__((interrupt,__INTR_ATTRS));//void USART_RXC_vect(void) //ISR(USART_RXC_vect)ISR(USART_RXC_vect){uint8_t g=UDR;uart_putc(g);sei();while(1);}int main(void){uart_init();sei();while(1);return 0;}结果显示,可多(取决于堆栈)次返回发送的数据.说明,中断是可以自己嵌套自己的.在此我非常感佟老师的无私帮助。同时也希望我们广大的技术人员要有严谨的工作态度,以及宽大为怀、助人为乐的胸襟。也衷心地祝愿同仁们事业蒸蒸日上。中断响应后由硬件自动清零全局中断,任何中断都无法响应,在执行完中断程序后,全局中断打开.如果需要中断嵌套,则在中断程序里软件添加打开全局中断.就可以响应任何中断(包括比本中断优先级低的中断).以至可以中断自己嵌套自己(例如中断时间是每隔100ms一次,而中断执行时间是1s.那样中断就自己嵌套自己,程序就混乱了).中断响应后,全局中断被屏蔽,如果还有中断进入,那么无论优先级高低都无法响应,但响应的中断标志位置位,当中断执行完毕后,总中断打开,接着执行未响应的中断.---------------------------------------------------------------------------------------------*************************************ClassicElectronicStudio克莱斯特电子工作室*************************************
文章热词:avr中断向量
下一篇:没有了
延伸阅读:
PIC单片机是一种用来开发去控制外围设备的集成电路(IC)。PeripheAVR中怎么计算延时的时间_百度知道
AVR中怎么计算延时的时间
提问者采纳
/他的延时时间为count*4个系统时钟周期
count为16位无符号整数void DelayMs(unsigned int t)/t;//他的延时时间为count*3个系统时钟周期 count为8位无符号整数void_delay_loop_2(unsigned int count);&#47.h)void_delay_loop_1(unsigned char count); for(i=0;/延时毫秒函数{ unsigned int i,适合各种频率;FEQ为系统震荡频率(以M为单位) }这种是系统自带定义延时函数;/i&包含头文件(delay,比较准确;/i++) _delay_loop_2(FEQ*250-1);&#47&#47
其他类似问题
为您推荐:
其他2条回答
一般是这样的;&#47:#include &#include &lt.h&avr&#47.h&gt首先包含头文件#include &lt.h&#include &util&#47.h&util/avr&#47.h&iom32;;&#47,直接调用_delay_us(x)和_delay_ms(x);#define delay_us(x)
_delay_us(x)
/#include &AVR GCC延时函数 x(us)#define delay_ms(x)
_delay_ms(x)
用定时器中断或查询啊,把想延迟的时间设定好就可以,一个很短的时间多做几次就是你要的几秒了用定时器中断或查询是最准确的方法了
avr的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁coadvision AVR 如何添加头文件,做成一个简单的程序_百度知道
coadvision AVR 如何添加头文件,做成一个简单的程序
我想应该是没找到头文件吧刚开始学习单片机,身边没人帮我,后来用coadvision,用avr studio5编c语言,它老是说我用的PORTb使用前要定义,qq聊最好,也没弄明白,还是一样,我的是,希望有位朋友可能指点下,写avr程序的步骤实在太复杂了,真心感谢,在文库找了很久
我有更好的答案
GCCAVR(WINAVR)安装后你就可以在avr studio5使用C语言了avr studio5是不能直接支持C语言的,你可以用汇编语言写程序,或者嵌套GCCAVR(WINAVR)软件,推荐你使用ICCAVR软件来写C程序,然后用avr studio5调试
winavr是只有20多兆的那个吗,安装完怎样用,能给个步骤么,谢谢你
你加我扣扣,我给你传份完整资料
codevisionavr添加头文件实在太容易了,不管是C还是H文件,直接在主程序前include就ok了。
我用的是cvavr,可以加我qq。。头文件只要在最前面加上 #include &mega8.h& 这样就行了。
其他类似问题
为您推荐:
头文件的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁AVR复位和中断处理及中断嵌套_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
AVR复位和中断处理及中断嵌套
上传于||文档简介
&&A​V​R​复​位​和​中​断​处​理​及​中​断​嵌​套
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩1页未读,继续阅读
你可能喜欢}

我要回帖

更多关于 fragment嵌套fragment 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信