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

 

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

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

  • > (1) 目的を実現するには添付の図のような理解であっているのでしょうか。

    プログラムAとBが割り込みを使わないものであれば図の方法での実現も不可能ではないと思います。割り込みを使うのであれば RAM 上にフックを設けるなど工夫が必要になるでしょう。

    > (2) 設定が足りない項目があると思うのですが、思い当たるものはありますでしょうか。
    >
    > (3) 現状の理解が正しいとして
    > .textfにスタートアップが含まれる(RL78コンパイラコース テキストより)ということは、
    > セレクタプログラムからプログラムA or プログラムBに飛んだ時に
    > それぞれ該当するスタートアップルーチンが再度実行され
    > hwinit()などが再度実行されるという理解でよろしいのでしょうか。
    > (セレクタプログラムで設定したものが更新される?)

    この辺りの理解が乏しいのであれば、技術的困難が予想されるのでセレクタプログラムとプログラムAとBは単一のプロジェクトで作成されることをお勧めします。
  •  Sugachanceさん、こんにちは。

    質問を読んでいて所謂『ドリルと穴』の格言が頭に浮かんで来たのですが、
    投稿内に書かれていない、本来の目的、あるいは、解決したい真の課題、
    というのが何かありそうな気がするのですが、実際のところ、どうなので
    しょうか?

    参照されている投稿を例にすれば、以下のような説明があればと思います。
    (その投稿内に書かれていますが)
    ・同時に動作する必要は無いが共にRAMを大量に使う2つの処理がしたい
    もっとも『ドリルと穴』の話としては、掘り下げが足りないかも(?)ですが、、、

  • わわいです
    RLはあんましよーわかりませんが、一般論としていきます
    まず、プログラムA,プログラムBは、コード領域、定数領域、データ領域は独立したエリアを使用するようにする必要があります。
    これらのメモリ割り当てがわからない、というのであればこういうことをするのは無理なので勉強しましょう。
    また、内部処理がわからないうちは、標準関数、組み込み関数、割り込みも使えないとおもっていたほうがいいです

    まずは、自分で書いたコードだけの小さなプログラムから試してみてはどうでしょうか。

    >”エラー(E3000101): アドレス(0x00000000)にはデータが既に存在します。”
    あなたが組んだコードに、割込みベクタを含んでいるために、重複して存在しているがためのエラーと推察されます。
    これをどーにかしましょう。
  • fujita nozomu様

    レスありがとうございます。
    RAMの方も工夫が必要なのですね。
    どうやら現状では難しいそうだということは分かりました。
  • NoMaY様
    レスありがとうございます。

    現状は社内の実験に用いるもの(≠製品)ですが、
    将来的に汎用基板製造時に複数プログラムを書いておいて
    現場で製品に応じてSWでプログラムを選択するというような
    事を実現したいのです。

    現状、機能ごとにいくつかのプロジェクトに分かれて作ったプログラムがあるので
    うまく結合して使えないかなと思った次第です。
    また、複数プロジェクトに分けておけば、数人で同時並行的にプログラムを作って
    書き込むときに結合して書き込むということができるかなと思いました。

    皆さんからのご指摘の通り、
    理解できていない部分も多いのですが、
    この際そのあたりの勉強もかねてトライしてみようと思ったというのもあります。
  • わわい様
    レスありがとうございます。

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



    理解できていない、「メモリ割り当て」に関して
    勉強するのに適したおすすめの書籍やwebページ等ございますでしょうか?
  • 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での結合は難しいのかなとも思っています。