gpt4 book ai didi

c - 如何禁用 avr-gcc 的 "appears to be a misspelled interrupt handler"警告?

转载 作者:行者123 更新时间:2023-12-04 02:11:40 24 4
gpt4 key购买 nike

我目前正在为 AVR 微 Controller 上的 USB 设备创建固件。由于 USB 时序非常严格,我不允许非 USB 中断阻塞超过几个指令周期。因此,我的 USART RXC(接收到的字符)中断如下所示:

void usart_rxc_wrapped() __attribute__ ((interrupt));
void usart_rxc_wrapped(){
uint8_t c=UDR;
if(!ringBufferFull(&rx)){
ringBufferWrite(&rx, c);
}
// Reenable nterrupt
UCSRB|=1<<RXCIE;
}

// This cannot be ISR_NOBLOCK, since the interrupt would go
// into infinite loop, since we wouldn't get up to reading
// UDR register. Instead, we use assembly to do the job
// manually and then jump to the real handler.
ISR(USART_RXC_vect, ISR_NAKED){
// Disable this interrupt by clearing its Interrupt Enable flag.
__asm__ volatile("cbi %0, %1"::
"I"(_SFR_IO_ADDR(UCSRB)),"I"(RXCIE));
__asm__ volatile("sei"::);
__asm__ volatile("rjmp usart_rxc_wrapped"::);
}

请注意,我不能只将主中断代码放在 ISR 例程中,因为 avr-gcc 会为此函数生成一个很长的序言(毕竟,我从那里调用了其他函数,因此需要推送许多寄存器)。即使 C 代码中的第一条指令正在清除中断标志,它仍然会延迟很多令人不快的周期。

此解决方案工作正常,但我担心 avr-gcc 的警告:
uart.c:128:6: warning: ‘usart_rxc_wrapped’ appears to be a misspelled interrupt handler

这是因为我使用 __attribute__((interrupt))在其定义中,以通知编译器将寄存器保存为 ISR。我在编译器中找不到任何选项来禁用此警告。有没有一种解决方法可以减少编译的噪音?或者也许有更好的方法来处理这种情况?

最佳答案

我发现这个补丁是 8 年前的:http://savannah.nongnu.org/bugs/download.php?file_id=15656 .显然警告是无条件生成的(没有用于编译的 -WnoXXX 标志)。但是,avr-gcc 仅在函数名称不以 __vector 开头时才会生成此警告。 .为了解决我的问题,我只是将包装的函数重命名为 __vector_usart_rxc_wrapped .

关于c - 如何禁用 avr-gcc 的 "appears to be a misspelled interrupt handler"警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37533466/

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