AVR-GCC about reti()

Publisher:幸福满溢Latest update time:2017-11-21 Source: eefocusKeywords:AVR-GCC  reti() Reading articles on mobile phones Scan QR code
Read articles on your mobile phone anytime, anywhere

Those who have used assembly language know that in assembly language, the instruction reti is used to return from the interrupt service routine. Then in winavr we use C to write a program like this:

 

#include

ISR(USART_RXC_vect)

{

          uart_putc('a');

          while(!(UCSRA&(1<

          char dummy = UDR;

          flag = !flag;

          uart_putc_hex(flag);

          reti();

}

int main(void)

{

        uart_init();

        uart_putstring("starting\r\n"); //send data to PC

        sei();

        while(1)

       {

           …

        }

}

Run the program and you will find that as long as you send characters from the serial port assistant to the microcontroller, it will output a line:

“starting”

This means that every time you return from an interrupt, the program is restarted. Who restarted it? After debugging, I found that it was restarted by reti(). I was stunned. It turns out that it not only simply returns from an interrupt, but also restarts the entire program. Keep this in mind.


Keywords:AVR-GCC  reti() Reference address:AVR-GCC about reti()

Previous article:AVR-GCC: Cannot update variables regarding ISR()
Next article:ATMega8 interrupt mode UART test program

Recommended ReadingLatest update time:2024-11-16 13:39

AVR-GCC program memory api
Program Memory If you want to put data (such as constants, strings, etc.) in FLASH, the user needs to specify the data type __ATTR_PROGMEM__. For ease of use, AVR-GCC defines some more intuitive symbols, as shown in the following table. 类型数据定义 typedef void PROGMEM  prog_void  typedef char PROGMEM  prog_char  type
[Microcontroller]
Latest Microcontroller Articles
  • Download from the Internet--ARM Getting Started Notes
    A brief introduction: From today on, the ARM notebook of the rookie is open, and it can be regarded as a place to store these notes. Why publish it? Maybe you are interested in it. In fact, the reason for these notes is ...
  • Learn ARM development(22)
    Turning off and on interrupts Interrupts are an efficient dialogue mechanism, but sometimes you don't want to interrupt the program while it is running. For example, when you are printing something, the program suddenly interrupts and another ...
  • Learn ARM development(21)
    First, declare the task pointer, because it will be used later. Task pointer volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • Learn ARM development(20)
    With the previous Tick interrupt, the basic task switching conditions are ready. However, this "easterly" is also difficult to understand. Only through continuous practice can we understand it. ...
  • Learn ARM development(19)
    After many days of hard work, I finally got the interrupt working. But in order to allow RTOS to use timer interrupts, what kind of interrupts can be implemented in S3C44B0? There are two methods in S3C44B0. ...
  • Learn ARM development(14)
  • Learn ARM development(15)
  • Learn ARM development(16)
  • Learn ARM development(17)
Change More Related Popular Components

EEWorld
subscription
account

EEWorld
service
account

Automotive
development
circle

About Us Customer Service Contact Information Datasheet Sitemap LatestNews


Room 1530, 15th Floor, Building B, No.18 Zhongguancun Street, Haidian District, Beijing, Postal Code: 100190 China Telephone: 008610 8235 0740

Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号