So-net無料ブログ作成
English Version

PIC24FJ64GAでのアセンブラ環境覚書 [PIC]

 PIC24FJ64GAでアセンブラを使う上で開発環境に関する問題に対して発見した解決方法を覚書として残しておきます。
 普通に使う分にはあまり気にならない内容であり、情報価値としては??ではありますが・・・

 開発環境はMPLAB IDE V8.92 です。
  1. ディフォルト設定では .dinit セクションが勝手にリンクされる
     セクションのマッピングは
    section  address  length (PC units)  length (bytes) (dec)
    -------  -------  -----------------  --------------------
    .text      0x200                0x4            0x6  (6)
    .text      0x204             0xa9f0         0xfee8  (65256)
    .dinit    0xabf4                0x2            0x3  (3)
    
    のようになり、「.dinit」セクションとして2word分余分なコードが追加されてしまいます。
     リンカスクリプトを見ても直接該当するような部分はなく、ビルドオプションを色々変更して解決方法を発見しました。
     .dinit はC言語を使用する際にデータ初期化をする処理のようです。アセンブラのみを使用する場合は不要です。

    【解決方法】
      project build option
      MPLAB LINK30
      output
      Don't initialize data section をチェックすると無くなる。

  2. config ワードの直前のwordが使えない
     プログラムの一部をメモリトップにアサインしようとした際、アセンブラで書いたコードが config2 の直前のword(具体的には 0xa9fa 部分)に達すると

    Link Error: Could not allocate section .text, size = 43512 PC units, attributes = code
    Link Error: Could not allocate program memory

    となりリンクエラーが発生してしまう。

     これはリンカスクリプトのバグ(というほどのものでもないので誤記?)です。
     リンカスクリプト(p24FJ64GA002.gld)内で「Memory Regions」が
    MEMORY
    {
      data  (a!xr)   : ORIGIN = 0x800,     LENGTH = 0x2000
      reset          : ORIGIN = 0x0,       LENGTH = 0x4
      ivt            : ORIGIN = 0x4,       LENGTH = 0xFC
      _reserved      : ORIGIN = 0x100,     LENGTH = 0x4
      aivt           : ORIGIN = 0x104,     LENGTH = 0xFC
      program (xr)   : ORIGIN = 0x200,     LENGTH = 0xA9FA
      CONFIG2        : ORIGIN = 0xABFC,    LENGTH = 0x2
      CONFIG1        : ORIGIN = 0xABFE,    LENGTH = 0x2
    }
    
    となっていますが program(xr) の LENGTH が1word分足りないためです。

    【解決方法】
    program (xr) : ORIGIN = 0x200, LENGTH = 0xA9FC

    に修正するとリンクが成功し、configワードの直前まで使えるようになります。

  3. reset処理の無いアセンブラ処理のHEXファイル作成方法 ★追記 2015/11/22
     GAME言語(Tiny Basic interpreter)等からアセンブラ処理をコールする場合等、reset処理、割込みベクタ、configデータの無いhexファイルを作成したい場合があります。このようなケースでは下記の方法で対応できます。

    1. リンカスクリプトの編集
       p24FJ64GA002.gld の下記の部分をコメントアウトします。
      • .reset 定義部
        /* 2015/11/21
        .reset :
        {
        SHORT(ABSOLUTE(__reset));
        SHORT(0x04);
        SHORT((ABSOLUTE(__reset) >> 16) & 0x7F);
        SHORT(0);
        } >reset
        2015/11/21 */
      • Configuration Words 定義部
        /* 2015/11/21
        __CONFIG2 :
        { KEEP (*(__CONFIG2.sec*)) } >CONFIG2
        __CONFIG1 :
        { KEEP (*(__CONFIG1.sec*)) } >CONFIG1
        2015/11/21 */
      • Interrupt Vector Table 定義部(.ivt __IVT_BASE : 以降)
      • Alternate Interrupt Vector Table 定義部(.aivt __AIVT_BASE : 以降)

    2. コード配置アドレスの設定方法
       アセンブラのソース内で次のように開始アドレス(下記は0x8000の場合)を指定します。
      .section .text_Ap,code,address( 0x8000 )

    3. リンクオプションの設定
       プログラム領域の先頭に不要なコード(下記の「.text」部分)が付いてしまう。
      section   address   length (PC units)   length (bytes) (dec)
      -------   -------   -----------------   --------------------
      .text       0x200                 0x4             0x6  (6)
      .text_Ap   0x8000                0x18            0x24  (36)
      
      【解決方法】
       下記のリンクオプションを有効にすることで上記の不要なコードがなくなります。
        project build option
        MPLAB LINK30
        output
        Don't create default ISR ← チェックする
      ★2017/03/10 追記
       上記1項で書いた「Don't initialize data section」もチェックし .dinitの生成も抑止する。

nice!(0)  コメント(0)  トラックバック(3) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 3