mini2440启动代码分析之第一篇(注意名字,不是bootloader)

转自:http://blog.chinaunix.net/uid-26435987-id-3073901.html

启动代码主要是在主程序运行之前初始化系统硬件及软件的运行环境,它的主要功能包括以下的几个方面:

1、建立中断向量表

2、初始化系统堆栈

3、应用程序执行环境初始化

4、跳转至主函数

第一部分

 GET option.inc           option.inc文件包含了开发板的配置信息—堆栈、时钟等

 GET memcfg.inc           ;存储控制文件

 GET 2440addr.inc         ;寄存器地址地址定义

注意:   汇编不能使用include包含头文件,所有用Get,功能:引进一个被编译过的文件

        汇编也不认识*.h 文件,所有只能用*.inc

第二部分

;EQU为程序中的常量、标号等定义一个等效的字符名称,相当于C语言中的define
;定义SDRAM工作在Refresh模式,SDRAM有两种刷新方式:autorefreshselfrefresh,前者是在其使用过程当中每隔一段时间发出刷新指令,SDRAM刷新一行,selfrefresh是在省电模式时使用。标示:REFRESH寄存器[22]bit : 0- auto refresh; 1 - self refresh
BIT_SELFREFRESH   EQU   (1<<22)   ;用于节电模式中,SDRAM自刷新标志位

第三部分(简单略过)

;系统的工作模式设定,共七种工作模式
USERMODE    EQU      0x10
FIQMODE      EQU      0x11
IRQMODE      EQU      0x12
SVCMODE      EQU      0x13
ABORTMODE   EQU      0x17
UNDEFMODE   EQU      0x1b
MODEMASK    EQU      0x1f
NOINT         EQU       0xc0

;设置6种工作模式的堆栈的起始地址

;option.inc中定义了_STACK_BASEADDRESS  EQU  0x33ff8000 
UserStack EQU (_STACK_BASEADDRESS-0x3800)   ;0x33ff4800 ~
SVCStack EQU (_STACK_BASEADDRESS-0x2800)   ;0x33ff5800 ~
UndefStack EQU (_STACK_BASEADDRESS-0x2400)  ;0x33ff5c00 ~
AbortStack EQU (_STACK_BASEADDRESS-0x2000)  ;0x33ff6000 ~
IRQStack EQU (_STACK_BASEADDRESS-0x1000)   ;0x33ff7000 ~
FIQStack EQU (_STACK_BASEADDRESS-0x0)      ;0x33ff8000 ~



第四部分:

;Check if tasm.exe(armasm -16 ...@ADS 1.0) is used.

判断是否THUMB指令

;   [ 代表IF指的是ELSE相当于ENDIF

       

GBLL    THUMBCODE ;定义一个全局的逻辑变量,变量名为THUMBCODE

       [ {CONFIG} = 16   ;如果是CONFIG}= 16表明现在处于thumb状态

THUMBCODE  SETL  {TRUE} ;该变量赋值为真,表示告诉系统当前想用Thumb,但实际启动时不行,只能从ARM启动后再跳转thumb

           CODE32  ;启动时强制使用32 ARM编译模式 

             |

THUMBCODE SETL  {FALSE}如果系统要求是ARM 指令,则直接设置THUMBCODE 

                              false 说明当前的是32 位编译模式 

        ]

             

  ;宏定义MOV_PC_LR,作用:子程序返回 

   MACRO      ;宏定义 

   MOV_PC_LR 

   [ THUMBCODE      ;目标地址是THUMB指令 

   bx lr            ;ARM模式中,要用BX指令跳转到THUMB指令,并转换模式

   |  

   mov pc,lr   ;如果目标地址是ARM指令,则直接把函数返回地址给PC

   ] 

MEND ;宏定义结束 

  ;宏定义MOVEQ_PC_LR,作用:带相等条件判断的子程序返回 。与宏定义 

  ;带条件的函数返回,与MOV_PC_LR类似  

  MACRO 

  MOVEQ_PC_LR 

  [ THUMBCODE 

bxeq lr 

    moveq pc,lr 

  ] 

MEND ;宏定义结束 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章