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

0 件のコメント:

コメントを投稿