c - 在 ISR 结束时使用 reti()

标签 c microcontroller avr atmelstudio isr

我有问题,这个代码不起作用.. ISR 正在工作..我在其他代码中测试了它的闪烁..

但是将 x++ 放入 ISR 并在 main() 函数中读取 X 它永远不会闪烁。 ..

我不熟悉 asm 我认为这是编译器优化,所以我把变量 volatile 但它没有工作..

#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;    
        }

    }
}

最佳答案

对于普通的 ISR,您的编译器会生成一些“样板”代码,例如包括保存和恢复 CPU 寄存器以及将您自己编写的代码包围在 ISR 主体中。当您声明您的 ISR 为“裸”时,这不会发生。

在您的代码中,ISR 不是裸露的,此样板代码存在,但您仍然使用 reti(),它会立即离开 ISR。因此,您的 ISR 将执行“序言”部分,但不会执行“尾声”部分,这可能会导致各种问题,例如弄乱寄存器内容。

顺便说一句,结语样板中的最后一条指令无论如何都是 reti。仅在您编写裸 ISR 时才使用 reti()

关于c - 在 ISR 结束时使用 reti(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49669412/

相关文章:

c - 使用 poll() 检查文件修改

c - Shell/C 信号量

C 指针参数不匹配编译警告

c++ - AVR 在类构造函数中分配内存

c - 开始对计算机以外的东西进行编程的最佳方式?

c - AVR 9 位 Usart 不工作 (MPCM)

c - 带或不带 MSYS 的 MinGW 生成文件(del 与 rm)

c - Vigenere cs50 在缺少第二个参数时不会提示

microcontroller - 轮询与中断?

c++ - 观察者模式实现使用大量 RAM - 我如何找出位置和原因?