+ 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 -
This commit is contained in:
florian 2009-06-20 07:33:25 +00:00
parent a5f3cd9b1d
commit a70d36e9c7
2 changed files with 16 additions and 14 deletions

View File

@ -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

View File

@ -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