主题 : 关于裸机程序的启动代码startup.s 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 82746
精华: 0
发帖: 33
金钱: 165 两
威望: 33 点
综合积分: 66 分
注册时间: 2012-11-27
最后登录: 2017-09-13
楼主  发表于: 2013-01-12 20:58

 关于裸机程序的启动代码startup.s

一直搞不懂这个裸机程序的启动代码应该怎么写,有些很简单,有些又很复杂。

    IMPORT      _main                    ; C entrypoint for Steppingstone loader.
    AREA |C$$code|, CODE, READONLY
    global        Start

Start
        b        _main

        DCB        "ABCDabcd"
        END

像这个就很简单
;*************************************************************************************/

                GET        option.inc

;=======================================================
;                        ENTRY  
;=======================================================

                AREA    Init,CODE,READONLY

                ENTRY
ResetHandler
                
                LDR R13, =top_of_stacks

    [ (USE_TCM = 1)
; ----------------------------------------
;                Initialize TCM
; ----------------------------------------
; TCM0(D-TCM, I-TCM) Configuration
                mov     r0,#0x0
                mcr        p15,0,r0,c9,c2,0        ; Write TCM Selection register

                ldr     r0,=ITCM0_BaseAddress
                mcr        p15,0,r0,c9,c1,1        ; Write Instruction TCM0 region register
                                
                ldr     r0,=DTCM0_BaseAddress
                mcr        p15,0,r0,c9,c1,0        ; Write Data TCM0 region register

; TCM1(D-TCM, I-TCM) Configuration
                mov     r0,#0x1
                mcr        p15,0,r0,c9,c2,0        ; Write TCM Selection register

                ldr     r0,=ITCM1_BaseAddress
                mcr        p15,0,r0,c9,c1,1        ; Write Instruction TCM1 region register
                                
                ldr     r0,=DTCM1_BaseAddress
                mcr        p15,0,r0,c9,c1,0        ; Write Data TCM0 region register
    ]
                
                IMPORT ScatterLoad
                LDR    R0, =ScatterLoad
                MOV    LR, PC
                BX    R0
                
                EXPORT    __main
__main
                ;; initialise the C library (which calls main())
                IMPORT    __rt_entry
                LDR    R0, =__rt_entry
                BX       R0
                
                   b        .
;=======================================================                  
                END
这个又有点复杂,哪位大哥能指点下迷津,帮我解答一下疑惑。谢谢啦!
级别: 侠客
UID: 26382
精华: 0
发帖: 51
金钱: 255 两
威望: 51 点
综合积分: 102 分
注册时间: 2010-08-07
最后登录: 2014-06-13
1楼  发表于: 2013-01-12 22:10
呵呵,其实所谓的启动代码,其实是一段初始化代码,主要是初始化ARM的一些寄存器,初始化一下DRAM(能让后面的程序在DRAM里面运行),然后初始化一下堆栈(能运行C程序)。完成了上面的任务就行,复杂不复杂,完全可以看自己