マイクロテクニカ製品サポートFAQ
[一覧] [1つ前に戻る] [マニュアル及び各種ダウンロードページへ]
mikroICDでLCD_init()関数や、Uart_Init()関数を実行しようとすると実行に長い時間がかる
ICD機能は、リアルタイムでコードを実行しているわけではなく、その関数を構成するアセンブラ言語を1行ずつ実行しています。そのため、処理ルーチンが特に膨大な各関数を使うための初期化関数や一部の関数では、ICDで実行するとその1行の完了に膨大な時間がかかることがあります。

これは公式サポートフォーラムでも報告されているとおり、本来の実行とは異なりプログラムメモリの内容を1行ずつ確認して、動作を追従するICD機能を使う上では避けられない仕様です。
http://www.mikroe.com/app/webroot/forum/viewtopic.php?f=13&t=12895&start=0

これらの処理に時間のかかる関数については、"Run to Cursor"で飛ばして実行することが一般的です。
例えば、次のような場合はLCD_OUT()関数まで処理を通常動作で動作させ、その後ステップ実行するなどの対応をします。

void main(){
 Lcd_init();
 Lcd_Out(1,1,"HELLO");
}

例えば上記のようなプログラムの場合には、Lcd_Out(1,1,"HELLO");の行にカーソルを置き、F4キー(Run to Cursor)でLcd_init()関数部分は通常実行で実行させ、以降はICD動作をさせるようにします。

なお、一般的には各関数の初期化やレジスタの初期値代入などはmainルーチンでは行わず、別の初期化専用関数を作り、その関数内で一括して記述しておきます。そしてその初期化関数を抜けたmain関数内の次の行からF4キー(Run to Cursor)でプログラムを実行するように工夫します。

またICDはその機能上、delay_ms()関数など時間遅延を作る関数も動作できません。それは前途の通りであり、例えばdelay_ms(1)としても、その関数をICDで実行するには1ミリ秒以上の時間がかかり、時間遅延が保証されないからです。
オリジナル - FAQみたいです - 猫でいいです