打印
[ZLG-ARM]

启动代码疑问

[复制链接]
1479|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
leonlais|  楼主 | 2008-12-1 11:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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             ; :OR:     Mode_UND,I_Bit,F_Bit之间按位作逻辑或操作,设置未定义模式,禁止FIQ,IRQ
                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
                
                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

下面语句的目的是?
__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
为什么要把堆栈的顶和底赋给不同的寄存器?

相关帖子

沙发
阿穆琪| | 2008-12-4 13:01 | 只看该作者

__user_initial_stackheap 是runlibC定义的东西

调用malloc free之类的东西就从这里取。详细信息可在ADS帮助手册里面查

使用特权

评论回复
板凳
liyangbbs| | 2008-12-4 15:55 | 只看该作者

这样的。

如果你使用分散加载文件,那么编译器就不会生成一些特定的编译符号,这时需要借助你自己编写的这个__usrinitialstackheap来初始化堆和栈。使用这些寄存器进行参数的传递,约定好的。你可以查看帮助手册。

使用特权

评论回复
地板
AnMCU| | 2008-12-4 17:50 | 只看该作者

我也在学习中

启动代码我也在看,看看周工的深入浅出ARM7 上的第3章 和ARM体系结构与编程
这两本书上有描述!但我还 没有完全看明白!那位 看明白了,提示一下,感谢了!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

26

帖子

0

粉丝