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

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

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

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

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

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

ご教授お願いします。
また、上記方法以外にも案がありましたらご提案お願いします。
Parents
  • LunaJamといいます。

    unionを使うと多分こんな感じになると思います。
    注意点としては割込処理ルーチンも別な処理になるなら変数アクセスも別になるようにしなくてはいけませんね。

    エビスクラウンさんのいわれる通りstatic記憶クラスは注意した方がよろしいかと。
    ただし各PGMが(パワーオン)リセットしないと切り替わらないならば競合しないので問題無いと思います。


    typedef struct _ST_VAR_PGMA_ {
        int      nData1 ;  //
         必要なだけ変数を定義
      } ST_VAR_PGMA ;

    typedef struct _ST_VAR_PGMB_ {
        int      nData1 ;  //
         必要なだけ変数を定義
      } ST_VAR_PGMB ;

    typedef struct _ST_VAR_PGMC_ {
        int      nData1 ;  //
         必要なだけ変数を定義
      } ST_VAR_PGMC ;

    typedef union _UN_PGM_VAR_ {
        ST_VAR_PGMA  stVarA ;  // PGM-Aの変数
        ST_VAR_PGMB  stVarB ;  // PGM-Bの変数
        ST_VAR_PGMC  stVarC ;  // PGM-Cの変数
      } UN_PGM_VAR ;

    UN_PGM_VAR   unPgmVar ;    // PGM-A\,B\,C共有変数
    char      cPgmNum ;     // プログラム識別


    void pgm_A( void )
    {
     unPgmVar.stVarA.nData1 = 何とか ;
    }

    void main( void )
    {
     // どこかのI/OチェックしてPGM識別 ->cPgmNum
     switch (cPgmNum) {
       case 1 :
        必要なら変数初期値セット
        pgm_A( ) ;        // PGM-Aを処理
        break ;
       case 2 :
        pgm_B( ) ;        // PGM-Bを処理
        break ;
       case 3 :
        pgm_C( ) ;        // PGM-Cを処理
        break ;
       default :
        break ;
     }

    }
Reply
  • LunaJamといいます。

    unionを使うと多分こんな感じになると思います。
    注意点としては割込処理ルーチンも別な処理になるなら変数アクセスも別になるようにしなくてはいけませんね。

    エビスクラウンさんのいわれる通りstatic記憶クラスは注意した方がよろしいかと。
    ただし各PGMが(パワーオン)リセットしないと切り替わらないならば競合しないので問題無いと思います。


    typedef struct _ST_VAR_PGMA_ {
        int      nData1 ;  //
         必要なだけ変数を定義
      } ST_VAR_PGMA ;

    typedef struct _ST_VAR_PGMB_ {
        int      nData1 ;  //
         必要なだけ変数を定義
      } ST_VAR_PGMB ;

    typedef struct _ST_VAR_PGMC_ {
        int      nData1 ;  //
         必要なだけ変数を定義
      } ST_VAR_PGMC ;

    typedef union _UN_PGM_VAR_ {
        ST_VAR_PGMA  stVarA ;  // PGM-Aの変数
        ST_VAR_PGMB  stVarB ;  // PGM-Bの変数
        ST_VAR_PGMC  stVarC ;  // PGM-Cの変数
      } UN_PGM_VAR ;

    UN_PGM_VAR   unPgmVar ;    // PGM-A\,B\,C共有変数
    char      cPgmNum ;     // プログラム識別


    void pgm_A( void )
    {
     unPgmVar.stVarA.nData1 = 何とか ;
    }

    void main( void )
    {
     // どこかのI/OチェックしてPGM識別 ->cPgmNum
     switch (cPgmNum) {
       case 1 :
        必要なら変数初期値セット
        pgm_A( ) ;        // PGM-Aを処理
        break ;
       case 2 :
        pgm_B( ) ;        // PGM-Bを処理
        break ;
       case 3 :
        pgm_C( ) ;        // PGM-Cを処理
        break ;
       default :
        break ;
     }

    }
Children
No Data