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
  • わわいです
    出力オブジェクトに、コードにない初期化部や割り込みベクタなどを含めないようリンカに指定はできないんでしょうか?
    なんか、MOTファイルの切り貼りとか、ムダな努力をしているように見えますが。。
  • リカルドです。

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

    プログラムA,Bのベクタテーブルを削りました?またはベクタテーブルを生成しないようにしてありますか?

    パワーオンからマイコンがどのように動いて行くのか、アセンブラレベルで追って行けますか?
    「何の為に有るのか知らないけれど、サンプルに書いてある事をそのまま書いている」なんて言う部分は有りませんか?

     最初はプログラムA,BをLED点灯などのような簡単なプログラムで実験しましたか。
  • リカルド様

    >とりあえず、割り込みをリセット以外削除してみて
    >motの手動結合で
    >プログラムAとBの選択的な起動はできました。

    ↑この時点でプログラムAはLED1を点灯、プログラムBはLED2を点灯するような簡単なプログラムにして
    動作を確認してみました。
    CS+からの設定でベクタテーブルを生成しないようにはしておりません。
    (出力させない設定項目があるのでしょうか?NoMaY様の仰る、分割して出力することでしょうか?
    何か生成しないようにするためのコードを追加するなり削るなりするのでしょうか?)

    ベクタテーブルの割り付け変更を「0x00000~0x0007E」から変更していなければ、
    motにおけるS1130000の行からS1130070の行までがベクタテーブルに
    相当する部分だと思っているので(ここであってますよね?)、
    プログラムAとプログラムBからその部分も含めて削って
    ベクタテーブルを削ったつもりです。

    これにより結合後のmotのベクタテーブルについては
    セレクタプログラムのベクタテーブルのみが残っている
    状況だと理解しています。

    >パワーオンからマイコンがどのように動いて行くのか、アセンブラレベルで追って行けますか?
    >「何の為に有るのか知らないけれど、サンプルに書いてある事をそのまま書いている」なんて言う部分は有りませんか?

    このあたりを理解するための資料で手元にあるのが
    RL78コンパイラコース テキストの2章くらいですので
    睨めつつ、実機を使って
    何がダメだったのかを理解出来るように進めている段階です。

  • >↑この時点でプログラムAはLED1を点灯、プログラムBはLED2を点灯するような簡単なプログラムにして
    >動作を確認してみました。
    >CS+からの設定でベクタテーブルを生成しないようにはしておりません。
    >(出力させない設定項目があるのでしょうか?NoMaY様の仰る、分割して出力することでしょうか?
    >何か生成しないようにするためのコードを追加するなり削るなりするのでしょうか?)

     最初にジャンプするアドレスがMOTファイルの3箇所に書かれているんじゃないかと疑った訳です。
     動いているんなら、スタックポインタの設定は出来ていますか。
     プログラムA,Bは、単独で動くんですか?

     私の書いた方法で複雑な事をしなくても、普通に関数を呼び出す方法でも良いんですよ。
     スタック領域に戻りアドレスを書かなくて良いので、ほんの少しだけRAMの節約になるぐらいかな。
     既にプログラムA,Bが開発してあるとか、プログラムA,Bが大きくて、一緒にしているとコンパイルなどに時間が取られる場合に有効な方法です。
     プログラムA,Bが小さければ、複雑な事をしても、間違いや手間が増えるだけです。
     ROMを選択してブロック消去した場合、開発している部分のプログラムだけ書き換えればいいので、消去書き込みの時間が節約出来る。この場合MOTファイルは、変更する部分だけ。
     ただし書き込みソフトが前ROMを消去するならメリットが無い。
  • リカルド様

    先のプログラムではどのプログラムでもスタートアップルーチンの
    __STACK_ADDR_STARTはデフォルトのままいじっていませんので
    スタックポインタの設定はできていないと考えるべきなのでしょうか(;

    MOTの内容から見ると飛び先の0x04000~には
    プログラムAの為のスタートアップルーチンがあり、
    その中で_hdwinitやら_stkinitやらが動いて
    プログラムAが動いた(ように見えているだけ??)

    同じく0x06000~にはプログラムBの為の~
    プログラムBが動いた(ように見えているだけ??)

    の状態になっているのかと思っていました。

    皆様から教えていただいたように
    やり方はいろいろあるようですが
    まだまだその段階にたどり着くためのレベルになっていないので
    じっくり勉強していきます。
  • >__STACK_ADDR_STARTはデフォルトのままいじっていませんので
    >スタックポインタの設定はできていないと考えるべきなのでしょうか(;

    「何をやっているのか知らないけど、書いてあったから入れてある」と言うレベルじゃ無理ですよ。
    プログラムA、Bは単独で動くんですか?
    それが出来ないのに、それより複雑な事をいきなりやろうとしても無理です。

    スタックポインターがどのように設定されるのかは、開発ソフトの説明を見なければ分かりません。
    RX621とHEWの場合は、スタック領域のセクションを指定すると、リンカーが自動的にスタックポインタを設定するプログラムを作ってくれる。

    コンパイラやリンカがアセンブルソフトを出力してくれるから、それを見れば命令が何処に書いてあり、どんな命令が書かれているか分かります。
     そういうのを見れば、スタックポインタが幾つに設定されたかも分かります。
  • リカルド様

    セレクタとは別なプロジェクトで作成したプログラムAとBという意味であれば

    それぞれ単独で動きます。

    ※SWをおせばプログラムAではLED1が点灯、離すと消灯

    プログラムBではLED2が点灯、離すと消灯

    motに結合するために切り出した部分のプログラムAとBという意味であれば

    ベクターテーブル等を切り取っているので当然ながら単独では動作しません。

     

    リカルド様はCC-RLは使用されないのでしょうか。

    CC-RLの各種資料や、FAQ 1011553を参考にするとリンカが

    __STACK_ADDR_STARTをスタックポインタに設定してくれているとのことなので

    そうしています。

     

    いずれにせよ、皆様から頂いたご回答・アドバイスを活用するには

    まだまだ勉強をしなければ飲みこめないということが

    よく分かりましたので、頑張ります。

  • スタック領域は関数を呼んだときの戻りアドレスを入れたり、演算している時レジスタを退避したりするのに使います。
     それらを使わない単純なプログラムなら、スタックポインタの設定がどうであってもエラーは生じない訳です。

     LEDを点灯するのはセレクタが思ったように動作するか同化の予備的な試験であって、最終的な目的のプログラムが他にあるんじゃないんですか。
     そのプログラムを実行するときにスタックポインタの問題が有って、誤動作すると言う流れだと思ったんだけど。
     単純なプログラムであれば、MOTファイルを切り貼りするのは無駄です。

    >リカルド様はCC-RLは使用されないのでしょうか。

    使用しません。

    >__STACK_ADDR_STARTをスタックポインタに設定してくれているとのことなのでそうしています。

     それによって「スタックポインタが幾つに設定されている筈だ」と把握して有りますか?
     把握していれば、「筈だ」の部分をチェックする方法へと進む訳です。
  • リカルド様、

    今、Sugachanceさんは『いきなり複雑なことを試してうまく行かなかった』と『単純なことを
    試したのでうまく行った』との狭間で自身の技術力を高めて問題点を突き止める作業を
    かふぇルネでの情報交換中に知った知見を基にして自力で進めようとしている途中だと
    思います。リカルド様が『RL78やCS+のことは良く知らないし状況も良く分からないが、
    経験上、こういうのはスタックポインタの問題が有って誤動作しているという流れに違い
    ない筈だから、どうしてスタックポインタ設定を今すぐ調べようとしないのだ?』と考えて
    おられるのは分かりますが、今回の件は納期が迫っていて焦っているという案件では
    ありませんので、もう少し長い目で様子を見ては(Sugachanceさんの理解が向上する
    ペースを容認されてみては)如何でしょうか。

  • NoMaY様

    フォローありがとうございます。

    リカルド様
    NoMaY様の文中やこれまでの投稿と他の方とのやり取りを見て頂ければご理解いただけると思いますが、
    皆様にアドバイス頂いたようにまずは単純なプログラムからという事で、
    1から進めているところですので、
    最終目的のプログラムにたどり着く以前の問題(段階)です。
    いろいろアドバイスを頂いておりますが、まだまだそれを実現できるレベルに
    たどり着けていませんので、どうかご容赦ください。

Reply
  • NoMaY様

    フォローありがとうございます。

    リカルド様
    NoMaY様の文中やこれまでの投稿と他の方とのやり取りを見て頂ければご理解いただけると思いますが、
    皆様にアドバイス頂いたようにまずは単純なプログラムからという事で、
    1から進めているところですので、
    最終目的のプログラムにたどり着く以前の問題(段階)です。
    いろいろアドバイスを頂いておりますが、まだまだそれを実現できるレベルに
    たどり着けていませんので、どうかご容赦ください。

Children
No Data