RL78でのプログラム切り替えについて

お世話になっております。
長文で失礼します。

対象:RL78/G13 (R5F1006E)
環境:CS+ V4.01.00 / CC-RL V1.03.00
基本的な初期設定(クロック、ポート設定など)は
コード生成使用

●やりたいこと
基板への電源投入時にSW状態を判定して、
プログラムAの動作
プログラムBの動作
を切り替えて使えるようにしたい

過去の投稿を拝見して、実現可能であることは理解しました。
http://japan.renesasrulz.com/cafe_rene/f/forum18/1507/rl78-g13

また、RFPのユーザーマニュアルから、
”複数プログラムファイル選択”することで
motファイルを結合して書き込む機能が存在するということを確認しました。


●試したこと
添付の図の様になればいいと思ったので、
・セレクタプログラム
・プログラムA
・プログラムB
をそれぞれ別プロジェクトで作成。

セレクタプログラムは、前述の過去投稿のリカルド様の書き込みを
参考させていただいて作成し、SWのON/OFFでそれぞれ0x04000と0x06000に
飛ぶことを確認しました。

プログラムAはCC-RLのプロパティ→リンク・オプション→セクションの項目から
 セクションを自動的に配置する:いいえ
 セクションの開始アドレス:.constの横の欄に0x04000を指定
して、開始アドレスを0x04000にしたつもりです
(デバッグ時にメモリの変化をみて、それらしく変わるのを確認)
プログラムBも同様に0x06000にしました。

この状態において以下を試してみました


(1)RFPでmotファイルを結合してみる

全然理解できていないので、まずはやってみようということで
セレクタ.mot、プログラムA.mot、プログラムB.mot
を選択してみたところ、
”エラー(E3000101): アドレス(0x00000000)にはデータが既に存在します。”
のエラー。アドレス0はベクタテーブル領域で動かせないのでは?
と思ったので(2)へ

(2)手動でmotファイルを結合してみる


ファイルを比較し、被っていない部分を切りはりして

セレクタ前半(先頭から、S113FE00の直前まで)
プログラムA(S1134000...の行からの部分、S113FE00の直前まで)
プログラムB(S1136000...の行からの部分、S113FE00の直前まで)
セレクタ後半(S113FE00...からS903...の部分)

という形で一つのファイルに。書き込みは成功し、
起動してみると、SWのON/OFFで何やら挙動は違うが
思った通りの動きではないという状況です。

●質問内容
(1) 目的を実現するには添付の図のような理解であっているのでしょうか。

(2) 設定が足りない項目があると思うのですが、思い当たるものはありますでしょうか。

(3) 現状の理解が正しいとして
.textfにスタートアップが含まれる(RL78コンパイラコース テキストより)ということは、
セレクタプログラムからプログラムA or プログラムBに飛んだ時に
それぞれ該当するスタートアップルーチンが再度実行され
hwinit()などが再度実行されるという理解でよろしいのでしょうか。
(セレクタプログラムで設定したものが更新される?)

 

セクションの割り付け等理解できていないところが多く、質問自体意味不明かもしれませんが

このあたり詳しい方がおられましたら、教えていただきたく思います。
よろしくお願いいたします。

Parents
  • わわいです
    RLはあんましよーわかりませんが、一般論としていきます
    まず、プログラムA,プログラムBは、コード領域、定数領域、データ領域は独立したエリアを使用するようにする必要があります。
    これらのメモリ割り当てがわからない、というのであればこういうことをするのは無理なので勉強しましょう。
    また、内部処理がわからないうちは、標準関数、組み込み関数、割り込みも使えないとおもっていたほうがいいです

    まずは、自分で書いたコードだけの小さなプログラムから試してみてはどうでしょうか。

    >”エラー(E3000101): アドレス(0x00000000)にはデータが既に存在します。”
    あなたが組んだコードに、割込みベクタを含んでいるために、重複して存在しているがためのエラーと推察されます。
    これをどーにかしましょう。
Reply
  • わわいです
    RLはあんましよーわかりませんが、一般論としていきます
    まず、プログラムA,プログラムBは、コード領域、定数領域、データ領域は独立したエリアを使用するようにする必要があります。
    これらのメモリ割り当てがわからない、というのであればこういうことをするのは無理なので勉強しましょう。
    また、内部処理がわからないうちは、標準関数、組み込み関数、割り込みも使えないとおもっていたほうがいいです

    まずは、自分で書いたコードだけの小さなプログラムから試してみてはどうでしょうか。

    >”エラー(E3000101): アドレス(0x00000000)にはデータが既に存在します。”
    あなたが組んだコードに、割込みベクタを含んでいるために、重複して存在しているがためのエラーと推察されます。
    これをどーにかしましょう。
Children
  • わわい様
    レスありがとうございます。

    現状だとデータ領域の割り付けができていないというのはなんとなくわかりました。
    図を見ても、ベクタテーブルが重複するのは
    そりゃそうだよなと分かったのですが、
    ベクタテーブルの配置アドレスの変更の仕方が分からず、
    苦し紛れに(2)手動でmotファイルを結合してみるを行ったという経緯があります。



    理解できていない、「メモリ割り当て」に関して
    勉強するのに適したおすすめの書籍やwebページ等ございますでしょうか?