PIC24FJ64GAでのアセンブラ環境覚書 [PIC]
PIC24FJ64GAでアセンブラを使う上で開発環境に関する問題に対して発見した解決方法を覚書として残しておきます。
普通に使う分にはあまり気にならない内容であり、情報価値としては??ではありますが・・・
開発環境はMPLAB IDE V8.92 です。
普通に使う分にはあまり気にならない内容であり、情報価値としては??ではありますが・・・
開発環境はMPLAB IDE V8.92 です。
- ディフォルト設定では .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 をチェックすると無くなる。
- 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ワードの直前まで使えるようになります。
- reset処理の無いアセンブラ処理のHEXファイル作成方法 ★追記 2015/11/22
GAME言語(Tiny Basic interpreter)等からアセンブラ処理をコールする場合等、reset処理、割込みベクタ、configデータの無いhexファイルを作成したい場合があります。このようなケースでは下記の方法で対応できます。
- リンカスクリプトの編集
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 : 以降)
- .reset 定義部
- コード配置アドレスの設定方法
アセンブラのソース内で次のように開始アドレス(下記は0x8000の場合)を指定します。
.section .text_Ap,code,address( 0x8000 )
- リンクオプションの設定
プログラム領域の先頭に不要なコード(下記の「.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の生成も抑止する。
- リンカスクリプトの編集
コメント 0