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

关于异常,在ARM Architecture Reference Manual.pdf中,描述如下
这里写图片描述
其大意是:因为内部或者外部的一些事件,导致处理器停下正在处理的工作,转而去处理这些发生的事件。(也就是中断)

异常共7种:
这里写图片描述

当一种异常发生的时候,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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值