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

Jeppe Græsdal Johansen jeppe at j-software.dk
Sun Jun 2 23:20:27 CEST 2013


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;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20130602/6a64497b/attachment.html>


More information about the fpc-devel mailing list