打印
[ZLG-MCU]

ARM启动代码

[复制链接]
2265|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linhai1986|  楼主 | 2009-8-17 17:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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
为什么要把堆栈的顶和底赋给不同的寄存器?

相关帖子

沙发
xiaoxin1986| | 2009-8-17 17:52 | 只看该作者
建议初学者先不要学习启动代码,先从片内外设的使用编程开始。

实际上,启动代码很少用到,厂家往往都给你写好了。

使用特权

评论回复
板凳
linhai1986|  楼主 | 2009-8-22 16:11 | 只看该作者
初学了解了启动代码,对ARM就会有个比较清淅的认识了,个人觉得还是去了解一下好多了,

使用特权

评论回复
地板
xiaoxin1986| | 2009-8-22 16:24 | 只看该作者
深入了解启动代码,往往需要较多的时间和背景知识。理解起来也比较麻烦,在实际应用中有需要的时候再去了解,这样印象会深刻很多,效果也好。

使用特权

评论回复
5
linhai1986|  楼主 | 2009-8-23 15:21 | 只看该作者
我试试,虽然看不太懂,但是以前学过微机原理。

堆栈的底部用来确定一个堆栈的初始位置,也就是说从哪里开始是一个堆栈区域。当初始化以后一般不再改变

堆栈的顶部用来确定堆栈的大小,堆栈不是无限大的,一般需要指定堆栈的空间大小。用顶部“减”去底部自然就可以得出堆栈的大小了。当然根据堆栈的增长方向是向上还是向下,减的时候是不一样的,因为最后的堆栈的大小是正数。

所以,堆栈的顶部和底部是分开来的。

上面代码中的R3中应该存储的是堆栈的底部,而R1中应该是堆栈的顶部。USR_Stack_Size表示的就是堆栈的大小。这个可以根据自己的需要进行设置。而stack_mem一般也是在启动代码里确定的,不过由于芯片的种类问题,一般情况下,这个的位置相对于一款芯片是相对固定的。具体在哪里,我也记不清了。

还有上面的应该是初始化“堆”和“栈”两部分,两者具体区别可以去看看书。我也说不太清楚。

瞎说一气,还请管理员和其他高手指正,谢谢

使用特权

评论回复
6
xiaoxin1986| | 2009-8-23 15:36 | 只看该作者
__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
其作用你去从   ; Enter the C code

                IMPORT  __main
                LDR     R0, =__main
                BX      R0

BX R0后开始运行的,你可以去看看做什么用的,从DISASSEMBLY 中就可以看到了

使用特权

评论回复
7
linhai1986|  楼主 | 2009-8-23 15:54 | 只看该作者
ADS的Online books有讲到的。
如果使用了分散加载文件,就需要调用__user_initial_stackheap。
__user_initial_stackheap的作用是为C运行环境分配堆和栈的空间。
可参考ADS的Online books第4.9.4小节。

使用特权

评论回复
8
linhai1986|  楼主 | 2009-8-23 15:54 | 只看该作者
确实打不开,不知是不是盗版的缘故。
可以这样打开:
“开始”——“所有程序”——“ARM Developer Suite v1.2”——“Online Books”

使用特权

评论回复
9
xiaoxin1986| | 2009-8-24 15:18 | 只看该作者
r0---r3分别代表堆栈地址、长度等。看了几天启动代码,好歹能看懂一点了。不看永远不懂。

使用特权

评论回复
10
linhai1986|  楼主 | 2009-8-24 15:29 | 只看该作者
呵呵,继续努力:)

使用特权

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

本版积分规则

172

主题

1451

帖子

0

粉丝