お世話になっております。長文で失礼します。
対象: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()などが再度実行されるという理解でよろしいのでしょうか。(セレクタプログラムで設定したものが更新される?)
セクションの割り付け等理解できていないところが多く、質問自体意味不明かもしれませんが
このあたり詳しい方がおられましたら、教えていただきたく思います。よろしくお願いいたします。
リカルド様 >とりあえず、割り込みをリセット以外削除してみて >motの手動結合で >プログラムAとBの選択的な起動はできました。 ↑この時点でプログラムAはLED1を点灯、プログラムBはLED2を点灯するような簡単なプログラムにして 動作を確認してみました。 CS+からの設定でベクタテーブルを生成しないようにはしておりません。 (出力させない設定項目があるのでしょうか?NoMaY様の仰る、分割して出力することでしょうか? 何か生成しないようにするためのコードを追加するなり削るなりするのでしょうか?) ベクタテーブルの割り付け変更を「0x00000~0x0007E」から変更していなければ、 motにおけるS1130000の行からS1130070の行までがベクタテーブルに 相当する部分だと思っているので(ここであってますよね?)、 プログラムAとプログラムBからその部分も含めて削って ベクタテーブルを削ったつもりです。 これにより結合後のmotのベクタテーブルについては セレクタプログラムのベクタテーブルのみが残っている 状況だと理解しています。 >パワーオンからマイコンがどのように動いて行くのか、アセンブラレベルで追って行けますか? >「何の為に有るのか知らないけれど、サンプルに書いてある事をそのまま書いている」なんて言う部分は有りませんか? このあたりを理解するための資料で手元にあるのが RL78コンパイラコース テキストの2章くらいですので 睨めつつ、実機を使って 何がダメだったのかを理解出来るように進めている段階です。
リカルド様
セレクタとは別なプロジェクトで作成したプログラムAとBという意味であれば
それぞれ単独で動きます。
※SWをおせばプログラムAではLED1が点灯、離すと消灯
プログラムBではLED2が点灯、離すと消灯
motに結合するために切り出した部分のプログラムAとBという意味であれば
ベクターテーブル等を切り取っているので当然ながら単独では動作しません。
リカルド様はCC-RLは使用されないのでしょうか。
CC-RLの各種資料や、FAQ 1011553を参考にするとリンカが
__STACK_ADDR_STARTをスタックポインタに設定してくれているとのことなので
そうしています。
いずれにせよ、皆様から頂いたご回答・アドバイスを活用するには
まだまだ勉強をしなければ飲みこめないということが
よく分かりましたので、頑張ります。
リカルド様、今、Sugachanceさんは『いきなり複雑なことを試してうまく行かなかった』と『単純なことを試したのでうまく行った』との狭間で自身の技術力を高めて問題点を突き止める作業をかふぇルネでの情報交換中に知った知見を基にして自力で進めようとしている途中だと思います。リカルド様が『RL78やCS+のことは良く知らないし状況も良く分からないが、経験上、こういうのはスタックポインタの問題が有って誤動作しているという流れに違いない筈だから、どうしてスタックポインタ設定を今すぐ調べようとしないのだ?』と考えておられるのは分かりますが、今回の件は納期が迫っていて焦っているという案件ではありませんので、もう少し長い目で様子を見ては(Sugachanceさんの理解が向上するペースを容認されてみては)如何でしょうか。
NoMaY様 フォローありがとうございます。 リカルド様 NoMaY様の文中やこれまでの投稿と他の方とのやり取りを見て頂ければご理解いただけると思いますが、 皆様にアドバイス頂いたようにまずは単純なプログラムからという事で、 1から進めているところですので、 最終目的のプログラムにたどり着く以前の問題(段階)です。 いろいろアドバイスを頂いておりますが、まだまだそれを実現できるレベルに たどり着けていませんので、どうかご容赦ください。