发表于:2010/9/11 10:56:21
#0楼
本文转引自 飞凌嵌入式FL2440技术交流版 www.witech.com.cn
感谢作者:jsacer2008的无私奉献:D
首先申明本人学习ARM不过数月,根基尚浅。以下分析如有谬误,还请大家之争。本着探讨和共同进步的目的,我把我花了几个星期看完的
bootloader并做得分析贴出。首先,bootloader中最重要的就是2440init.s引导代码,现将其贴出,整个文档太大,附件中没法上传,需要的
朋友可以去FL群空间里下载
;=========================================
; NAME: 2440INIT.S
; DESC: C start up codes
; Configure memory, ISR ,stacks
; Initialize C-variables
; HISTORY:
; 2002.02.25:kwtark: ver 0.0
; 2002.03.20:purnnamu: Add some functions for testing STOP,Sleep mode
; 2003.03.14onGo: Modified for 2440.
;2010.09.02:jinzhenjun analysed
;=========================================
GET option.inc
GET memcfg.inc
GET 2440addr.inc
BIT_SELFREFRESH EQU (1<<22)
re-defined constants
;系统的工作模式设定,宏定义
;对应的是各工作模式在CPSR中的位
; 7 6 5 4
3 2 1 0
; I F T M4 M3 M2 M1
M0
;USERMODE 0 0 0 1 0 0 0
0
;FIQMODE 0 0 0 1 0 0 0
1
;IRQMODE 0 0 0 1 0 0 1
0
;SVCMODE 0 0 0 1 0 0 1
1
;ABORTMODE 0 0 0 1 0 1 1
1
;UNDEFMODE 0 0 0 1 1 0 1
1
;MODEMASK 0 0 0 1 1 1 1
1
;NOINT 1 1 0 0 0 0
0 0
USERMODE EQU 0x10
FIQMODE EQU 0x11
IRQMODE EQU 0x12
SVCMODE EQU 0x13
ABORTMODE EQU 0x17
UNDEFMODE EQU 0x1b
MODEMASK EQU 0x1f
NOINT EQU 0xc0
;The location of stacks
;各种工作模式的堆栈首地址定义
;_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 ~
;=============================================================================================;
; arm处理器有两种工作状态 1.arm:32位 这种工作状态下执行字对准的arm指令 2.Thumb:16位这种工作状 ;
; 态执行半字对准的Thumb指令因为处理器分为16位 32位两种工作状态 程序的编译器也是分16位和32两种 ;
; 编译方式 所以下面的程序用于根据处理器工作状态确定编译器编译方式code16伪指令指示汇编编译器后 ;
; 面的指令为16位的thumb指令code32伪指令指示汇编编译器后面的指令为32位的arm指令这段是为了统一 ;
; 目前的处理器工作状态和软件编译方式(16位编译环境使用tasm.exe编译)
;
;=============================================================================================;
;Check if tasm.exe(armasm -16 ...@ADS 1.0) is used.
GBLL THUMBCODE
;定义一个全局变量
[ {CONFIG} = 16
;if config==16 这里表示你的目前处于领先地16
位编译方式
THUMBCODE SETL {TRUE}
;设置THUMBCODE 为 true表示告诉系统当前想用thumb,但实际启动时不行,
只能启动后再跳
CODE32
;启动时强制使用32位编译模式
|
;
[ | ]表示if else endif
THUMBCODE SETL {FALSE}
;如果系统要求是ARM指令,则直接设置THUMBCODE 为 false 说明当前的是32
位编译模式
]
MACRO
;宏定义
MOV_PC_LR
;程序跳转,当CODE16时编译
器切换成Tumb模式
[ THUMBCODE
bx lr
|
mov pc,lr
]
MEND
MACRO
MOVEQ_PC_LR
;条件相等则程序跳转,当CODE16时
编译器切换成Tumb模式
[ THUMBCODE
bxeq lr
;相等Z=1,则跳转
|
moveq pc,lr
]
MEND
;===============================================================================================;
感谢作者:jsacer2008的无私奉献:D
首先申明本人学习ARM不过数月,根基尚浅。以下分析如有谬误,还请大家之争。本着探讨和共同进步的目的,我把我花了几个星期看完的
bootloader并做得分析贴出。首先,bootloader中最重要的就是2440init.s引导代码,现将其贴出,整个文档太大,附件中没法上传,需要的
朋友可以去FL群空间里下载
;=========================================
; NAME: 2440INIT.S
; DESC: C start up codes
; Configure memory, ISR ,stacks
; Initialize C-variables
; HISTORY:
; 2002.02.25:kwtark: ver 0.0
; 2002.03.20:purnnamu: Add some functions for testing STOP,Sleep mode
; 2003.03.14onGo: Modified for 2440.
;2010.09.02:jinzhenjun analysed
;=========================================
GET option.inc
GET memcfg.inc
GET 2440addr.inc
BIT_SELFREFRESH EQU (1<<22)
re-defined constants
;系统的工作模式设定,宏定义
;对应的是各工作模式在CPSR中的位
; 7 6 5 4
3 2 1 0
; I F T M4 M3 M2 M1
M0
;USERMODE 0 0 0 1 0 0 0
0
;FIQMODE 0 0 0 1 0 0 0
1
;IRQMODE 0 0 0 1 0 0 1
0
;SVCMODE 0 0 0 1 0 0 1
1
;ABORTMODE 0 0 0 1 0 1 1
1
;UNDEFMODE 0 0 0 1 1 0 1
1
;MODEMASK 0 0 0 1 1 1 1
1
;NOINT 1 1 0 0 0 0
0 0
USERMODE EQU 0x10
FIQMODE EQU 0x11
IRQMODE EQU 0x12
SVCMODE EQU 0x13
ABORTMODE EQU 0x17
UNDEFMODE EQU 0x1b
MODEMASK EQU 0x1f
NOINT EQU 0xc0
;The location of stacks
;各种工作模式的堆栈首地址定义
;_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 ~
;=============================================================================================;
; arm处理器有两种工作状态 1.arm:32位 这种工作状态下执行字对准的arm指令 2.Thumb:16位这种工作状 ;
; 态执行半字对准的Thumb指令因为处理器分为16位 32位两种工作状态 程序的编译器也是分16位和32两种 ;
; 编译方式 所以下面的程序用于根据处理器工作状态确定编译器编译方式code16伪指令指示汇编编译器后 ;
; 面的指令为16位的thumb指令code32伪指令指示汇编编译器后面的指令为32位的arm指令这段是为了统一 ;
; 目前的处理器工作状态和软件编译方式(16位编译环境使用tasm.exe编译)
;
;=============================================================================================;
;Check if tasm.exe(armasm -16 ...@ADS 1.0) is used.
GBLL THUMBCODE
;定义一个全局变量
[ {CONFIG} = 16
;if config==16 这里表示你的目前处于领先地16
位编译方式
THUMBCODE SETL {TRUE}
;设置THUMBCODE 为 true表示告诉系统当前想用thumb,但实际启动时不行,
只能启动后再跳
CODE32
;启动时强制使用32位编译模式
|
;
[ | ]表示if else endif
THUMBCODE SETL {FALSE}
;如果系统要求是ARM指令,则直接设置THUMBCODE 为 false 说明当前的是32
位编译模式
]
MACRO
;宏定义
MOV_PC_LR
;程序跳转,当CODE16时编译
器切换成Tumb模式
[ THUMBCODE
bx lr
|
mov pc,lr
]
MEND
MACRO
MOVEQ_PC_LR
;条件相等则程序跳转,当CODE16时
编译器切换成Tumb模式
[ THUMBCODE
bxeq lr
;相等Z=1,则跳转
|
moveq pc,lr
]
MEND
;===============================================================================================;