Forum: Mikrocontroller und Digitale Elektronik PIC32 und Fehler im Linker Script für zu ladende App


von Martin (Gast)


Lesenswert?

Ich versuche gerade ein C (Standalone-)Programm (übersetzt mit einer
alten Version vom MPLAB C32 Suite, kann ich nicht ändern)
in einen Booter und eine App zu zerlegen.
Ich nehme derzeit einfach mal die Hälfte als Booter,
die andere Hälfte als App. (512 KByte -> 256 KByte + 256 KByte),
später dann feintuning der Größen.

Ich orientiere mich an der App Note AN1388 von Microchip.
Der Booter ist erst einmal kein Problem, da ja das alte
Linker Script weiter benutzt werden kann, ich habe nur die
Größe des Flashs halbiert.

Bei der App habe ich jedoch Probleme mit dem Linker Script,
vor allem dem Anordnen der Bereicht und Angabe von Adressen.

Hier nur ein Ausschnitt des verwendeten Linker Scripts der App:

/*********************************************************************** 
**
 * For interrupt vector handling
 ************************************************************************ 
*/
PROVIDE(_vector_spacing = 0x00000001);
_ebase_address =  0x9D000000 + 0x00040000;

/*********************************************************************** 
**
 * Memory Address Equates
 ************************************************************************ 
*/
_RESET_ADDR              =  (0x9D000000 + 0x00040000 + 0x1000);
_BEV_EXCPT_ADDR          = ((0x9D000000 + 0x00040000 + 0x1000) + 0x380);
_DBG_EXCPT_ADDR          = ((0x9D000000 + 0x00040000 + 0x1000) + 0x480);
_DBG_CODE_ADDR           = 0xBFC02000;
_DBG_CODE_SIZE           = 0xFF0     ;
_GEN_EXCPT_ADDR          = _ebase_address + 0x180;

/*********************************************************************** 
**
 * Memory Regions
 *
 * Memory regions without attributes cannot be used for orphaned 
sections.
 * Only sections specifically assigned to these regions can be allocated
 * into these regions.
 ************************************************************************ 
*/
MEMORY
{
  kseg0_program_mem    (rx)  : ORIGIN = (0x9D000000 + 0x00040000 + 
0x1000 + 0x490), LENGTH = 0x00081000 - (0x00040000 + 0x1000 + 0x490) /* 
All C Files will be located here */
  kseg0_boot_mem             : ORIGIN =  0x9D000000 + 0x00040000, LENGTH 
= 0x0 /* This memory region is dummy */
  exception_mem              : ORIGIN =  0x9D000000 + 0x00040000, LENGTH 
= 0x1000 /* Interrupt vector table */
  kseg1_boot_mem             : ORIGIN = (0x9D000000 + 0x00040000 + 
0x1000), LENGTH = 0x490 /* C Startup code */
  debug_exec_mem             : ORIGIN = 0xBFC02000, LENGTH = 0xFF0
  config3                    : ORIGIN = 0xBFC02FF0, LENGTH = 0x4
  config2                    : ORIGIN = 0xBFC02FF4, LENGTH = 0x4
  config1                    : ORIGIN = 0xBFC02FF8, LENGTH = 0x4
  config0                    : ORIGIN = 0xBFC02FFC, LENGTH = 0x4
  kseg1_data_mem       (w!x) : ORIGIN = 0xA0000000, LENGTH = 0x20000
  sfrs                       : ORIGIN = 0xBF800000, LENGTH = 0x100000
  configsfrs                 : ORIGIN = 0xBFC02FF0, LENGTH = 0x10
}


Jedoch erhalte ich folgende Meldung beim Linken der App:

ld.exe: address 0x9d0401e0 of Object\test.elf section .startup is not 
within region kseg0_boot_mem
ld.exe: section .startup [9d040000 -> 9d0401df] overlaps section 
.app_excpt [9d040180 -> 9d04018f]
ld.exe: Object\test.elf: section .app_excpt lma 0x9d040180 overlaps 
previous sections

Ich habe es schon vor und rückwärts mit dem Linker Script
der App Note verglichen, kenn mich hier aber zu wenig aus,
was ich verändern muss, damit es erfolgreich linkt...
Kann mir da jemand einen Tipp geben?

von Martin (Gast)


Lesenswert?

Wie hängen die Felder zusammen?

kseg0_program_mem scheint der Bereich zu sein,
wo der Code hinkopiert wird und read-only Variablen.
kseg1_data_mem für die Variablen im RAM.

Darf kseg0_boot_mem vielleicht doch nicht leer sein,
auch wenn angegeben ist: /* This memory region is dummy */
Werden/sollten dort die

BEV_EXCPT_ADDR          = ((0x9D000000 + 0x00040000 + 0x1000) + 0x380);
_DBG_EXCPT_ADDR          = ((0x9D000000 + 0x00040000 + 0x1000) + 0x480);
_DBG_CODE_ADDR           = 0xBFC02000;
_DBG_CODE_SIZE           = 0xFF0     ;
_GEN_EXCPT_ADDR          = _ebase_address + 0x180;

reingelegt werden?

Oder kann ich die Felder grundsätzlich an jede Stelle
im Flash legen?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.