2001年7月30日 作成

Using PRC-Tools
■戻る■  ■トップ■  ■進む■


マルチコードリソース

Dragonball プロセッサは、32K 以下の距離を持つ相対ジャンプのみを生成するので、 32K 以内のサイズを持つコードリソースであれば任意のジャンプが可能である。 「jump islands」のような、様々な冒険的なテクニックでもって、 プロセッサが有効にジャンプできる距離が上限なしに伸びている。 しかし、これは、HotSync のプロトコルにより、リソースが 64K に制限されるため、 本当に価値がある方法ではない。 32K 以上のサイズのコードをアプリケーションに持たせる最善の方法は、 複数に分割されたコードリソース(マルチコードリソース)を持つことである。

マルチコードリソースを生成するある簡単な方法は、 個々の GCC コードセクションを、 個々の Palm OS コードリソースにマッピングすることである。 このバージョンの prc-tools では、次の制限された形式を実装している。 標準の GCC の section 属性 (Using and Porting GCC の `Declaring Attributes of Functions' を参照のこと) を通じて、関数に特定のセクションを割当てることができる。 (これは、コンパイラの初期段階で行われるため、 -ffunction-sections のような、 関数を異なるセクションに置く他の方法やリンク時の再配列は機能しない。)

現在では、アプリケーションのグローバルデータに対する、 コードリソースへのポインタとして実装されている。 これは、グローバルデータが利用可能でないときに、 メインのコードセクションにない関数を呼出してはならないことを意味している。 例えば、グローバルデータが与えられていない起動コードの処理が挙げられる。

build-prcへ新しいセクションを知らせるため、 マルチコードが箇条書きされている プロジェクトの定義ファイル(定義ファイルを参照のこと)を使用しなければならない。 実行形式にリンクされるアセンブリ言語のスタブファイルに、 上記のポインタ変数を定義しなければならない。 そして、新しいセクションを適切なアドレスに配置するために、 リンカスクリプトを使用しなければならない。 これらのことを簡単に行う方法に、 multigen を使用する方法がある。 multigen は、同じ定義ファイルからスタブファイル、リンカスクリプトを生成するプログラムである。 (multigenを参照のこと。)

既存のアプリケーションからの移行

マルチコードリソースを既存のアプリケーションで使用する場合、 以下のことを行わなければならない:

  1. Makefile で obj-res を使用している場合、 bfd 実行形式に直接 build-prc を使用するよう変更する。 もともと以下のような記述があるとする。

    
      myapp.prc: code0000.myapp.grc ...
              build-prc ... *.myapp.grc ...
    
      code0000.myapp.grc: myapp
              obj-res myapp
    

    .grc ファイルへの参照と obj-res のルールをとを削除する:

    
      myapp.prc: myapp ...
              build-prc ... myapp ...
    

  2. 他のコードセクションに配置する関数を選択し、それらの宣言に註釈をつける:

    
      #define EDIT_SECTION  __attribute__ ((section ("editfns")))
    
      void EditFormHandler (...) EDIT_SECTION;
      void DrawEditForm () EDIT_SECTION;
    

    (これは、一度に複数の関数に対して、簡単に対応するマクロを使ったものである。) COFF では、セクション名に 8 文字しか使えないことに注意すること。 8 文字以上のセクション名を用いた場合、名前が省略され、トラブルの元となる。

  3. マルチコードに関する条項を定義ファイルに追加する。 (又は、定義ファイルを書き、build-prc のコマンドラインで使用する。)

    
      multiple code { "editfns" }
    

  4. Makefile へ、アセンブリ言語のスタブファイルとリンカスクリプトとを生成するルールを追加する。

    
      myapp-sections.o: myapp-sections.s
              m68k-palmos-gcc -c myapp-sections.s
    
      myapp-sections.s myapp-sections.ld: myapp.def
              multigen myapp.def
    

  5. アセンブリスタブを bfd 実行形式へリンクし、 追加のコードセクションを適切なアドレスへ配置するために、リンカスクリプトを使用する。

    
      OBJS = ...list of object files... myapp-sections.o
    
      myapp: $(OBJS) myapp-sections.ld
              m68k-palmos-gcc -o myapp $(OBJS) myapp-sections.ld
    


■戻る■  ■トップ■  ■進む■