embedded - ISR 中过早出现 'return' 会发生什么?

标签 embedded avr isr

我正在使用 AVR-GCC 4.9.2,我想知道如果我在 AVR 上的 ISR 中过早返回会发生什么?

ISR(USART_RXC_vect)
{
    ...
    if(idx == BUFSIZE)
        return;
    ...
 }

请问return翻译成 reti操作说明?或者我需要包含一个 reti()我?

我正在寻找幕后发生的事情的详细解释。

最佳答案

就像ISR(USART_RXC_vect)不仅仅是字面上的USART_INTERUPT_VECTOR:在汇编程序中,
return;不仅仅是字面上的ret或者reti在汇编程序中。

C/C++ 中的两条指令都将被翻译成多个汇编语句,并且在这两种情况下都取决于上下文。 ISR(){} 的上下文在这种情况下是完全单轨的,但它很可能还包括一些推送和存储 SREG。但是插入堆栈的次数将取决于函数中发生的情况。

任何 return; 也是如此在上下文中解释。在实际构建到子例程中的正常子例程的末尾(出于代码效率原因,许多有限使用的子例程被编译器“内联”)将成为 ret指令(在处理任何需要的 POP 和其他低级别清理之后)。在中断结束时,它实际上意味着“弹出您之前推送的所有内容(并恢复 SREG),然后弹出 reti”。

当您返回将被编译为通过平台系统传输该值的类型时,在包含 ret 之前操作说明。所以return;是一个非常上下文敏感的语句,你可以假设它会被正确解释,除非你做了非常奇怪的事情。但是那些奇怪的事情将是一个好的编译器(如 AVR-GCC)至少会警告的事情。

关于embedded - ISR 中过早出现 'return' 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32020556/

相关文章:

embedded - 在微 Controller 上实现 Web 服务器

embedded - pthread_cancel 在arm 和ppc 上的行为不同?

assembly - MOV 到宏参数指定的寄存器中

c - AVR 中的 BootLoader 和应用程序内存大小

c++ - 如何基于循环迭代器选择函数

CCS C编译器,命令行指令

c++ - 调用对象指针的虚函数引起的段错误

microcontroller - 对设备编程感兴趣。从哪儿开始

assembly - 微操作的操作顺序?

C:UART、ISR、循环 FIFO 缓冲区:有时会以错误的顺序发送字节