2017-08-03 5 views
1

私は割り込みハンドラの定義に__attribute__ ((weak))を追加しようとしましたが、ベクトルジャンプが実装されていないことに気付きました。AVR割り込みベクタを '__attribute __((弱))'にできないのはなぜですか?

は 例は、 "弱い" 割り込みで

ISR(TIMER1_COMPA_vect, __attribute__ ((weak))) 
{ 
    // some compiled code 
    ... 
} 

結果のアセンブリコード - なしジャンプ:weak属性を持たない今

00000000 <__vectors>: 
     0: 48 c0   rjmp .+144   ; 0x92 <__ctors_end> 
     4: 92 c0   rjmp .+292   ; 0x12a <__bad_interrupt> 
     8: 90 c0   rjmp .+288   ; 0x12a <__bad_interrupt> 
     c: 8e c0   rjmp .+284   ; 0x12a <__bad_interrupt> 
     10: 8c c0   rjmp .+280   ; 0x12a <__bad_interrupt> 
     14: 8a c0   rjmp .+276   ; 0x12a <__bad_interrupt> 
     18: 88 c0   rjmp .+272   ; 0x12a <__bad_interrupt> 
     1c: 86 c0   rjmp .+268   ; 0x12a <__bad_interrupt> 
     20: 84 c0   rjmp .+264   ; 0x12a <__bad_interrupt> 
     24: 82 c0   rjmp .+260   ; 0x12a <__bad_interrupt> 
     28: 80 c0   rjmp .+256   ; 0x12a <__bad_interrupt> 
     2c: 7e c0   rjmp .+252   ; 0x12a <__bad_interrupt> 
     30: 7c c0   rjmp .+248   ; 0x12a <__bad_interrupt> 
     34: 7a c0   rjmp .+244   ; 0x12a <__bad_interrupt> 
     38: 78 c0   rjmp .+240   ; 0x12a <__bad_interrupt> 
     3c: 76 c0   rjmp .+236   ; 0x12a <__bad_interrupt> 
     40: 74 c0   rjmp .+232   ; 0x12a <__bad_interrupt> 
     44: 72 c0   rjmp .+228   ; 0x12a <__bad_interrupt> 
     48: 70 c0   rjmp .+224   ; 0x12a <__bad_interrupt> 
     4c: 6e c0   rjmp .+220   ; 0x12a <__bad_interrupt> 
     50: 6c c0   rjmp .+216   ; 0x12a <__bad_interrupt> 
     54: 6a c0   rjmp .+212   ; 0x12a <__bad_interrupt> 
     58: 68 c0   rjmp .+208   ; 0x12a <__bad_interrupt> 
     5c: 66 c0   rjmp .+204   ; 0x12a <__bad_interrupt> 
     60: 64 c0   rjmp .+200   ; 0x12a <__bad_interrupt> 
     64: 62 c0   rjmp .+196   ; 0x12a <__bad_interrupt> 
     68: 60 c0   rjmp .+192   ; 0x12a <__bad_interrupt> 
     6c: 5e c0   rjmp .+188   ; 0x12a <__bad_interrupt> 

00000000 <__vectors>: 
     0: 48 c0   rjmp .+144   ; 0x92 <__ctors_end> 
     4: 92 c0   rjmp .+292   ; 0x12a <__bad_interrupt> 
     8: 90 c0   rjmp .+288   ; 0x12a <__bad_interrupt> 
     c: 8e c0   rjmp .+284   ; 0x12a <__bad_interrupt> 
     10: 8c c0   rjmp .+280   ; 0x12a <__bad_interrupt> 
     14: 8a c0   rjmp .+276   ; 0x12a <__bad_interrupt> 
     18: 88 c0   rjmp .+272   ; 0x12a <__bad_interrupt> 
     1c: 29 c0   rjmp .+82   ; 0x70 <__vector_7> 
     20: 84 c0   rjmp .+264   ; 0x12a <__bad_interrupt> 
     24: 82 c0   rjmp .+260   ; 0x12a <__bad_interrupt> 
     28: 80 c0   rjmp .+256   ; 0x12a <__bad_interrupt> 
     2c: 7e c0   rjmp .+252   ; 0x12a <__bad_interrupt> 

      ... 

は、このバグですavr-gcc(私はバージョンを試しました5.3.x7.1.0)または私は何かを逃したのですか?あなたのコードは、デフォルトのISRハンドラ__bad_interruptavr-libcコードで参照crt1/gcrt1.S)をオーバーライドするために非弱として適切なシンボルを定義することができるように

答えて

3

avr-libcは弱いシンボルを使用してISRベクタテーブルを実装します。

弱いISRだけが弱いISRを無効にします(avr-libc)。

オーバーライドが必要な場合は、非弱いISRコールに弱い機能を持たせたい場合があります。

+0

ヒントのおかげで、私はソースファイルを確認しました。それはすべてそれを説明します。 –

関連する問題