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

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

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

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

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

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

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

     とてつもない配列サイズですがRAMの容量は足りてますでしょうか。

     モジュールを分割してグローバル変数を共有して使う場合はだいたいこんな感じだと思います。
     ヘッダを共用する場合は変数定義が各モジュールでダブらないよう工夫すればOKです。


    変数定義ヘッダファイル:Header.H
    //---------------------------------------------------
    #ifndef  _DEF_APP_HDR_       // 多重定義対策
     #define  _DEF_APP_HDR_

    // 各プログラム用の構造体型定義

    // 共用体型定義
    typedef union _UN_PGM_VAR_ {
       PRG_A stPRGA;
       PRG_B stPRGB;
       PRG_C stPRGC;
      } UN_PGM_VAR ;

    // 変数定義
    #ifdef _APP_DEF_
      UN_PGM_VAR     gunPgmVar ; // main.c 用
      char        cPgmNum ; // プログラム識別
    #else
    // _APP_DEF_
      extern UN_PGM_VAR  gunPgmVar ; // main.c 以外用
      extern char     cPgmNum ; // プログラム識別
    #endif // _APP_DEF_

    // 関数プロトタイプ
    void pgm_A( void ) ;

    #endif // _DEF_APP_HDR_
    //---------------------------------------------------


    メインモジュール:main.c
    //---------------------------------------------------
    #define _APP_DEF_         // 内部識別
    #include \”Header.h\”        // アプリケーションヘッダ

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


    サブモジュール:sub.c
    //---------------------------------------------------
    #include \”Header.h\”        // アプリケーションヘッダ


    void pgm_A( void )
    {
       PRG_A *pstPRGA;

     // PGM-Aのメイン処理
     gunPgmVar.stPRGA.TestBuf1[1] = gunPgmVar.stPRGA.TestBuf1[0] ;
     // 長ったらしいのでポインタ処理する場合有り
     pstPRGA = &(gunPgmVar.stPRGA) ;
     pstPRGA->TestBuf1[1] = pstPRGA->TestBuf1[0] ;
    }
    //---------------------------------------------------
Reply
  • LunaJamといいます。

     とてつもない配列サイズですがRAMの容量は足りてますでしょうか。

     モジュールを分割してグローバル変数を共有して使う場合はだいたいこんな感じだと思います。
     ヘッダを共用する場合は変数定義が各モジュールでダブらないよう工夫すればOKです。


    変数定義ヘッダファイル:Header.H
    //---------------------------------------------------
    #ifndef  _DEF_APP_HDR_       // 多重定義対策
     #define  _DEF_APP_HDR_

    // 各プログラム用の構造体型定義

    // 共用体型定義
    typedef union _UN_PGM_VAR_ {
       PRG_A stPRGA;
       PRG_B stPRGB;
       PRG_C stPRGC;
      } UN_PGM_VAR ;

    // 変数定義
    #ifdef _APP_DEF_
      UN_PGM_VAR     gunPgmVar ; // main.c 用
      char        cPgmNum ; // プログラム識別
    #else
    // _APP_DEF_
      extern UN_PGM_VAR  gunPgmVar ; // main.c 以外用
      extern char     cPgmNum ; // プログラム識別
    #endif // _APP_DEF_

    // 関数プロトタイプ
    void pgm_A( void ) ;

    #endif // _DEF_APP_HDR_
    //---------------------------------------------------


    メインモジュール:main.c
    //---------------------------------------------------
    #define _APP_DEF_         // 内部識別
    #include \”Header.h\”        // アプリケーションヘッダ

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


    サブモジュール:sub.c
    //---------------------------------------------------
    #include \”Header.h\”        // アプリケーションヘッダ


    void pgm_A( void )
    {
       PRG_A *pstPRGA;

     // PGM-Aのメイン処理
     gunPgmVar.stPRGA.TestBuf1[1] = gunPgmVar.stPRGA.TestBuf1[0] ;
     // 長ったらしいのでポインタ処理する場合有り
     pstPRGA = &(gunPgmVar.stPRGA) ;
     pstPRGA->TestBuf1[1] = pstPRGA->TestBuf1[0] ;
    }
    //---------------------------------------------------
Children
No Data