From a70d36e9c70540bb66bff6276e9bdd339e101ecd Mon Sep 17 00:00:00 2001 From: florian Date: Sat, 20 Jun 2009 07:33:25 +0000 Subject: [PATCH] + 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 - --- compiler/systems/t_embed.pas | 3 ++- rtl/embedded/arm/lpc21x4.pp | 27 ++++++++++++++------------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/compiler/systems/t_embed.pas b/compiler/systems/t_embed.pas index 31e7e1b53b..1ff2926b24 100644 --- a/compiler/systems/t_embed.pas +++ b/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 diff --git a/rtl/embedded/arm/lpc21x4.pp b/rtl/embedded/arm/lpc21x4.pp index db87da0141..be1004a0d6 100644 --- a/rtl/embedded/arm/lpc21x4.pp +++ b/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