2014年6月22日日曜日

AVR-GCC でタイマ割り込みに間に合わない場合(部分的に最適化レベルを変える)

タイマ割り込み中に行う処理は、当然だが割り込み間隔以下の時間で実行が終わるステップ数で書かないといけない。

AVR-GCC でコンパイルするときには、できるだけコードサイズを節約するために、最適化オプションをコードサイズ優先 (-Os) にすることが多い。しかし、タイマ割り込み中に実行する命令が多すぎて、割り込み間隔に間に合わないときには、割り込みハンドラの部分だけを速度優先 (-O3) で最適化してほしい。

これは下記のように 割り込みハンドラの前に #pragma を置いて最適化レベルを速度優先 (-O3) と指定すれば実現できる。割り込みハンドラの後ろにも #pragma を置いて、最適化レベルをコードサイズ優先 (-Os)に戻す

#pragma GCC optimize ("O3")
ISR(SIG_OUTPUT_COMPARE0A) {
  タイマ割り込み中に行う処理
} 
#pragma GCC optimize ("Os")

コンパイルするときに下記のように -Os オプションを付ければ、割り込みハンドラ以外はコードサイズ優先 (-Os) で、割り込みハンドラ部分だけ速度優先 (-O3) で最適化される。

% avr-gcc -g -Os -mmcu=atmega8 -o out.o main.c

2 件のコメント:

  1. いつも困ると電子牛乳さんに行きつきます。こんな部分的なコンパイル最適化オプションがあったのですね。目からウロコとはまさにこれですね。通信受信時の割り込み処理が色々あり時間がかかってしまいます次データ来た際に取りこぼしをごくまれに起こしていたので早速この方法で速度優先最適化し試してみます。貴重な情報ありがとうございます。

    返信削除
  2. コメントどうもありがとうございました。いつも断片的な情報しか書けていなくてすみません。新規の記事もあまり書けていませんが、AVR(最近は主にTiny85) を Arduino ライブラリ等を使わずに生の GCC を使って開発していますので、気づいたことがあれば今後も記事を追加していきたいと思います。

    返信削除