Wie versetze ich den Programmspeicherort im Speicher mit MPLABX XC8?

Ich habe einen Bootloader, der sich an den Positionen 0x0000 bis 0x0fff auf einem 8-Bit-PIC18F befindet. Wie sage ich dem XC8-Compiler, dass er eine Hex-Datei ausgeben soll, die bei 0x1000 beginnt?

Mit einem CCS-Compiler, den mein Freund verwendet, verwendet er den folgenden Code:

#define LOADER_SIZE                 (0xFFF)
#define LOADER_START                (0) 
#define LOADER_END                  (LOADER_SIZE) 
#define APPLICATION_START           (LOADER_SIZE+1) 
#define APPLICATION_END             (getenv("PROGRAM_MEMORY")-1) 
#define APPLICATION_ISR             (APPLICATION_START+8) 

#ifdef _BOOTLOADER
    //in the application, this moves the reset and isr vector out of the bootload 
    //space.  it then reserves the loader space from being used by the application. 
    #build(reset=APPLICATION_START, interrupt=APPLICATION_ISR) 
    #org 0, LOADER_END {} 
#endif

Beim Durchstöbern der Microchip Libraries for Applications (MLA) habe ich dies für den C18-Compiler gefunden, der XC8-Compiler erkennt jedoch keinen "#pragma-Code".

#define REMAPPED_RESET_VECTOR_ADDRESS               0x1000
#define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS  0x1008
#define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS   0x1018

extern void _startup (void);        // See c018i.c in your C18 compiler dir
#pragma code REMAPPED_RESET_VECTOR = REMAPPED_RESET_VECTOR_ADDRESS
void _reset (void) {
    _asm goto _startup _endasm
}
#pragma code REMAPPED_HIGH_INTERRUPT_VECTOR = REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS
void Remapped_High_ISR (void) {
     _asm goto YourHighPriorityISRCode _endasm
}
#pragma code REMAPPED_LOW_INTERRUPT_VECTOR = REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS
void Remapped_Low_ISR (void) {
     _asm goto YourLowPriorityISRCode _endasm
}
#pragma code HIGH_INTERRUPT_VECTOR = 0x08
void High_ISR (void) {
     _asm goto REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS _endasm
}
#pragma code LOW_INTERRUPT_VECTOR = 0x18
void Low_ISR (void) {
     _asm goto REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS _endasm
}

Antworten (1)

Eine schnelle Suche führte mich zu dieser Diskussion im Microchip-Forum , wo die Lösung darin zu bestehen scheint, --CODEOFFSET als eines der Linker-Argumente anzugeben.

Das Forum hat auch einen Link zu einem Webinar zum gleichen Thema.

Befehlszeile:

Sie können den Offset beim Kompilieren mit der Befehlszeile übergeben, indem Sie ihn --codeoffset=<location>beim Linken übergeben (zB --codeoffset=0x1000).

MPLABX-IDE

Geben Sie den Code-Offset an, indem Sie auf Projekteigenschaften -> Globale XC8-Optionen -> XC8-Linker zugreifen , die Optionskategorien: in Zusätzliche Optionen ändern und den Offset in das Feld Codeoffset eingeben:

Geben Sie hier die Bildbeschreibung ein

Die Überprüfung der HEX-Datei nach Verwendung des --CODEOFFSET 0x1000Parameters zeigt, dass sie korrekt ab 0x1000 beginnt. Danke!
Brillant! Dies hat mir wirklich geholfen zu verstehen, wie dies konfiguriert wurde: github.com/luciodj/BlueBoot/issues/1