お世話になっております。長文で失礼します。
対象: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つ追加することになる予感がしていて、セレクタプログラムをメンテする人には逆にハードルが上がりそうですが、、、(うまくいったら、また投稿します。)
リカルド様 >とりあえず、割り込みをリセット以外削除してみて >motの手動結合で >プログラムAとBの選択的な起動はできました。 ↑この時点でプログラムAはLED1を点灯、プログラムBはLED2を点灯するような簡単なプログラムにして 動作を確認してみました。 CS+からの設定でベクタテーブルを生成しないようにはしておりません。 (出力させない設定項目があるのでしょうか?NoMaY様の仰る、分割して出力することでしょうか? 何か生成しないようにするためのコードを追加するなり削るなりするのでしょうか?) ベクタテーブルの割り付け変更を「0x00000~0x0007E」から変更していなければ、 motにおけるS1130000の行からS1130070の行までがベクタテーブルに 相当する部分だと思っているので(ここであってますよね?)、 プログラムAとプログラムBからその部分も含めて削って ベクタテーブルを削ったつもりです。 これにより結合後のmotのベクタテーブルについては セレクタプログラムのベクタテーブルのみが残っている 状況だと理解しています。 >パワーオンからマイコンがどのように動いて行くのか、アセンブラレベルで追って行けますか? >「何の為に有るのか知らないけれど、サンプルに書いてある事をそのまま書いている」なんて言う部分は有りませんか? このあたりを理解するための資料で手元にあるのが RL78コンパイラコース テキストの2章くらいですので 睨めつつ、実機を使って 何がダメだったのかを理解出来るように進めている段階です。
Sugachanceさん、こんにちは。割り込み関連やRAM関連の整理に役立つ資料はないかとルネサスさんのサイトをチェックしていたところ、コンパイラの製品ページのドキュメントに『ブート領域、フラッシュ領域の分割方法(CC-RL)』という資料があることに気付きました。目を通すと、以下のようなファイルを作成し、画面コピーのようにWindowsのコマンドプロンプトでCC-RLのリンカ(rlink)を実行すると、MOTファイルを結合出来ることが分かりました。ファイルcombine.clnkコマンド cd C:\Renesas\CCRL-SelectorE:\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.pdfCC-RLコンパイラのドキュメントページwww.renesas.com/.../compiler-package-for-rl78-family.html#documentsすみません、『上から目線』的な言い回しになって申し訳ないのですが、これが理解出来れば今回の件は比較的簡単な応用事例だと言えそうに思います。ただ、今回の件には必要無さそうな技術も多く書かれていて、結構難易度高いです。
NoMaY様 いつもありがとうございますm(_ _)m 「ブート領域、フラッシュ領域の分割方法(CC-RL)」 さらっと見てみましたが、確かにこれが理解できれば やりたいことに近づきそうな気がします。 大変助かります。