首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ISR末尾使用reti()

在ISR末尾使用reti()
EN

Stack Overflow用户
提问于 2018-04-05 09:56:55
回答 1查看 1.6K关注 0票数 1

我的问题是这段代码不起作用。ISR正在运作..。我在其他代码中测试了它的闪烁。

但是,要将x++放在ISR中,并在main()函数中读取X,它从不闪烁。。。

我对asm不太熟悉,我认为这是编译器的光学化,所以我把变量设置为易失性,但它不起作用。

代码语言:javascript
复制
#define F_CPU 16000000UL

#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>

volatile static uint8_t x = 1;

ISR( TIMER0_OVF_vect )
{
    x++;
    reti();
}

int main(void)
{

    /* Replace with your application code */
    DDRB = DDRB | 0B00100000 ; // pinMode(13,OUTPUT);
    TCCR0A = 0;
    TCCR0B = (1 << CS00 ) | (1 << CS02 ); //1024 prescaler
    TIMSK0 |= 1 << TOIE0 ;
    sei();

    while (1) 
    {

        if (x  >= 61) //never happens ? 
        {
            PORTB ^= 0B00100000;
            x=0;    
        }

    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-05 10:16:32

对于普通的ISR,您的编译器生成一些“样板”代码,例如包括保存和恢复CPU寄存器,并包围您在ISR主体中编写的代码。当你宣布你的ISR“裸体”时,这种情况不会发生。

与您的代码一样,ISR并不是裸露的,这个样板代码是存在的,但是您仍然使用reti(),它会立即离开ISR。因此,您的ISR将执行“序言”部分,而不会执行“结尾”部分,这可能会导致各种问题,例如,干扰注册内容。

顺便说一句,尾声样板中的最后一条指令是reti。只有在你写裸体ISR的时候才使用reti()

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49669412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档