1.1 异常-Exceptions
异常:因为内部或者外部的一些事件,导致处理器停下正在处理的工作,转而去处理这些发生的事件。
<>
1.2 异常类型
ARM处理器支持7种类型的异常
1.3 异常向量
当一种异常发生的时候,
ARM处理器会跳转到
对应该异常的固定地址去执行异常处理程序,而
这个固定的地址,就称之为
异常向量。
Reset (重启,休眠->工作)
Undefined instructions (自己定义的中断)
Software instructions (软中断SWI)
Prefetch Abort (instruction fetch memory abort 预取指令中断)
Data Abort (data access memory abort 数据访问中断)
IRQ (interrupt 中断)
FIQ (fast interrupt 快速中断)
CP15如果配置为高位模式,使用High Vector address
2.代码编写
start.S文件编写
-
.text
-
.global _start
-
_start:
-
b reset
-
ldr pc, _undefined_interrupt
-
ldr pc, _software_interrupt
-
ldr pc, _prefetch_abort
-
ldr pc, _data_abort
-
ldr pc, _not_used 这里因为手册里irq从0x00000018开始,而没从0x00000014开始。所以汇编中要留个空
-
ldr pc, _irq
-
ldr pc, _fiq
-
-
_undefined_interrupt: .word undefined_interrupt uboot中的写法,如果用ldr pc, = undefined_interrupt。其实也可以。
-
_software_interrupt: .word software_interrupt
-
_prefetch_abort: .word prefetch_abort
-
_data_abort: .word data_abort
-
_not_used: .word not_used
-
_irq: .word irq
-
_fiq: .word fiq
-
-
undefined_interrupt:
-
nop
-
software_interrupt:
-
nop
-
prefetch_abort:
-
nop
-
data_abort:
-
nop
-
not_used:
-
nop
-
irq:
-
nop
-
fiq:
-
nop
-
reset:
-
nop
gboot.lds编写
-
OUTPUT_ARCH(arm) 这个标明了输出的架构格式
-
ENTRY(_start) 设置了CPU从哪个地址开始
-
-
SECTIONS {
-
. = 0x30008000; 设置文件的起始地址
-
-
. = ALIGN(4); 4字节对齐
-
.text :
-
{
-
start.o(.text) 代码段的起始文件,最先运行这个
-
*(.text)
-
}
-
-
. = ALIGN(4);
-
.data :
-
{
-
*(.data)
-
}
-
-
. = ALIGN(4);
-
bss_start = .; 记录bss段的起始地址
-
.bss :
-
{
-
*(.bss)
-
}
-
bss_end = .; 记录bss段的结束地址
-
}
Makefile编写
-
all : start.o
-
arm-linux-ld -Tgboot.lds -o gboot.elf $^
-
arm-linux-objcopy -O binary gboot.elf gboot.bin
-
-
#从这里先写,可以写个通用的方式
-
%.o : %.S
-
arm-linux-gcc -g -c $^
-
#然后给c文件留个位置
-
%.o : %.c
-
arm-linux-gcc -g -c $^
阅读(1782) | 评论(0) | 转发(0) |