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

发布者:美丽的1号最新更新时间:2024-10-30 来源: cnblogs关键字:核心初始化  异常向量表  ARM处理器 手机看文章 扫描二维码
随时随地手机看文章

一、异常向量表:

包含: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工程建立完成了。


关键字:核心初始化  异常向量表  ARM处理器 引用地址:20.核心初始化之异常向量表

上一篇:21.核心初始化之svc模式
下一篇:19.Bootloader框架设计

推荐阅读最新更新时间:2026-03-25 06:11

21.核心初始化之svc模式
要设置系统工作svc特权模式,从前面的学习知道这需要设置CPSR程序状态寄存器。 在ARM Architecture Reference Manual.pdf文档中,2.Programmers' Model的2.5.Program status register。 可以看到CPSR的最后五位:M ,就是来设置系统工作的系统模式。 接下来就是把CPSR的最后五位设置为0b10011,就是完成了设置系统的SVC模式。 实现的思路是: 取得这五位 清零,使用bic位清零指令。 置第0,1,4位为1,即可,使用orr位或指令。 要取得CPSR的后五位,由于是操作CPSR/SPSR,不能像操作一般的寄存器一样,直接操
[单片机]
21.<font color='red'>核心</font><font color='red'>初始化</font>之svc模式
Part5核心初始化_lesson1---异常量表
1.1异常 异常向量: 异常向量表: 代码的编写 start.S文件 gboot.lds链接器脚本文件 makefile工程文件:
[单片机]
Part5<font color='red'>核心</font><font color='red'>初始化</font>_lesson1---<font color='red'>异常</font>向<font color='red'>量表</font>
Part5核心初始化_lesson4---关闭中断
1、关闭cpsr寄存器里面的I(中断)和F(快速中断)位; 2、设置中断屏蔽寄存器。 针对2440: 这是中断处理过程,当有中断源(没有子中断源)来的时候,它会把这个中断记录在SRCPND里面;它还要经过MASK屏蔽寄存器,如果我们对对应位屏蔽了,那么它就无法进入到IRQ这里来处理。对于有子中断源的同理。 其代码: 针对6410: 打开S3C6410X文件,进入到Vectored Interrupt Controller这个章节, 6410和210采用的是向量中断的方式, 在6410要去屏蔽一个寄存器应该用那个寄存器呢?在6410里面中断源被分为了两组,第0组,VIC0和第1组,VIC1; 往这两个寄存器里面写入全1,
[单片机]
Part5<font color='red'>核心</font><font color='red'>初始化</font>_lesson4---关闭中断
S3C6410核心初始化
一:异常向量表 异常定义:因为内部或者外部一些事件,导致处理器停下正在处理的工作,转而去处理这些发生的事件。当一种异常发生的时候,ARM处理器会跳转到对应该异常的固定地址去执行异常处理程序,而这个固定的地址,就称之为异常向量。以下为七个异常向量及处理函数跳转关系组成的表。 在Data Abort和IRQ之间有一段地址没有用上,在初始化的时候需要补上一段_not_used ,不然的话会报错,在发生异常的时候,程序会跳转到undefined_instruction: nop这段去执行,由于现在还不需要操作这些异常向量,所以在后面只加上nop。具体以后还会进一步学到 .text .global _start _st
[单片机]
S3C6410<font color='red'>核心</font><font color='red'>初始化</font>
基于S3C6410的ARM11学习(七) 核心初始化之关闭MMU和CACHE
在关闭了所有中断后,就要关闭MMU和CACHE了。因为这个时候,还在初始化环境,这两个东西是用不到的。所以就需要把他们都关闭,免得影响我们的初始化。 MMU是Memory Management Unit的缩写,中文名是存储器管理单元。主要是两个功能: 1、虚拟地址转换为物理地址 2、实现内存的保护 至于具体的MMU的一些知识,等后面用到了在说明了。目前,只需要将MMU给关掉即可。 这个时候,我们需要查看S3C6410的核ARM1176JZFS手册。在这里,我们要接触到一个系统控制处理器,CP15。也叫做协处理器。 手册中说明了,CP15系统控制处理器的作用,主要是6个: 1、整个系统的控制和配置 2、CACHE的
[单片机]
基于S3C6410的ARM11学习(七) <font color='red'>核心</font><font color='red'>初始化</font>之关闭MMU和CACHE
基于S3C6410的ARM11学习(八) 核心初始化之设置外设基地址
下面就是核心初始化的最后一个了。外设基地址初始化。这个操作是告诉CPU外设的基地址是多少。 之前,对这个很疑惑,外设的基地址对于芯片来说,不是已经固定了,还要告诉他基地址是多少干嘛了。STM32就不用这一步操作。这个时候,就要去研究这两种芯片的内核了。S3C6410用的是ARM11的核,而STM32用的是CORTEX-M3的内核。 对于cortex-m3内核,外设的地址就已经是固定了,从0x40000000开始,大小是0.5G。所以不管你是什么芯片,只要你使用了cortex-m3内核,你的外设的基地址就变不了,变的是外设地址对应的外设不一样。所以,就没有必要告诉CPU外设的基地址了,直接操作这些地址即可。CPU会自
[单片机]
基于S3C6410的ARM11学习(八) <font color='red'>核心</font><font color='red'>初始化</font>之设置外设基地址
基于S3C6410的ARM11学习(七) 核心初始化之关闭MMU和CACHE
在关闭了所有中断后,就要关闭MMU和CACHE了。因为这个时候,还在初始化环境,这两个东西是用不到的。所以就需要把他们都关闭,免得影响我们的初始化。 MMU是Memory Management Unit的缩写,中文名是 存储器 管理单元。主要是两个功能: 1、虚拟地址转换为物理地址 2、实现内存的保护 至于具体的MMU的一些知识,等后面用到了在说明了。目前,只需要将MMU给关掉即可。 这个时候,我们需要查看S3C6410的核ARM1176JZFS手册。在这里,我们要接触到一个系统控制处理器,CP15。也叫做协处理器。 手册中说明了,CP15系统控制处理器的作用,主要是6个: 1、整个系统的控制
[单片机]
基于S3C6410的ARM11学习(七) <font color='red'>核心</font><font color='red'>初始化</font>之关闭MMU和CACHE
基于S3C6410的ARM11学习(三) 核心初始化之设置中断向量表
前面将流程搞清楚后,下面就开始进行按照顺序来编写程序了。 第一步就是进行中断向量表的设置。在ARM11中,中断向量表叫做异常向量表。 ARM11共有10种异常,这个在ARM11的datasheet中有。 这里说明一下: 异常 说明 详细说明 Reset 复位异常 当系统刚上电,或者按下复位键时候,触发这个异常,这个时候,程序跳转到这个地址处执行程序 undefined_instruction 未定义指令异常 当程序执行发现有一条指令是未定义的指令,会触发这个异常,这个时候,程序跳转到这个地址处执行程序 software_interrupt 软中断异
[单片机]
基于S3C6410的ARM11学习(三) <font color='red'>核心</font><font color='red'>初始化</font>之设置中断向<font color='red'>量表</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved