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()などが再度実行されるという理解でよろしいのでしょうか。
(セレクタプログラムで設定したものが更新される?)

 

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

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

  • Sugachanceさん、こんにちは。

    昨年末にCC-RXを使っていた時にCC-RXのリンカではプログラムの
    一部だけをMOT/HEXファイルあるいはBINファイルに切り出すことが
    出来ることに気付いたのですが、CC-RLでも同じことが出来ることが
    分かりました。以下の画面コピーのようにしたところ、1範囲のみを
    出力させたり、複数範囲を別々のファイルに出力させたり、といった
    ことが出来ました。

    画面コピー1


    画面コピー2


    機能の詳細は以下のリンクで確認することが出来ます。

    CS+ オンラインヘルプ > CS+ V4.01.00 > RL78[CC-RL環境] > ビルド・ツール操作編 > ウインドウ・リファレンス > 説明 > プロパティ パネル

    [ヘキサ出力オプション]タブ

    出力ファイル

    CS+ オンラインヘルプ > CS+ V4.01.00 > RL78[CC-RL環境] > コンパイラ編 > コマンド・リファレンス > オプション

    2.5.3 リンクオプション

    -OUtput

    私は、Windowsの標準のJScriptやVBScript、CS+に同梱されている
    IronPython、Visual Studio(C++)やCYGWIN/MSYS2のx86版GCC、などが
    そこそこ使えますので、MOTファイルの結合/切り貼りは『どうにかなる
    もの』という感覚で、RFPでの結合は『その手もある』ぐらいの感覚なの
    ですが、そういう人は少数派なのかな、、、

    あと、CC-RLのBINファイル出力機能とBINファイルインクルード機能を
    組み合わせて、幾つか前の投稿で書いた.rvectorセクションの生成を
    自動処理することが出来るようにして、プロジェクトAやプロジェクトBの
    コーディング作業で楽が出来るようにならないものかと考え始めました。
    とはいえ、RL78マイコンの命令セットの裏技っぽいことも必要になり
    そうで、セレクタプログラムの方にはアセンブラソースを1つ追加する
    ことになる予感がしていて、セレクタプログラムをメンテする人には逆に
    ハードルが上がりそうですが、、、(うまくいったら、また投稿します。)

  • NoMaY様

    情報ありがとうございます。
    分割出力ができたのですね。
    RFPのmot結合機能はこれとの組み合わせも
    念頭に置いた機能と考えれば、その意義が分かった気がします。


    >RFPでの結合は『その手もある』ぐらいの感覚なの
    ですが、そういう人は少数派なのかな、、、

    良いか悪いかは置いておいて
    「とにかく公式で用意されているものを利用すれば間違いない」
    という考え方があるからだと思いますが・・・
  • わわいです
    出力オブジェクトに、コードにない初期化部や割り込みベクタなどを含めないようリンカに指定はできないんでしょうか?
    なんか、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を消去するならメリットが無い。
  • Sugachanceさん、こんにちは。

    割り込み関連やRAM関連の整理に役立つ資料はないかとルネサスさんの
    サイトをチェックしていたところ、コンパイラの製品ページのドキュメントに
    『ブート領域、フラッシュ領域の分割方法(CC-RL)』という資料があることに
    気付きました。目を通すと、以下のようなファイルを作成し、画面コピーの
    ようにWindowsのコマンドプロンプトでCC-RLのリンカ(rlink)を実行すると、
    MOTファイルを結合出来ることが分かりました。

    ファイル
    combine.clnk

    コマンド
    cd C:\Renesas\CCRL-Selector
    E:\tools\micom\Renesas\CS+\CC\CC-RL\V1.02.00\bin\rlink -subcommand=combine.clnk

    画面コピー


    ただ、ちょっと引っ掛かったのは、CS+でファイルを作成した時のデフォルトが
    UTF-8でしたのでファイルの先頭にBOMコードが入っていたからだと思いますが、
    以下のように、エラーが発生してしまいましたのでUTF-8をSJISに変更しました。

    NG時の画面コピー(切り貼り)


    OK時の画面コピー(切り貼り)


    ちなみに、気付いた資料とコンパイラのドキュメントページは以下の通りです。

    ブート領域、フラッシュ領域の分割方法(CC-RL)
    www.renesas.com/.../r20ut3475jj0200_ccrl.pdf

    CC-RLコンパイラのドキュメントページ
    www.renesas.com/.../compiler-package-for-rl78-family.html#documents

    すみません、『上から目線』的な言い回しになって申し訳ないのですが、これが
    理解出来れば今回の件は比較的簡単な応用事例だと言えそうに思います。ただ、
    今回の件には必要無さそうな技術も多く書かれていて、結構難易度高いです。

  • リカルド様

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

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

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

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

    皆様から教えていただいたように
    やり方はいろいろあるようですが
    まだまだその段階にたどり着くためのレベルになっていないので
    じっくり勉強していきます。
  • NoMaY様

    いつもありがとうございますm(_ _)m

    「ブート領域、フラッシュ領域の分割方法(CC-RL)」
    さらっと見てみましたが、確かにこれが理解できれば
    やりたいことに近づきそうな気がします。
    大変助かります。

  • >__STACK_ADDR_STARTはデフォルトのままいじっていませんので
    >スタックポインタの設定はできていないと考えるべきなのでしょうか(;

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

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

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