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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.