Browse Source

+ set stack through linker script
* reduced size of fiq and irq stack
* fixed data coping and bss zero'ing loop

git-svn-id: trunk@13301 -

florian 16 years ago
parent
commit
a70d36e9c7
2 changed files with 16 additions and 14 deletions
  1. 2 1
      compiler/systems/t_embed.pas
  2. 14 13
      rtl/embedded/arm/lpc21x4.pp

+ 2 - 1
compiler/systems/t_embed.pas

@@ -229,6 +229,7 @@ begin
           Add('    flash : ORIGIN = 0, LENGTH = 256K');
           Add('    flash : ORIGIN = 0, LENGTH = 256K');
           Add('    ram : ORIGIN = 0x40000000, LENGTH = 16K');
           Add('    ram : ORIGIN = 0x40000000, LENGTH = 16K');
           Add('}');
           Add('}');
+          Add('_stack_top = 0x40003FFC;');
         end;
         end;
       ct_at91sam7s256,
       ct_at91sam7s256,
       ct_at91sam7se256,
       ct_at91sam7se256,
@@ -242,7 +243,7 @@ begin
           Add('    flash : ORIGIN = 0, LENGTH = 256K');
           Add('    flash : ORIGIN = 0, LENGTH = 256K');
           Add('    ram : ORIGIN = 0x200000, LENGTH = 64K');
           Add('    ram : ORIGIN = 0x200000, LENGTH = 64K');
           Add('}');
           Add('}');
-          Add('_stack_end = 0x20FFFC;');
+          Add('_stack_top = 0x20FFFC;');
         end;
         end;
 
 
     else
     else

+ 14 - 13
rtl/embedded/arm/lpc21x4.pp

@@ -431,6 +431,7 @@ unit lpc21x4;
       _etext: record end; external name '_etext';
       _etext: record end; external name '_etext';
       _bss_start: record end; external name '_bss_start';
       _bss_start: record end; external name '_bss_start';
       _bss_end: record end; external name '_bss_end';
       _bss_end: record end; external name '_bss_end';
+      _stack_top: record end; external name '_stack_top';
 
 
     procedure _FPC_start; assembler; nostackframe;
     procedure _FPC_start; assembler; nostackframe;
       label
       label
@@ -484,15 +485,14 @@ unit lpc21x4;
 
 
     _start:
     _start:
         (*
         (*
-          Set SP for Supervisor mode. Depending upon
-          the stack the application needs this value
-          needs to be set.
+          Set absolute stack top
+
           stack is already set by bootloader
           stack is already set by bootloader
           but if this point is entered by any
           but if this point is entered by any
           other means than reset, the stack pointer
           other means than reset, the stack pointer
           needs to be set explicity
           needs to be set explicity
         *)
         *)
-        // LDR SP,=0x40001000
+        ldr r0,.L_stack_top
 
 
         (*
         (*
           Setting up SP for IRQ and FIQ mode.
           Setting up SP for IRQ and FIQ mode.
@@ -506,17 +506,16 @@ unit lpc21x4;
         *)
         *)
 
 
         (*
         (*
-          setup for fiq and irq interrupt stacks to run
-          below current stack by 1000.
+          setup irq and fiq stacks each 128 bytes
         *)
         *)
-        mov r0, sp         // copy current stack pointer
-        sub r0, r0, #1000  // make irq stack pointer
-        sub r1, r0, #1000  // make fiq stack pointer
         msr cpsr_c, #0x12  // switch to irq mode
         msr cpsr_c, #0x12  // switch to irq mode
         mov sp, r0         // set irq stack pointer
         mov sp, r0         // set irq stack pointer
+        sub r0,r0,#128     // irq stack size
         msr cpsr_c, #0x11  // fiq mode
         msr cpsr_c, #0x11  // fiq mode
-        mov sp, r1         // set fiq stack pointer
+        mov sp, r0         // set fiq stack pointer
+        sub r0,r0,#128     // fiq stack size
         msr cpsr_c, #0x13  // supervisor mode F,I enabled
         msr cpsr_c, #0x13  // supervisor mode F,I enabled
+        mov sp, r0         // stack
 
 
         ldr r1,.LDefaultHandlerAddr
         ldr r1,.LDefaultHandlerAddr
         ldr r0,.L1
         ldr r0,.L1
@@ -538,8 +537,8 @@ unit lpc21x4;
         ldr r3,.L_edata
         ldr r3,.L_edata
 .Lcopyloop:
 .Lcopyloop:
         cmp r2,r3
         cmp r2,r3
-        ldr r0,[r1],#4
-        str r0,[r2],#4
+        ldrls r0,[r1],#4
+        strls r0,[r2],#4
         bls .Lcopyloop
         bls .Lcopyloop
 
 
         // clear onboard ram
         // clear onboard ram
@@ -548,7 +547,7 @@ unit lpc21x4;
         mov r0,#0
         mov r0,#0
 .Lzeroloop:
 .Lzeroloop:
         cmp r1,r2
         cmp r1,r2
-        str r0,[r1],#4
+        strls r0,[r1],#4
         bls .Lzeroloop
         bls .Lzeroloop
 
 
         bl PASCALMAIN
         bl PASCALMAIN
@@ -563,6 +562,8 @@ unit lpc21x4;
         .long _data
         .long _data
 .L_edata:
 .L_edata:
         .long _edata
         .long _edata
+.L_stack_top:
+        .long _stack_top
 .LDefaultHandlerAddr:
 .LDefaultHandlerAddr:
         .long .LDefaultHandler
         .long .LDefaultHandler
         // default irq handler just returns
         // default irq handler just returns