2016-05-30 3 views
2

私は現在、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 

これは、 。コンパイラでこの警告を無効にするオプションが見つかりません。コンパイルのノイズを少なくするための回避策はありますか?あるいは、このような状況に対処するより良い方法がありますか?

答えて

4

私はこのパッチを8年前から見つけました:http://savannah.nongnu.org/bugs/download.php?file_id=15656。明らかに、警告は無条件で生成されます(コンパイルには-WnoXXXフラグがありません)。ただし、関数の名前が__vectorで始まらない場合にのみ、avr-gccがこの警告を生成します。私の問題を解決するために、ラップされた関数の名前を単に__vector_usart_rxc_wrappedに変更しました。

関連する問題