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

 

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

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

Parents
  •  Sugachanceさん、こんにちは。

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

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

  • NoMaY様
    レスありがとうございます。

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

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

    皆さんからのご指摘の通り、
    理解できていない部分も多いのですが、
    この際そのあたりの勉強もかねてトライしてみようと思ったというのもあります。
  • 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での結合は難しいのかなとも思っています。

Reply
  • 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での結合は難しいのかなとも思っています。

Children
  • 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での結合は『その手もある』ぐらいの感覚なの
    ですが、そういう人は少数派なのかな、、、

    良いか悪いかは置いておいて
    「とにかく公式で用意されているものを利用すれば間違いない」
    という考え方があるからだと思いますが・・・
  • 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

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

  • NoMaY様

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

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