割り込みのCでの実装

とりあえずgnu-armのマニュアルを探してたら見つかった。

void f () __attribute__ ((interrupt ("IRQ")));

という形みたい。
ただ、昨日見つけたサンプルプログラムだと↓の用になってる

// #define __irq __attribute__ ((interrupt("IRQ")))
// #define __fiq __attribute__ ((interrupt("FIQ")))
#define __irq
#define __fiq

うーん。これコメントアウトしなきゃうごかないんじゃないのかな?
でも、ソース全体を考えると
ベクタテーブルのIRQアセンブラレベルでレジスタの待避とかも書かれていてアセンブラで__IRQ_wrapparというファンクションを書いて、そこからVICにセットされた割り込み関数の処理に飛んでいるので、わざわざCソースで、

void f () __attribute__ ((interrupt ("IRQ")));

で書く必要がないというのも分かる気がする。


ただ、いろいろ見てると上の書き方でFIQが書けるということに気づく。というか例外処理はreset意外上の書き方で対応できる。resetさえどうにかなれば、それならCのスタートアップルーチンも可能か?
とりあえずよんだ説明を見た感じだとやはり,レジスタ待避とかも生成してくれると思うけど、どうだろう?コンパイルをアセンブラ止めしてソースを見ればわかるだろうけど。