任意のフラッシュアドレスへのCALL

こんにちは

やましょうです。

CS+ FOR CAなのですが、

下記のコードを実行するとRAMなぜか0XF1234に飛んでしまうのですが、

 void  (*TargetRom)(void);

TargetRom = (void *) 0x001234;
TargetRom ();

ROMの1234に飛ばすには、何かおまじないが必要なのでしょうか?

以上

よろしくお願いいたします。

Parents
  • チョコです。

    何も指定しないと、*TargetRomはnear属性になって、0xFxxxxの領域とみなされます。そのため、0x001234は0xF1234になります。

    おそらく、*TargetRomについて、__far宣言が必要なはずです。

    CA78K0Rのマニュアルが手元にないので、具体的な設定は確実ではありませんが。

  • チョコさん

    いつもありがとうございます。

    試してみましたが、ダメですね。
    やっぱf1234hに飛びますね。。。(ミスっていました。汗)
    回避方法はアセンブラで対応すれば行けるので、
    ありがとうございました。

  • やましょう さん、こんにちは。NoMaYです。

    いやいや、これはちゃんとしたやり方がある筈ですよ。ちょっと調べますね。

  • やましょう さん、こんにちは。NoMaYです。

    __near/__farは、使っていないとどうしても忘れてしまって、久々に使おうとすると少し試行錯誤しないと思い出せないですね。今回、やましょうさんが使われているデバイスのROMサイズが64Kバイト以上だとして(CA78K0Rでコンパイル時のメモリモデルがミディアムモデルと呼ばれるものになります)、以下の数パターンを試してみるとパターン1と2は期待したコードにはなりませんでした。他は期待したコードになりました。ミディアムモデルでは(void *)のキャストにより(たぶんチョコさんの理由の話で)直感したコードから外れたコードになるようですが、それではないかなと思われます。

    パターン1:NG (やましょうさんの最初のコード)

        void (*TargetRom)(void);

        TargetRom = (void *) 0x001234;
        TargetRom ();

     
    パターン2:NG (やましょうさんの次のコード)

        void __far (*TargetRom)(void);

        TargetRom = (void *) 0x001234;
        TargetRom ();

     
    パターン3:OK

        void (*TargetRom)(void);

        TargetRom = 0x001234;
        TargetRom ();

     
    パターン4:OK

        void (*TargetRom)(void);

        TargetRom = (void (*)(void)) 0x001234;
        TargetRom ();

      
    パターン5:OK

        void (*TargetRom)(void);

        TargetRom = (void __far *) 0x001234;
        TargetRom ();

     
    パターン6:OK

        void (*TargetRom)(void);

        TargetRom = (void __far (*)(void)) 0x001234;
        TargetRom ();

      
    ちなみに、以下のような書き方も出来ます。

    別案

        ((void (*)(void)) 0x001234)();

     
    一応、以下の画面コピーの通りコンパイラのヘルプに__near/__farの記載はあるのですが、今回は、まさに所望している記述例が無かったですね。(他には、フラッシュセフルプログラミングのファームウェアアップデートのアプリケーションノートのサンプルコードにも、何かしらの記述例が載っていたように思います。)

    CS+ for CA,CXのコンパイラのヘルプの画面コピー


     

Reply
  • やましょう さん、こんにちは。NoMaYです。

    __near/__farは、使っていないとどうしても忘れてしまって、久々に使おうとすると少し試行錯誤しないと思い出せないですね。今回、やましょうさんが使われているデバイスのROMサイズが64Kバイト以上だとして(CA78K0Rでコンパイル時のメモリモデルがミディアムモデルと呼ばれるものになります)、以下の数パターンを試してみるとパターン1と2は期待したコードにはなりませんでした。他は期待したコードになりました。ミディアムモデルでは(void *)のキャストにより(たぶんチョコさんの理由の話で)直感したコードから外れたコードになるようですが、それではないかなと思われます。

    パターン1:NG (やましょうさんの最初のコード)

        void (*TargetRom)(void);

        TargetRom = (void *) 0x001234;
        TargetRom ();

     
    パターン2:NG (やましょうさんの次のコード)

        void __far (*TargetRom)(void);

        TargetRom = (void *) 0x001234;
        TargetRom ();

     
    パターン3:OK

        void (*TargetRom)(void);

        TargetRom = 0x001234;
        TargetRom ();

     
    パターン4:OK

        void (*TargetRom)(void);

        TargetRom = (void (*)(void)) 0x001234;
        TargetRom ();

      
    パターン5:OK

        void (*TargetRom)(void);

        TargetRom = (void __far *) 0x001234;
        TargetRom ();

     
    パターン6:OK

        void (*TargetRom)(void);

        TargetRom = (void __far (*)(void)) 0x001234;
        TargetRom ();

      
    ちなみに、以下のような書き方も出来ます。

    別案

        ((void (*)(void)) 0x001234)();

     
    一応、以下の画面コピーの通りコンパイラのヘルプに__near/__farの記載はあるのですが、今回は、まさに所望している記述例が無かったですね。(他には、フラッシュセフルプログラミングのファームウェアアップデートのアプリケーションノートのサンプルコードにも、何かしらの記述例が載っていたように思います。)

    CS+ for CA,CXのコンパイラのヘルプの画面コピー


     

Children