hbchf 发表于 2013-12-4 22:29:00

请问下lpc2xx的.s文件里面,用户模式堆栈大小怎么理解?

本帖最后由 hbchf 于 2013-12-4 22:31 编辑

;/*****************************************************************************
;*   startup.s: startup file for NXP LPC230x Family Microprocessors
;*
;*   Copyright(C) 2006, NXP Semiconductor
;*   All rights reserved.
;*
;*   History
;*   2006.09.01ver 1.00    Prelimnary version, first Release
;*
;*****************************************************************************/
        PRESERVE8

;/*
; *The STARTUP.S code is executed after CPU Reset. This file may be
; *translated with the following SET symbols. In uVision these SET
; *symbols are entered under Options - ASM - Define.
; *
; *REMAP: when set the startup code initializes the register MEMMAP
; *which overwrites the settings of the CPU configuration pins. The
; *startup and interrupt vectors are remapped from:
; *   0x00000000default setting (not remapped)
; *   0x40000000when RAM_MODE is used
; *
; *RAM_MODE: when set the device is configured for code execution
; *from on-chip RAM starting at address 0x40000000.
; */


; Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs

Mode_USR      EQU   0x10
Mode_FIQ      EQU   0x11
Mode_IRQ      EQU   0x12
Mode_SVC      EQU   0x13
Mode_ABT      EQU   0x17
Mode_UND      EQU   0x1B
Mode_SYS      EQU   0x1F

I_Bit         EQU   0x80            ; when I bit is set, IRQ is disabled
F_Bit         EQU   0x40            ; when F bit is set, FIQ is disabled


;// <h> Stack Configuration (Stack Sizes in Bytes)
;//   <o0> Undefined Mode      <0x0-0xFFFFFFFF:8>
;//   <o1> Supervisor Mode   <0x0-0xFFFFFFFF:8>
;//   <o2> Abort Mode          <0x0-0xFFFFFFFF:8>
;//   <o3> Fast Interrupt Mode <0x0-0xFFFFFFFF:8>
;//   <o4> Interrupt Mode      <0x0-0xFFFFFFFF:8>
;//   <o5> User/System Mode    <0x0-0xFFFFFFFF:8>
;// </h>

UND_Stack_SizeEQU   0x00000000
SVC_Stack_SizeEQU   0x00000100
ABT_Stack_SizeEQU   0x00000000
FIQ_Stack_SizeEQU   0x00000000
IRQ_Stack_SizeEQU   0x00000100
USR_Stack_SizeEQU   0x00002000 ;

Stack_Size      EQU   (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + \
                         FIQ_Stack_Size + IRQ_Stack_Size + USR_Stack_Size)

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size

Stack_Top       EQU   Stack_Mem + Stack_Size


;// <h> Heap Configuration
;//   <o>Heap Size (in Bytes) <0x0-0xFFFFFFFF>
;// </h>

Heap_Size       EQU   0x00000000

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
Heap_Mem      SPACE   Heap_Size

; Area Definition and Entry Point
;Startup Code must be linked first at Address at which it expects to run.

                AREA    RESET, CODE, READONLY
                ARM

; Exception Vectors
;Mapped to Address 0.
;Absolute addressing mode must be used.
;Dummy Handlers are implemented as infinite loops which can be modified.

Vectors         LDR   PC, Reset_Addr         
                LDR   PC, Undef_Addr
                LDR   PC, SWI_Addr
                LDR   PC, PAbt_Addr
                LDR   PC, DAbt_Addr
                NOP                            ; Reserved Vector
;               LDR   PC, IRQ_Addr
                LDR   PC,    ; Vector from VicVectAddr
                LDR   PC, FIQ_Addr

Reset_Addr      DCD   Reset_Handler
Undef_Addr      DCD   Undef_Handler
SWI_Addr      DCD   SWI_Handler
PAbt_Addr       DCD   PAbt_Handler
DAbt_Addr       DCD   DAbt_Handler
                DCD                0xB9206E28             ; Reserved Address
IRQ_Addr      DCD   IRQ_Handler
FIQ_Addr      DCD   FIQ_Handler

Undef_Handler   B       Undef_Handler
SWI_Handler   B       SWI_Handler
PAbt_Handler    B       PAbt_Handler
DAbt_Handler    B       DAbt_Handler
IRQ_Handler   B       IRQ_Handler
FIQ_Handler   B       FIQ_Handler


; Reset Handler

                EXPORTReset_Handler
Reset_Handler   

; Setup Stack for each mode
                LDR   R0, =Stack_Top

;Enter Undefined Instruction Mode and set its Stack Pointer
                MSR   CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit
                MOV   SP, R0
                SUB   R0, R0, #UND_Stack_Size

;Enter Abort Mode and set its Stack Pointer
                MSR   CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit
                MOV   SP, R0
                SUB   R0, R0, #ABT_Stack_Size

;Enter FIQ Mode and set its Stack Pointer
                MSR   CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit
                MOV   SP, R0
                SUB   R0, R0, #FIQ_Stack_Size

;Enter IRQ Mode and set its Stack Pointer
                MSR   CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit
                MOV   SP, R0
                SUB   R0, R0, #IRQ_Stack_Size

;Enter Supervisor Mode and set its Stack Pointer
                MSR   CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit
                MOV   SP, R0
                SUB   R0, R0, #SVC_Stack_Size

;Enter User Mode and set its Stack Pointer
                MSR   CPSR_c, #Mode_USR
                MOV   SP, R0
                SUB   SL, SP, #USR_Stack_Size
                               
                                MOV   R0, #0x40000000         ;RAM区首地址
                LDR   R1, =Vectors            ;向量表首地址#下面一段程序是把从0x00000000开始的64个字节(FLASH中的中断向量表和地址表)搬移到以#0x40000000为首地址的RAM区中
                LDMIA   R1!, {R2-R9}             ;把以为首地址的32个字节数据装载到R2-R9中
                STMIA   R0!, {R2-R9}             ;把R2-R9中的数据存入以为首地址的单元中
                LDMIA   R1!, {R2-R9}             ;把以为首地址的32个字节数据装载到R2-R9中
                STMIA   R0!, {R2-R9}             ;把R2-R9中的数据存入以为首地址的单元中
                               
                               
                                IMPORT        TargetResetInit
                                BL                TargetResetInit

; Enter the C code

                IMPORT__main
                LDR   R0, =__main
                BX      R0


; User Initial Stack & Heap
                AREA    |.text|, CODE, READONLY

                IMPORT__use_two_region_memory
                EXPORT__user_initial_stackheap
__user_initial_stackheap

                LDR   R0, =Heap_Mem
                LDR   R1, =(Stack_Mem + USR_Stack_Size)
                LDR   R2, = (Heap_Mem +      Heap_Size)
                LDR   R3, = Stack_Mem
                BX      LR

                END

hbchf 发表于 2013-12-4 22:40:40

上面第57行,USR_Stack_SizeEQU   0x00002000 这个堆栈在实际应用中是什么原理?
我理解是就是程序在ram上创建了个堆栈结构的数据结构,用于存储程序里面的所有变量。比如程序每执行一个子函数时,为局部变量的空间申请提供空间。是这样理解的吗?希望哪位高手能够深入的替我分析下,谢谢了!
页: [1]
查看完整版本: 请问下lpc2xx的.s文件里面,用户模式堆栈大小怎么理解?