denshikobo’s blog

PICプログラミングやPCの操作で感じた日々の由無し事を綴ります

なんとかLチカが動いた

『Lチカ・プログラムをLoadして動かす』

やろうとしたのはそれだけなのですが・・・

 

LoadコマンドでLチカ・プログラムをFlashメモリに書き込みました。
Runコマンドで所定のアドレス(cinit)から走り出しました。

ただ・・・

直ぐ、0番地付近に設定したBreakポイントに引っかかってしまいます。orz

 

Addressブレークは掛るのですが、後からLoadしたプログラムの実行をトレース出来ないので(STEP実行が効かない)、一体どこをどう走っているのか分からないまま、手探りのデバッグが始まりました。(ここからが長かった。)

 

 

何度も再起動しながら、様子を探っていきます。

 

Stack-OverFlow等でResetした訳では無いらしい、(PCONはクリアされたまま)

BREAK_STATUSの反復読み出しを止めると走り続ける、

モニタ・プログラムのTEST_FUNCならBREAK_STATUSの反復読み出しを止めなくても走り続ける、

・・・・・・・これって一体、何が起きてるんだ?・・・・・・・

 

モニタ・プログラムとLチカ・プログラムのリストを比べていて・・・ん!

COMMONのレジスタが、一部被っている?

 

Linkerコマンドでモニタ・プログラムとLチカ・プログラムのCOMMON領域を分けてみると・・・ビンゴ~

 

ようやく、Lチカが動きました。

『たかがLチカ、されどLチカ』

これは非常に大きな一歩になりました。

ーーーーーーーーーーーーーーーーーーーーー

補足(2017.08.28)

XC8コンパイラは、特別に管理された領域(Compiled Stack)に自動変数や一時変数を置きます。その際、プログラム全体のコール・グラフを作成して、変数の配置に重複が生じないようにしています。(XC8 マニュアル 5.5.2.2.1 Compiled Stack Operation参照)

 

Lチカ・プログラムとモニタ・プログラムは別々にコンパイルしたので、変数の配置に重複を生じていました。別にコンパイルしたプログラムをLoadして実行する、というのは今回の『肝』なので、そこは譲れません。そこでLチカ・プログラムとモニタ・プログラムでCompiled Stackが異なる領域に配置されるよう、リンカへ指示してトラブルを回避したと言う訳です。

以上、ご参考まで