2

開始するリンカースクリプトがあります

    INCLUDE 18f14K50_g.lkr

割り込みサービス変数を ACCESS バンクに入れたいです。(私のプログラムは現時点では非常に小さいですが、将来的には...)。そう

    SECTION     NAME=VarsModemISR   RAM=accessram

その結果:

MPLINK 4.39, Linker
Device Database Version 1.1
Copyright (c) 1998-2011 Microchip Technology Inc.
Error - section 'VarsModemISR' has a memory 'accessram' which is not defined in the linker command file.
Errors    : 1

含まれているファイルを調べると、そうであると思います。それか、私は拡張モードで作業しており、「gpre」はそうです。#IFDEF を使用して確認できます。これを試しました。その結果、「gpre」ではなく「accessram」を使用しようとしていました。

インクルード ファイルから次の行をコピーして、アクセス バンクを明示的に定義しようとすると、次のようになります。

ACCESSBANK NAME=accessram  START=0x0               END=0x5F
SECTION     NAME=VarsModemISR   RAM=accessram

これにより、エラーが発生します

MPLINK 4.39, Linker
Device Database Version 1.1
Copyright (c) 1998-2011 Microchip Technology Inc.
Error - duplicate definition of memory 'accessram' 
Errors    : 1

これは私を混乱させました。アセンブラー/リンカーのドキュメントによると、RAM オプションを指定して SECTION を使用します。ここで、RAM は以前に ACCESSBANK、SHAREBANK、または DATABANK を使用して宣言されています。それはうまくいくはずです。

ありがとう - リチャード

4

2 に答える 2

1

UDATA_ACSを使用して、アクセスしたい変数を宣言しているので、modem.asmに

; Variables for the interrupt handler  - Access RAM
VarsModemISR    UDATA_ACS

wave_index          res 1     ; Index into the wave table for current sample
sample_period       res 1     ; Sample period in use, TMR0 ticks
sample_count        res 1     ; Amount of samples output since last bit boundary
fsrtmpl             res 1     ; Temporary store for FSR
fsrtmph             res 1     ; Temporary store for FSR

; Variables for the modem code  - GPR0, non-Access
VarsModem       UDATA

flag                res 1     ; Counter for transmitting AX25 flags
bit                 res 1     ; Bit counter when transmitting a character
ch                  res 1     ; Current character being transmitted
...

現在のリンカースクリプトは提供されたスクリプトを使用していますが、セグメントを定義しています。PIC16とは異なり、スクリプトで定義されているプログラムページは1つだけであることに注意してください。もうPAGESELはありませんか?

INCLUDE 18f14K50_g.lkr

SECTION     NAME=CodeModemISR   ROM=page
SECTION     NAME=CodeModem      ROM=page
SECTION     NAME=CodeWaveTable  ROM=page
SECTION     NAME=CodeEepromUtil ROM=page
SECTION     NAME=VarsModem      RAM=gpr0
SECTION     NAME=VarsGPSState   RAM=gpr0
SECTION     NAME=CodeConfigEEPROM   ROM=eedata

結果のマップには、私が期待するマッピングが含まれています。

予想どおりにハードコードされた場所:

 HighInterruptVector       code   0x000008    program   0x000004
 LowInterruptVector       code   0x000018    program   0x000002

移動可能な場所が詰め込まれています:

         CodeModemISR       code   0x00001a    program   0x000028
            CodeModem       code   0x000042    program   0x0000fe
        CodeWaveTable       code   0x000140    program   0x000040
             CodeMain       code   0x000180    program   0x000054

適切な場所にあるEEPROM

     CodeConfigEEPROM       code   0xf00000    program   0x000044

そしてACCESSRAMとGP0の変数

         VarsModemISR      udata   0x000000       data   0x000005
            VarsModem      udata   0x000060       data   0x000027
         VarsGPSState      udata   0x000087       data   0x00000e

解決すべき問題は他にもありますが、他の投稿にある可能性があります。CodeWaveTableは64バイトを使用しているため、密集していないことに注意してください。解決策-CODE_PACKを使用すると、32バイトになります。

于 2011-08-09T18:38:49.937 に答える
1

リンカー スクリプトを変更する必要はまったくありません。既定のものを使用してください。

アクセスされたファイル レジスタは、PIC18 MCPU でいつでも利用できます。0x00 で始まり 0x60 アドレスで終わる ACCESSBANK という名前の適切なメモリ データバンクで変数を宣言するだけです。

MPLAB を使用している場合は、次のように宣言します。

_Shared        udata_acs        0        ;Shared memory file registers
IntReg1        res              1
IntReg2        res              1
;...

_UpperBank0    udata            060h     ;Banked file memory registers
RegA           res              1
;...

_Bank1         udata            0100h    ;Banked file memory registers
N              res              1
;...

リンカは、ACCESSBANK で宣言されているファイル レジスタ アドレスのコード命令で「a」ビットを自動的に設定する必要があります。

于 2011-08-09T07:47:06.883 に答える