44binit.s
引导程序注解
GET option.s ;相当于c语言中的#include "option.s"
GET memcfg.s
GET memcfg.s
;Interrupt Control
;声明一些符号常量,这些符号常量和地址相应寄存器的地址对应
INTPND EQU 0x01e00004 ;指示中断请求状态寄存器,每一位代表一种中断请求,具体表示哪一种中断请参考44b0 spec
INTMOD EQU 0x01e00008 ;中断模式寄存器,有两种中断模式对应位为1代表FIQ mode, 0代表IRQ mode
INTMSK EQU 0x01e0000c ;确定哪个中断源被屏蔽,屏蔽的中断源将不被服务
I_ISPR EQU 0x01e00020 ;中断服务挂起寄存器
I_CMST EQU 0x01e0001c ;当前主寄存器IRQ优先级
;Watchdog timer
WTCON EQU 0x01d30000 ; 看门狗定时器控制寄存器
;声明一些符号常量,这些符号常量和地址相应寄存器的地址对应
INTPND EQU 0x01e00004 ;指示中断请求状态寄存器,每一位代表一种中断请求,具体表示哪一种中断请参考44b0 spec
INTMOD EQU 0x01e00008 ;中断模式寄存器,有两种中断模式对应位为1代表FIQ mode, 0代表IRQ mode
INTMSK EQU 0x01e0000c ;确定哪个中断源被屏蔽,屏蔽的中断源将不被服务
I_ISPR EQU 0x01e00020 ;中断服务挂起寄存器
I_CMST EQU 0x01e0001c ;当前主寄存器IRQ优先级
;Watchdog timer
WTCON EQU 0x01d30000 ; 看门狗定时器控制寄存器
;Clock Controller
PLLCON EQU 0x01d80000 ; pll 控制寄存器
CLKCON EQU 0x01d80004 ; 时钟控制寄存器
LOCKTIME EQU 0x01d8000c ; 锁定时间计数值寄存器
;Memory Controller
REFRESH EQU 0x01c80024 ; Dram/sdram 刷新控制寄存器
; 下面是对 arm 处理器模式寄存器对应值的常数定义, arm 处理器中有一个 CPSR 程序状态
PLLCON EQU 0x01d80000 ; pll 控制寄存器
CLKCON EQU 0x01d80004 ; 时钟控制寄存器
LOCKTIME EQU 0x01d8000c ; 锁定时间计数值寄存器
;Memory Controller
REFRESH EQU 0x01c80024 ; Dram/sdram 刷新控制寄存器
; 下面是对 arm 处理器模式寄存器对应值的常数定义, arm 处理器中有一个 CPSR 程序状态
寄存器,它的后五位决定目前的处理器模式
;Pre-defined constants
USERMODE EQU 0x10 ; 0b10000 用户模式
FIQMODE EQU 0x11 ; 0b10001 FIQ 模式
IRQMODE EQU 0x12 ; 0b10010 IRQ 模式
SVCMODE EQU 0x13 ; 0b10011 管理模式
ABORTMODE EQU 0x17 ; 0b10111 中止模式
;Pre-defined constants
USERMODE EQU 0x10 ; 0b10000 用户模式
FIQMODE EQU 0x11 ; 0b10001 FIQ 模式
IRQMODE EQU 0x12 ; 0b10010 IRQ 模式
SVCMODE EQU 0x13 ; 0b10011 管理模式
ABORTMODE EQU 0x17 ; 0b10111 中止模式
UNDEFMODE EQU 0x1b
; 0b11011
未定义
MODEMASK EQU 0x1f ; 0b11111 系统模式
NOINT EQU 0xc0 ;
MODEMASK EQU 0x1f ; 0b11111 系统模式
NOINT EQU 0xc0 ;
;check if tasm.exe is used.
;arm 处理器有两种工作状态
;arm 处理器有两种工作状态
1.arm
:
32
位,
这种工作状态下执行字对准的
arm
指令
2.Thumb:16
位,这种工作状态执行半字对准的
Thumb
指令
; 因为处理器分为 16 位 32 位两种工作状态,程序的编译器也是分 16 位和 32 两种编译方式, 所以下面的程序用于根据处理器工作状态确定编译器编译方式
;code16 伪指令指示汇编编译器后面的指令为 16 位的 thumb 指令
;code32 伪指令指示汇编编译器后面的指令为 32 位的 arm 指令
; 这段是为了统一目前的处理器工作状态和软件编译方式( 16 位编译环境使用 tasm.exe 编译)
GBLL THUMBCODE ; 设置 一个全局逻辑变量
[ {CONFIG} = 16 ; if config==16 这里表示你的目前处于领先地 16 位编译方式
THUMBCODE SETL {TRUE} ; 设置 THUMBCODE 为 true
CODE32 ; 转入 32 位编译模式
| ;else
THUMBCODE SETL {FALSE} ; 设 置 THUMBCODE
; 因为处理器分为 16 位 32 位两种工作状态,程序的编译器也是分 16 位和 32 两种编译方式, 所以下面的程序用于根据处理器工作状态确定编译器编译方式
;code16 伪指令指示汇编编译器后面的指令为 16 位的 thumb 指令
;code32 伪指令指示汇编编译器后面的指令为 32 位的 arm 指令
; 这段是为了统一目前的处理器工作状态和软件编译方式( 16 位编译环境使用 tasm.exe 编译)
GBLL THUMBCODE ; 设置 一个全局逻辑变量
[ {CONFIG} = 16 ; if config==16 这里表示你的目前处于领先地 16 位编译方式
THUMBCODE SETL {TRUE} ; 设置 THUMBCODE 为 true
CODE32 ; 转入 32 位编译模式
| ;else
THUMBCODE SETL {FALSE} ; 设 置 THUMBCODE