gpt4 book ai didi

c - 在 vector、SEI 和 intflags 仍然设置后中断停止执行。 (AtMega4809)

转载 作者:太空宇宙 更新时间:2023-11-04 07:44:58 24 4
gpt4 key购买 nike

我的系统有几个中断,包括TC捕获、外部中断和ADC转换中断。特别是有一个 vector ,在执行时,即使在 reti() 指令之后,也会阻止任何 vector 执行。

TCB2 捕获中断 vector ( vector 25)是系统中唯一停止所有导致 WDT 复位的 vector 。

全局中断标志为 1,当中断发生时,激活中断的 INTFLAGS 被正确设置。但是没有 vector 被执行。这适用于所有中断。

我已经尝试稍微更改 vector ,确保存在 reti() 指令并确保 vector 表没有改变。我也已经确保代码在 reti() 之后继续正常执行。唯一似乎不起作用的是 vector 。

volatile uint8_t new_input_regs = 0x00;

/*[Other code, including other vectors without this issue]*/

void __vector_25() {

new_input_regs = PORTD_IN; //Get PORTD input values
TCB2_CTRLA &= ~(0x01); //Clear TC enable and flags
TCB2_INTFLAGS = 0xFF;

asm("WDR"); //Reset the WD timer

event_type = EVENT_INPUT_INTERRUPT; //Set the event
reti();
}

在此执行后,所有中断都将停止工作,直到复位(由于没有执行中断,这最终也会导致看门狗复位)。

这里有关于寄存器和 vector 表的更多信息:https://imgur.com/a/SpLKrgT

最佳答案

多亏了评论,我注意到 ISR 过于优化,甚至跳过 retis 并在一个单独的 assemble block 中合并 vector 而没有返回。默认 vector 函数(如上面使用的 __vector_25())无法按预期工作,导致未终止的 ISR 和丢失 reti(),即使是手动编写也是如此。这会导致完全意外的行为。

我已将 vector 定义更改为 ISR(_VECTOR(25)) 并删除了函数末尾的 reti()。中断已恢复正常工作。

感谢您的帮助。

关于c - 在 vector、SEI 和 intflags 仍然设置后中断停止执行。 (AtMega4809),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57866564/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com