RL78/G13で、デュアルブート

RL78/G13と、CubeSuite+を使用して開発しています。

CPUのGPIOにスイッチを設けて、
スイッチ=OFFの場合はプログラムA、
スイッチ=ONの場合にはプログラムB
を、起動するようなやり方は可能なのでしょうか?

プログラムA、プログラムB双方ともRAMを大量に消費する
プログラムで、機能や動作内容が異なるため、
main処理後にプログラムA、プログラムBを選んで
動作をする余裕がありません。

コードサイズ自体はそれぞれ大きくないのでROMには
入りそうなのですが、RAMがどうにもなりません。

発想としては、リセット解除後に、
スイッチを読み込むプログラムが動作して、
その後、スイッチに従ったプログラムA又はBが動作する
ようなことがしたいのですが、
どのようにCubeSuiteで作成すればよいのかわかりません。

ご教授お願いします。
また、上記方法以外にも案がありましたらご提案お願いします。
Parents
  • RyuKucchanさん、リカルドさん

     まず、リカルドさんの方法でも可能ですが、H8ならば最適化リンカにおけるセクションの複数割り付け機能を使った方が簡単だと思います。
     ROM容量に問題がなく、RAMだけが足りない、しかも2つのプログラムが同時に動くことがないのであれば、プログラムAとプログラムBが使用するRAM領域を同じ番地に配置すれば良いだけです。その機能がH8にはありますから、その機能を使えばプログラムは1本化、ロードモジュールも1つで済みますから、多分ご指摘の方法より簡単だと思います。もっとも、プログラムAとプログラムBで変数の割り付くセクションを分ける必要はありますが。。。

     一方、RyuKucchanさんのRL78の場合、リンクディレクティブにH8と同等の機能があるかと調べてみましたが、私の調べた範囲ではありませんでした(見つかりませんでした)。
     そうなると考えられる方法はプログラムAとプログラムBが使用する外部変数を共用体にするが1つの作戦です。

    例:
    union {
    struct program_A {
      プログラムAが使用する外部変数の宣言
    } A;
    struct program_B {
      プログラムBが使用する外部変数の宣言
    } B;
    } VAL;

     これでプログラムAとプログラムBの外部変数の領域を同一のRAMに割り付けられますが、変数名が長くなり、リストの可読性も悪くなるのが難点です。

     もう1つの作戦は外部変数を全てマクロ名で定義する方法です。例えば、int a;ならば、この宣言の代わりに
    #define a (*(int *)0x....)
    と全て番地を指定して定義する方法です。これでプログラム上は一切変数が存在しないことになりますから、プログラムAとプログラムBで同一番地に変数を配置するだけ、しかも変数宣言以外は何も変える必要なし、となります。

     なお、どちらにしても外部変数に対する初期値の設定は出来ません。初期値は全てプログラムの命令として設定する必要があります。如何でしょうか?
Reply
  • RyuKucchanさん、リカルドさん

     まず、リカルドさんの方法でも可能ですが、H8ならば最適化リンカにおけるセクションの複数割り付け機能を使った方が簡単だと思います。
     ROM容量に問題がなく、RAMだけが足りない、しかも2つのプログラムが同時に動くことがないのであれば、プログラムAとプログラムBが使用するRAM領域を同じ番地に配置すれば良いだけです。その機能がH8にはありますから、その機能を使えばプログラムは1本化、ロードモジュールも1つで済みますから、多分ご指摘の方法より簡単だと思います。もっとも、プログラムAとプログラムBで変数の割り付くセクションを分ける必要はありますが。。。

     一方、RyuKucchanさんのRL78の場合、リンクディレクティブにH8と同等の機能があるかと調べてみましたが、私の調べた範囲ではありませんでした(見つかりませんでした)。
     そうなると考えられる方法はプログラムAとプログラムBが使用する外部変数を共用体にするが1つの作戦です。

    例:
    union {
    struct program_A {
      プログラムAが使用する外部変数の宣言
    } A;
    struct program_B {
      プログラムBが使用する外部変数の宣言
    } B;
    } VAL;

     これでプログラムAとプログラムBの外部変数の領域を同一のRAMに割り付けられますが、変数名が長くなり、リストの可読性も悪くなるのが難点です。

     もう1つの作戦は外部変数を全てマクロ名で定義する方法です。例えば、int a;ならば、この宣言の代わりに
    #define a (*(int *)0x....)
    と全て番地を指定して定義する方法です。これでプログラム上は一切変数が存在しないことになりますから、プログラムAとプログラムBで同一番地に変数を配置するだけ、しかも変数宣言以外は何も変える必要なし、となります。

     なお、どちらにしても外部変数に対する初期値の設定は出来ません。初期値は全てプログラムの命令として設定する必要があります。如何でしょうか?
Children
No Data