mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-22 17:09:27 +02:00
+ 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:
parent
a5f3cd9b1d
commit
a70d36e9c7
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user