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

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

@@ -431,6 +431,7 @@ unit lpc21x4;
       _etext: record end; external name '_etext';
       _bss_start: record end; external name '_bss_start';
       _bss_end: record end; external name '_bss_end';
+      _stack_top: record end; external name '_stack_top';
 
     procedure _FPC_start; assembler; nostackframe;
       label
@@ -484,15 +485,14 @@ unit lpc21x4;
 
     _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
           but if this point is entered by any
           other means than reset, the stack pointer
           needs to be set explicity
         *)
-        // LDR SP,=0x40001000
+        ldr r0,.L_stack_top
 
         (*
           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
         mov sp, r0         // set irq stack pointer
+        sub r0,r0,#128     // irq stack size
         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
+        mov sp, r0         // stack
 
         ldr r1,.LDefaultHandlerAddr
         ldr r0,.L1
@@ -538,8 +537,8 @@ unit lpc21x4;
         ldr r3,.L_edata
 .Lcopyloop:
         cmp r2,r3
-        ldr r0,[r1],#4
-        str r0,[r2],#4
+        ldrls r0,[r1],#4
+        strls r0,[r2],#4
         bls .Lcopyloop
 
         // clear onboard ram
@@ -548,7 +547,7 @@ unit lpc21x4;
         mov r0,#0
 .Lzeroloop:
         cmp r1,r2
-        str r0,[r1],#4
+        strls r0,[r1],#4
         bls .Lzeroloop
 
         bl PASCALMAIN
@@ -563,6 +562,8 @@ unit lpc21x4;
         .long _data
 .L_edata:
         .long _edata
+.L_stack_top:
+        .long _stack_top
 .LDefaultHandlerAddr:
         .long .LDefaultHandler
         // default irq handler just returns