• 20.核心初始化之异常向量表


    20.核心初始化之异常向量表

    一、异常向量表:

    包含:1.异常定义

         2.异常类型

         3.异常入口

         4.向量表

    首先异常定义,在ARM Architecture Reference Manual.pdf文档中,2.Programmers' Model的2.6.Exceptions异常:

    异常:因为内部或外部的一些事件,导致处理器停下来正在处理的工作,转而去处理这些发生的事件。

    2.异常类型

    当一种异常发生的时候,ARM处理器会跳转到对应该异常的固定地址去执行异常处理程序,而这个固定的地址,就称之为异常向量,多个异常向量在一起就形成了异常向量表。

    从上面的异常向量地址可以注意到,地址0x00000014没有使用。上图的右边可以看到有两组异常向量表可以使用。一组是低地址的,一组是高地址的。可以通过CP15对应的位来配置,当没有配置CP15的时候,默认是从低地址作为异常向量表。

    3.入口:00000000;

    4.异常向量表:由七个异常向量和处理函数跳转关系组成的表就是异常向量表。

    二、代码编写(6410)

    链接器脚本:forfish.lds:

    OUTPUT_ARCH(arm)

    ENTRY(_start)

    SECTIONS {

        . = 0x50008000;

        

        . = ALIGN(4);

        .text :

        {

        start.o (.text)

        *(.text)

        }

        . = ALIGN(4);

        .data :

        {

        *(.data)

        }

        

        . = ALIGN(4);

        bss_start = .;

        .bss :

        {

        *(.bss)

        }

        bss_end = .;

    }

    汇编文件start.S完成相应的硬件操作的代码结构:

    @****************************

    @File:start.S

    @

    @FORFISH

    @****************************

    .text

    .global    _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:

            nop

    上面编写好了之后就是编写这个工程的Makefile文件了:

    Makefile:

    all: start.o

        arm-linux-ld -Tforfish.lds -o forfish.elf $^

        arm-linux-objcopy -O binary forfish.elf forfish.bin

    %.o : %.S

        arm-linux-gcc -g -c $^

    .PHONY: clean

    clean:

        rm *.o *.elf *.bin

    编写好了之后,工程的框架就建立好了,进行make进行编译:

    可以看到bin文件成功生成,说明裸机uboot工程建立完成了。

  • 相关阅读:
    stmt.executeQuery不执行解决办法
    可变参数
    深度理解JVM
    JDBC 基础入门
    Flask中Mysql数据库的常见操作
    Flask与mysql数据库字段类型的区别以及基本用法
    Flask里面session的基本操作
    Flask里面的cookie的基本操作
    Flask表单(form)的应用
    Flask网页模板的入门
  • 原文地址:https://www.cnblogs.com/FORFISH/p/5188727.html
Copyright © 2020-2023  润新知