なんとか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が異なる領域に配置されるよう、リンカへ指示してトラブルを回避したと言う訳です。
以上、ご参考まで