MPLAB C18の最適化

| コメント(0) | トラックバック(0)



そもそも最後にPICを触ったのが2年前だし、それを含めてもCでPICファームを書くのは初めてなので、とりあえず簡単なことからはじめてみる。



#include<p18f2550.h>
#pragma config WDT = OFF

void wait( int _i, int _j, int _k);

void main(void){

TRISA = 0;
TRISB = 0;
PORTB = 0;
PORTA = 0;

while(1){
PORTB = 0xFF;
wait( 200, 50, 20);
PORTB = 0;
wait( 200, 50, 20);
}
}

void wait(int i_, int j_, int k_){
int i, j, k;
int dam = 0;

for( k = k_; k > 0; k--){
for( j = j_; j > 0; j--){
for( i = i_; i > 0; i--){
/*
_asm
nop
_endasm
*/
dam++;
}
}
}
}

これをコンパイル→書き込み→実行してみる。うまくいけばLEDの点滅が見られるはずなんだけど、そうはいかない。点滅の周波数が高すぎるのかと思って調節してみても変化なし。


困ってマニュアルのようなものをみてみると、どうやらC18はデフォルトで最適化を行っている様子。具体的には:



  • 同一文字列の併合

  • 分岐

  • バンキング

  • WREG コンテンツトラッキング

  • コード整理

  • 最後部コードの併合

  • 執行されないコード削除

  • コピー伝播

  • 冗長保存削除

  • 不要コードの削除

  • 過程抽象


というようなことを行っているらしい。


「不要コードの削除」か「執行されないコード削除」によって、wait関数内部のループが殺されてしまったのかなあと推測。MPLAB IDEの設定画面から、C18の実行時のオプションに-Oを加えてすべての最適化を抑制する。実効速度がクリティカルな影響を及ぼすようなデバイスではないので、問題ないと思うけど少し残念な気持ちが残る。


で、コンパイル→書き込み→実行すると、今度はうまくいく。若干点滅の挙動が不自然なのが気になる。


そういえば昨日のエントリで書いたように、C18 Student Editionは60日経過すると一部の最適化ができなくなるらしいのだけど、普段から-Oして開発してたら気にする必要ないのかな?ってそういう問題じゃないかなー。


とりあえず今日はちゃんと動かせることがわかったので満足。


トラックバック(0)

トラックバックURL: http://www.tnzk.org/mt/mt-tb.cgi/228

コメントする

このブログ記事について

このページは、tnzkが2009年1月11日 23:41に書いたブログ記事です。

ひとつ前のブログ記事は「MPLAB C18 Student Editionは試用期間終了後もちゃんと使える?」です。

次のブログ記事は「一週間のコミットをメールする」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

Powered by Movable Type 4.32-ja