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,@function
PIC32MX1XXFXXXC_$$__GENERAL_EXCEPTION_HANDLER:
.globl  _GENERAL_EXCEPTION_HANDLER
        .type   _GENERAL_EXCEPTION_HANDLER,@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  -  [email protected]
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to