嵌入式学习-uboot-lesson4.1-异常向量表

关于异常,在ARM Architecture Reference Manual.pdf中,描述如下
嵌入式学习-uboot-lesson4.1-异常向量表_第1张图片
其大意是:因为内部或者外部的一些事件,导致处理器停下正在处理的工作,转而去处理这些发生的事件。(也就是中断)

异常共7种:
嵌入式学习-uboot-lesson4.1-异常向量表_第2张图片

当一种异常发生的时候,ARM处理器会跳转到对应该异常的固定地址即上图的Normal address或者High vector address 处去执行异常处理程序,而这个固定的地址,就称之为异常向量。

注意:具体是Normal address还是High vector address 是和CP15协处理器有关,默认是Normal address,当配置为高位时,跳转到High vector address。

所谓的异常向量表,是指由7个异常向量及其处理函数跳转关系组成的表:

0x00000000: b reset
0x00000004: ldr pc, _undefined_instruction
0x00000008: ldr pc, _software_interrupt
0x00000008: ldr pc, _software_interrupt
0x0000000c: ldr pc, _prefetch_abort
0x00000010: ldr pc, _data_abort
0x00000014: ldr pc, _not_used
0x00000018: ldr pc, _irq
0x0000001c: ldr pc, _fiq

注意:0x00000014 这个地址没有使用

下面贴出代码,主要有三个 start.S gboot.lds Makefile
start.S

@****************************
@name: start.S
@by  : stone
@time: 2016.6.23
@function: 异常向量表
@****************************

.text
.global _start  @将_start声明为全局变量
_start:
        b   reset                       
        ldr pc, _undefined_instruction  
        ldr pc, _software_interrupt     
        ldr pc, _prefetch_abort         
        ldr pc, _data_abort             
        ldr pc, _not_used               
        ldr pc, _irq                    
        ldr pc, _fiq

_undefined_instruction: .word undefined_instruction
_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_instruction:  @处理未定义指令异常
        nop

software_interrupt:     @软中断
        nop

prefetch_abort:         @预取指令异常
        nop

data_abort:             @数据访问异常
        nop

not_used:               @空位
        nop

irq:                    @中断
        nop

fiq:                    @快速中断
        nop

reset:                  @reset
        nop

gboot.lds

/*********************** *name : gboot.lds *by : stone *time : 2016/06/23 *function : 链接器脚本 ***********************/
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS {
    . = 0x50008000;   /*6410的内存起始地址*/

    . = ALIGN(4);
    .text :         /*代码段*/
    {
    start.o (.text)
    *(.text)
    }

    . = ALIGN(4);
    .data :          /*数据段*/
    {
    *(.data)
    }

    . = ALIGN(4);
    bss_start = .;
    .bss :           /*bss段*/
    {
    *(.bss) 
    }
    bss_end = .;
}

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 $^

%.o : %.c
    arm-linux-gcc -g -c $^

.PHONY: clean
clean:
    rm *.o *.elf *.bin

菜鸟一枚,如有错误,多多指教。。。

你可能感兴趣的:(ARM,异常向量表)