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

来源:互联网 发布:mac os x不支持二进制 编辑:程序博客网 时间:2024/05/24 06:35

关于异常,在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 reset0x00000004: ldr  pc, _undefined_instruction0x00000008: ldr pc, _software_interrupt0x00000008: ldr pc, _software_interrupt0x0000000c: ldr pc, _prefetch_abort0x00000010: ldr pc, _data_abort0x00000014: ldr pc, _not_used0x00000018: ldr pc, _irq0x0000001c: 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:  @处理未定义指令异常        nopsoftware_interrupt:     @软中断        nopprefetch_abort:         @预取指令异常        nopdata_abort:             @数据访问异常        nopnot_used:               @空位        nopirq:                    @中断        nopfiq:                    @快速中断        nopreset:                  @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: cleanclean:    rm *.o *.elf *.bin

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

0 0
原创粉丝点击