[fpc-devel] How can I distribute code in two different memory areas? (.section)

Michael Ring mail at michael-ring.org
Mon Jun 3 08:07:59 CEST 2013


This version worked,

thank you for your help!

Michael

Am 02.06.13 23:20, schrieb Jeppe Græsdal Johansen:
> Den 02-06-2013 23:15, Michael Ring skrev:
>> Unfortunately that does not seem to work (or I use it wrong):
>>
>> This procedure:
>>
>> procedure _general_exception_handler; assembler; nostackframe; public 
>> name '_GENERAL_EXCEPTION_HANDLER';
>> asm
>>   .section "reset"
>>   sdbbp 0;
>>   .Lloopb:
>>    b .Lloopb
>> end;
>>
>> translates to:
>>
>> .section .text.n_pic32mx1xxfxxxc_$$__general_exception_handler
>>         .balign 4
>> .globl  PIC32MX1XXFXXXC_$$__GENERAL_EXCEPTION_HANDLER
>>         .type PIC32MX1XXFXXXC_$$__GENERAL_EXCEPTION_HANDLER, at function
>> PIC32MX1XXFXXXC_$$__GENERAL_EXCEPTION_HANDLER:
>> .globl  _GENERAL_EXCEPTION_HANDLER
>>         .type   _GENERAL_EXCEPTION_HANDLER, at function
>> _GENERAL_EXCEPTION_HANDLER:
>>         .ent    PIC32MX1XXFXXXC_$$__GENERAL_EXCEPTION_HANDLER
>>
>> .section reset
>>         sdbbp   0
>> .Lj11:
>>         b       .Lj11
>>         jr      $ra
>>         nop
>>         .set    macro
>>         .set    reorder
>>         .end    PIC32MX1XXFXXXC_$$__GENERAL_EXCEPTION_HANDLER
>> .Lt3:
>> .Le2:
>>         .size   PIC32MX1XXFXXXC_$$__GENERAL_EXCEPTION_HANDLER, .Le2 - 
>> PIC32MX1XXFXXXC_$$__GENERAL_EXCEPTION_HANDLER
>> .Ll8:
>>
>> which creates an assembler error:
>>
>> /Users/ring/devel/fpc/rtl/units/mipsel-embedded/pic32mx1xxfxxxc.s:94: 
>> Error: operation combines symbols in different segments
>>
>> the error is from the .size line.
>>
>>
>>
>> Am 02.06.13 22:51, schrieb Jeppe Græsdal Johansen:
>>> Den 02-06-2013 22:41, Michael Ring skrev:
>>>> Hi, perhaps I am overseeing a simple solution for my problem:
>>>>
>>>> On the pic32 there are two flash areas, one at 0x9d000000 for the 
>>>> main program and another at 0xbfc00000 that is called Boot Flash. 
>>>> On reset the program starts in the boot flash at the first address.
>>>>
>>>> I have written the startup code for the chips now but I need to 
>>>> distribute some procedures between the two memory areas, for 
>>>> obvious reasons I must have some code at address 0xbfc00000 or the 
>>>> chip will not boot correctly ;-).
>>>>
>>>> My thought was now to tweak the linker script in the same way the 
>>>> original linker scripts of pic32 work:
>>>>
>>>> MEMORY
>>>> {
>>>>   kseg0_program_mem    (rx)  : ORIGIN = 0x9D000000, LENGTH = 0x80000
>>>>   kseg1_boot_mem             : ORIGIN = 0xBFC00000, LENGTH = 0x490
>>>> }
>>>>
>>>> SECTIONS
>>>> {
>>>>   .reset _RESET_ADDR :
>>>>   {
>>>>     KEEP(*(.reset))
>>>>     KEEP(*(.reset.startup))
>>>>   } > kseg1_boot_mem
>>>> }
>>>>
>>>> In assembler I can then simply write:
>>>>  .section .reset,code and
>>>>  .section .reset.startup,code
>>>>
>>>> and then the code, this will automagically end up in the 
>>>> kseg1_boot_mem, but this does not work with the inline assembler. 
>>>> Any ideas on how to do this the correct way? Is there something 
>>>> more intelligent than to write a plain assembler file?
>>>>
>>>> TnX,
>>>>
>>>> Michael
>>>
>>> You should be able to use
>>> .section ".reset" 
>>
>
> Try
>
> procedure _general_exception_handler; assembler; nostackframe; public 
> name '_GENERAL_EXCEPTION_HANDLER';
> asm
>   .section "reset"
>   sdbbp 0;
>   .Lloopb:
>    b .Lloopb
>   .text
> end;
>
>
> _______________________________________________
> fpc-devel maillist  -  fpc-devel at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-devel

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20130603/60c64619/attachment.html>


More information about the fpc-devel mailing list