2011-08-08 5 views
2

나는배치하는 방법을 변수 - PIC 18 MPASM 링커 스크립트

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 

결과 : 내가 선을 복사하여 명시 적으로 액세스 은행을 정의하려고 어쩌면 경우

는이 파일을 포함에서. Assembler/Linker 문서에 따르면 RAM 옵션이있는 SECTION을 사용합니다. RAM은 ACCESSBANK, SHAREBANK 또는 DATABANK를 사용하여 이전에 선언 된 위치입니다. 그것은 작동해야합니다.

감사 - 리처드

답변

1

링커 스크립트를 사용 기본을 변경할 필요가 정말 없다!

액세스 된 파일 레지스터는 PIC18 MCPU에서 언제든지 사용할 수 있습니다. 0x00에서 시작하여 0x60 주소에서 끝나는 ACCESSBANK라는 적절한 메모리 데이터뱅크에 변수를 선언하기 만하면됩니다.

당신이 선언보다 더 MPLAB을 사용하는 경우 :

링커가 자동으로 ACCESSBANK에 선언 된 파일 레지스터 주소에 대한 코드의 명령에 'A'비트를 설정한다
_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 
;... 

.

+0

저는 현재 수동으로 A를 설정하고 있으므로 좋을 것입니다. 이것은 링커를 사용하여 코드의 위치를 ​​코드화합니다. 나는 여러개의 소스 파일을 가지고있어서 늦게 찾아 다니는 것이 좋다. 나는 udata_acs를 시험해보고 SECTION 선언을 생략 할 것입니다. –

+0

물론, 이것이 유일한 방법입니다 ... :) –

+0

그건 효과가있었습니다. 의견의 공간 제약으로 인해 나는 다른 답변으로 전체 정보를 게시하고 있습니다. –

1

내가 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 
... 

나의 현재 링커 스크립트가 제공 스크립트를 사용 그래서, 내가 액세스에서 원하는 변수를 선언 할 UDATA_ACS를 사용하여,하지만 내 세그먼트를 정의하고있다. PIC16과 달리 스크립트에는 프로그램 페이지가 하나만 정의되어 있습니다. 더 이상 PAGESEL?예상대로

하드 코딩 사항 : 올바른 장소에서

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

EEPROM : 포장

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

움직이는 위치를

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 

결과 맵은 매핑 내가 기대 포함

 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 바이트가됩니다.