📄 init.s.bak
字号:
;
;建立中断向量表
;初始化存储器系统
;初始化堆栈
;初始化有特殊要求的断口,设备
;初始化用户程序执行环境;完成必要的从ROM到RAM的数据传输和内容清零
;改变处理器模式
;呼叫主应用程序
;中断向量表
;1、设置CPU各种模式的堆栈指针
;2、设置中断向量地址
;2、配置SDRAM和ROM的模式
;3、把程序COPY到SDRAM
;4、跳到SDRAM里开始运行程序
;GET option.s ;相当于c语言中的#include "option.s"
; AVT RTOS HAL for ARM7(S3C44B0X)
;
;用户程序必须在0x00010000 开始烧写
IRQ_VECTOR EQU 0x0C080000;SDRAM的真实地址???BANK6,地址0XC000000~0XC7FFFFF
INTMSK EQU 0x01e0000c;;确定哪个中断源被屏蔽 屏蔽的中断源将不被服务
INTCON EQU 0x1e00000;中断控制寄存器
;下面是对arm处理器模式寄存器对应值的常数定义,arm处理器中有一个CPSR程序状态寄存器 它的后五位M0~M4决定目前的处理器模式
;预定义常数(常量)运行模式设置
USERMODE EQU 0x10
FIQMODE EQU 0x11
IRQMODE EQU 0x12
SVCMODE EQU 0x13
ABORTMODE EQU 0x17
UNDEFMODE EQU 0x1b
MODEMASK EQU 0x1f
NOINT EQU 0xc0
;一个arm由RO,RW,ZI三个断组成 其中RO为代码段,RW是已经初始化的全局变量,ZI是未初始化的全局变量
IMPORT bspInit
IMPORT avtInit
IMPORT |Image$$ZI$$Base| ; uninitialised variables
IMPORT |Image$$ZI$$Limit| ; End of variable RAM space
; |Image$$ZI$$Base| ; ZI段起始地址
; |Image$$ZI$$Limit| ; ZI段结束地址加1
;下面为代码段
;扳子上电和复位后 程序开始从位于0x0处开始执行硬件刚刚上电复位后 程序从这里开始执行跳转到标号为ResetHandler处执行
AREA Init,CODE,READONLY;定义代码段 名称为INIT,只读
ENTRY ;程序入口,每个文件一个入口
_start
ldr r0,=INTMSK ;将 INTMSK装载到R0
; 向量中断;ldr PC,=HandlerADC 当ADC中断产生的时候系统会
;adc中断向量为 0x000000c0下面对应表中第49项位置 向量地址0x0+4*(49-1)=0x000000c0
;;1禁止所有中断 ;自动跳转到HandlerADC函数中
ldr r1,=0x07ffffff ;禁止所有中断,初始值是 0x07ffffff
str r1,[r0];将R1中的字节写到R0为地址的存储器中
;* Initialize stacks *
;;4设置堆栈指针,BBS清0
msr cpsr_cxsf, #SVCMODE|NOINT ;SVCMode;直接设置状态寄存器
;MSR写状态寄存器,CXSF为状态寄存器指定的区域,C控制域屏蔽字7:0,X扩展域屏蔽字15 :8
;S状态域屏蔽字23:16,F标志域屏蔽字31:24,
ldr sp,=init_stk;指向空间的最后(ROM)
;6.将数据段拷贝到ram中 将零初始化数据段清零 跳入C语言的main函数执行 到这步结束bootloader初步引导结束
;;
;; Zero BSS
;;
LDR r6, =|Image$$ZI$$Limit|;将ZI段结束加1地址写到R6
MOV r1, r6 ; Get pointer to ROM data
LDR r0, =|Image$$ZI$$Base|; ZI段起始地址写到R0
MOV r3, #0x0;and RAM copy
1
CMP r0, r1; Check that they are different ;(r0)-(r1),只设置标志。
STRLO r3, [r0], #4
BLO %B1
MOV r0, r6
LDR r1, =0x0C800000;SDRAM的真实地址???
B avtInit
;;
;; ffs - find first set bit, this algorithm isolates the first set
;; bit, then multiplies the number by 0x0450fbaf which leaves the top
;; 6 bits as an index into the table. This algorithm should be a win
;; over the checking each bit in turn as per the C compiled version.
;;
;; under ARMv5 there's an instruction called CLZ (count leading Zero's) that
;; could be used
;;
EXPORT ffs
ffs
;; Standard trick to isolate bottom bit in r0 or 0 if r0 = 0 on entry
RSB r1, r0, #0
ANDS r0, r0, r1
;;
;; now r0 has at most one set bit, call this X
;; if X = 0, all further instructions are skipped
;;
ADRNE r2, ffs_table
ORRNE r0, r0, r0, lsl #4 ;; r0 = X * 0x11
ORRNE r0, r0, r0, lsl #6 ;; r0 = X * 0x451
RSBNE r0, r0, r0, lsl #16 ;; r0 = X * 0x0450fbaf
;; now lookup in table indexed on top 6 bits of r0
LDRNEB r0, [ r2, r0, lsr #26 ]
MOV pc, lr
ffs_table;高6位寻址该表
;; 0 1 2 3 4 5 6 7
DCB -1, 0, 1, 12, 2, 6, -1, 13 ;; 0- 7
DCB 3, -1, 7, -1, -1, -1, -1, 14 ;; 8-15
DCB 10, 4, -1, -1, 8, -1, -1, 25 ;; 16-23
DCB -1, -1, -1, -1, -1, 21, 27, 15 ;; 24-31
DCB 31, 11, 5, -1, -1, -1, -1, -1 ;; 32-39
DCB 9, -1, -1, 24, -1, -1, 20, 26 ;; 40-47
DCB 30, -1, -1, -1, -1, 23, -1, 19 ;; 48-55
DCB 29, -1, 22, 18, 28, 17, 16, -1 ;; 56-63
;; CLZNE r0, r0
;; RSBNE r0, r0, #32
;; MOV pc, lr
;;
;; system clock interrupt server
;;
; IMPORT tm_tick
IMPORT tick_wrapper
IMPORT InterruptEnter
EXPORT TickHandler
TickHandler
LDR sp, =intstk
STMFD sp!, {r0-r3}
;;
;; Interrupt Ack
;;
MOV r0, #0x100
MOV r1, #0x1e00000
STR r0, [r1, #0x24]
;;
;; Call avt interrupt handler
;;
; LDR r3, =tm_tick
LDR r3, =tick_wrapper
B InterruptEnter
IMPORT URX0Isr
IMPORT UTX0Isr
EXPORT URX0Handler
EXPORT UTX0Handler
URX0Handler
LDR sp, =intstk
STMFD sp!, {r0-r3}
LDR r3, =URX0Isr
B InterruptEnter
UTX0Handler
LDR sp, =intstk
STMFD sp!, {r0-r3}
LDR r3, =UTX0Isr
B InterruptEnter
IMPORT EINT0Isr
EXPORT EINT0Handler
EINT0Handler
LDR sp, =intstk
STMFD sp!, {r0-r3}
LDR r3, =EINT0Isr
B InterruptEnter
IMPORT DoException
EXPORT UndefHandler
EXPORT PrefechAbortHandler
EXPORT DataAbortHandler
EXPORT SwiHandler
UndefHandler
LDR sp, =intstk
STMFD sp!, {r0-r12, lr}
MRS r0, cpsr
MSR cpsr_c, #0xD3
MOV r1, lr
MRS r2, spsr
MSR cpsr_c, r0
STMFD sp!, {r1, r2}
MOV r0, sp
MOV r1, #0
BL DoException
LDMFD sp, {r0-r12, lr}
SUBS pc, lr,#4
PrefechAbortHandler
LDR sp, =intstk
STMFD sp!, {r0-r12, lr}
MRS r0, cpsr
MSR cpsr_c, #0xD3
SUB r1, lr, #4
MRS r2, spsr
MSR cpsr_c, r0
MOV r0, sp
MOV r1, #1
BL DoException
LDMFD sp, {r0-r12, lr}
SUBS pc, lr,#4
DataAbortHandler
LDR sp, =intstk
STMFD sp!, {r0-r12, lr}
MRS r0, cpsr
MSR cpsr_c, #0xD3
SUB r1, lr, #8
MRS r2, spsr
MSR cpsr_c, r0
STMFD sp!, {r1, r2}
MOV r0, sp
MOV r1, #2
BL DoException
LDMFD sp, {r0-r12, lr}
SUBS pc, lr,#4
SwiHandler
LDR sp, =intstk
STMFD sp!, {r0-r12, lr}
MRS r0, cpsr
MSR cpsr_c, #0xD3
MOV r1, lr
MRS r2, spsr
MSR cpsr_c, r0
MOV r0, sp
MOV r1, #3
BL DoException
LDMFD sp, {r0-r12, lr}
SUBS pc, lr,#4
AREA AvtData,DATA, READWRITE
SPACE 4096
intstk
SPACE 4096
init_stk
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -