私は現在、AVRマイクロコントローラ上のUSBデバイスのファームウェアを作成しています。 USBのタイミングは本当に厳しいので、USB以外の割り込みを数サイクル以上ブロックすることはできません。したがって、私のUSART RXCは(文字を受信)、このようなルックスを中断:私はちょうどAVR-gccが(この機能のためにかなり長いプロローグを生成するので、ISRルーチンでメイン割り込みコードを置くことができませんでしたavr-gccの「間違った割り込みハンドラと思われる」警告を無効にするにはどうすればよいですか?
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"::);
}
注意を結局、そこから他の関数を呼び出すので、多くのレジスタをプッシュする必要があります)。 Cコードの最初の命令が割り込みフラグをクリアしていたとしても、それはまだ不快なほど多くのサイクルで遅延していました。
このソリューションは正常に動作しますが、私はAVR-GCCの警告によって心配です:私はそれがISRだったかのようにレジスタを保存するようにコンパイラーに通知するために、その定義に__attribute__((interrupt))
を使用しているため
uart.c:128:6: warning: ‘usart_rxc_wrapped’ appears to be a misspelled interrupt handler
これは、 。コンパイラでこの警告を無効にするオプションが見つかりません。コンパイルのノイズを少なくするための回避策はありますか?あるいは、このような状況に対処するより良い方法がありますか?