- ベストアンサー
PIC C言語でコード開始アドレスを指定する方法
PIC18F2550用にMPLAB-IDEでC18コンパイラを使って、作ったファイルをUSB経由でブートしようとしています。下位番地にはブートローダが入っているため、プログラムの開始アドレスを800番地以降におきたいのですが、例えばアセンブラ言語のORG命令のようにコードの開始番地を指定することはできないでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
リンカスクリプトを書き換えて、開始番地を0x800にしなければならないのではないかと思います。 当方はSDCCを使っていてC18はよくわからないのですが、(UBWを使った開発はしています)リンカで開始番地の指定は可能です。 千秋ゼミさんのサイトがとても参考になります。
その他の回答 (1)
- chie65536
- ベストアンサー率41% (2512/6032)
「そのプログラムが、どのようにロードされるか?」に拠ります。 そのプログラムをロードするローダーってのがどっかに居て、それが、ロードとジャンプを行って、そのプログラムが走るようになってる筈です。 もし「必ず0番地からロードして、ロードしたら0番地に飛ぶ」と言う仕様なのであれば「0番地に、800番地にジャンプする命令を書いておく」だけでOKです。 もし「ファイルの先頭に、固定長のロード情報が埋め込まれてて、そこにロード開始番地と、ジャンプ先が書いてあり、ファーストブートローダーが、そこを見ている」ならば、ファーストブートローダーが要求している仕様通りに、ロード情報を埋め込むだけです。 何れにせよ「そのプログラムをロードするローダーの仕様」が判らない限り、どうする事も出来ません。
補足
回答ありがとうございます。 PICの開発環境は使い始めたばかりで手探り状態のために、質問が要領を得なくてすみません。具体的には、PIC側のローダはUBWのFirmware-B、PC側はMyBootというソフトを使おうとしています。 アセンブラではうまくロードできているようなので、それを参照してご指摘の点、自分なりに調べてみました。 > そのプログラムをロードするローダーってのがどっかに居て、それが、ロードとジャンプを行って、そのプログラムが走るようになってる筈です。 Firmware-Bは0番地から800番地の少し手前までに格納されていて、プログラムのロード先は.HEXファイルの指定に従ってロードされるようです。また、ジャンプ先はMyBootのメニューで800Hないし1000Hのどちらかを指定できるようになっているので、.HEXファイルのロード先と一致させておき、ロード後のリセットでロードしたプログラムにジャンプさせるようです。 > もし「ファイルの先頭に、固定長のロード情報が埋め込まれてて .HEXファイルに番地が埋め込まれているようなので、ご指摘の通りで、Cコンパイラーかリンカーあたりで先頭番地を指示する必要があるようです。アセンブラの場合はORG命令で指定しましたが、CコンパイラのインラインアセンブラではORG命令は受付けてもらえないようです。
お礼
ご紹介のサイト、とっても参考になりました。 なるほど、UBWのFirmware-Dのソースやファイル一式が公開されているのだから、リンカの開始番地の指定方法もそれを見れば何とかわかりそうです。少々情報が多すぎてすぐには試すことができていませんが、落ち着いて勉強してみます。とりあえず、お礼まで。