お世話になっております。長文で失礼します。
対象: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さん、こんにちは。質問を読んでいて所謂『ドリルと穴』の格言が頭に浮かんで来たのですが、投稿内に書かれていない、本来の目的、あるいは、解決したい真の課題、というのが何かありそうな気がするのですが、実際のところ、どうなのでしょうか?参照されている投稿を例にすれば、以下のような説明があればと思います。(その投稿内に書かれていますが)・同時に動作する必要は無いが共にRAMを大量に使う2つの処理がしたいもっとも『ドリルと穴』の話としては、掘り下げが足りないかも(?)ですが、、、
Sugachanceさん、こんにちは。たぶん、Sugachanceさんがやりたいことを、自分の仕事として請け負えるレベルで理解することが出来ただろう、と思います。以下のような『思い』があるのだろうな、と私は受け取りました。(1) 現場に製品が出た後は現場の人達にフラッシュ書き換えさせたくない(2) 開発の人達同士のインターフェース作業を出来るだけ減らしてあげたい将来的に以下のようなことも思い描いておられるのかな、とも思いました。(A) 社内コミュニケーションツールでプログラマさん達に『XX月XX日XX時 までにサーバのXXフォルダにHEXファイルを置いて下さい』と連絡(B) 時刻が来たらバッチファイル実行などで自動的にHEXファイルを結合(C) 結合したHEXファイルを自動的に工場へ転送(D) 工場では受け取ったHEXファイルを指定ロットから製造基板に適用(E) オペレータの人達がスイッチ操作だけで作業を遂行ちょっとCC-RL&CS+で確かめておきたいことはありますが、どのようにすれば良いか、結構具体的なことまでイメージは浮かんでいるのですが、逆に具体的になりすぎて、どう情報交換するのが良いか考えてしまう面もあります。(あと、いざとなればアセンブラを使えばいいと思っていたり、MOTファイルの結合/切り貼りにスクリプト言語を使いそうなこと、とか。)どうするのが良いのかな、、、
Sugachanceさん、こんにちは。MOTファイルの結合/切り貼りをどう自動化するかは後で考えるとして、各プロジェクトでは恐らく割り込みも使うでしょうから、私であれば以下の画面コピーのように.rvectorというセクションを作って、そこに関数ポインタテーブルを置くと思います。そして、セレクターの方からは、main()および各割り込みハンドラの中でスイッチの状態を調べて、関数ポインタ経由でターゲットの方のスタートアップルーチンおよび各割り込みルーチンに飛ぶように作ると思います。画面コピー1また、このようなプログラムの初期デバッグでは、私はシミュレータを活用します。以下の画面コピーのように設定すると、ターゲットの方のプログラムをソースレベルデバッグ出来るようになると思いますので、今現在思うように動いていない理由を調べることが出来ると思います。画面コピー2
Sugachanceさん、こんにちは。細切れですみません。ひとまず割り込みの話も脇へ置いて、最初の投稿での質問についてです。(1) 添付されていた図ですが、私もそのように考えています。また、図の中にあった『この部分はどうなる?無視できる?』に関しては、CALLT機能や割り込みを使わなければ無視出来ます。使うのであれば何らかのケアが必要になります。(2) 足りない設定ということで、とっさに思い付くことはないです。思った通りの動きをしない部分を地道にデバッグしてみるしかないような気がします。ただ、ちょっと気になるのは、MOTファイルを作成された時に結合された以下の部分は何なのだろうかとは思っています。『セレクタ後半(S113FE00...からS903...の部分)』(3) MAPファイルを[すべて]出力の設定(以下の画面コピー)にして確認したところ、この品種ではスモールモデルだからなのだと思うのですが、スタートアップルーチン(ラベル_startで始まるルーチン)は.textセクションの0x4000番地にありました。それで、気になったのですが、セレクタプログラムから飛んで来る時のアドレスは_startのアドレスになっているでしょうか?画面コピー追記リセットベクタが16ビット分しかありませんので、スタートアップルーチンは元々.textセクションに配置される筈だろうと思います。
NoMaY様 いろいろとありがとうございます。勉強になります。 とりあえず、割り込みをリセット以外削除してみて motの手動結合で プログラムAとBの選択的な起動はできました。 ※mapを見ると ADDRESS SYMBOL/ADDRESS 00 _start 02 ffff のみの状態 これが(1)の無視した状態に相当するという風に理解しました。 (デバッグはしない前提として) (3)についても_startが0x04000と0x06000にありましたので セレクタからそれぞれ飛んで、それぞれのスタートアップが
改めて実行されて動いたのかと思います。 (2)については、3つのファイルに共通で出力されていました。 S1で始まってアドレスFE00からFFF0まで(+S9のアドレス指定終了)が書かれていましたので プログラム領域の最後の部分が出ているのだと思いますが プログラムを書いていない部分だと思うので、 この出力はお約束ごとなのかと思ってました? ちょっとではありますが、進んだ感じはするので もう少し頑張ってみます。 やはり割り込み関連やRAM関連の整理が出来ないといけないようですね。 ただ、 ・ベクタ・テーブルは0x00000~0x0007Eの範囲の偶数アドレスのみ ・これだと複数プログラムで被る領域が出てくるのでRFPでmotをただ結合させただけではエラー という問題は残りそうなので、RFPでの結合は難しいのかなとも思っています。