u-boot分析(四)---设置异常向量表|设置SVC模式

u-boot分析(四)

通过前三篇的分析,我们对u-boot已经有了整体的认识和掌握,但是我们仍然对于其部分硬件是如何初始化的不太清楚,所以接下来几篇博文我将会对我们在http://www.cnblogs.com/wrjvszq/archive/2015/01/10/4215627.html一文中总结出的u-boot的工作流程中的重要环节,结合文档加以分析。

今天我们会用到的文档:

1.        ARM Architecture Reference Manual:http://download.csdn.net/detail/wrjvszq/8354473

今天我们将会分析以下内容:

1.       设置中断向量表

2.      设置CPU为SVC模式

设置异常向量表

我们知道arm上电后u-boot干的第一件事就是设置异常向量表,那么什么是异常?异常又有什么类型呢?等等一大堆问题,下面我们一一解决。

1.       异常

异常其实是中断的一种,我们的中断按中断事件来源进行分类,主要有两类:

1)        中断:由CPU以外的事件引起的中断,如I/O中断、时钟中断、控制台中断等。

2)      异常:来自CPU的内部事件或程序执行中的事件引起的过程。如由于CPU本身故障、程序故障和请求系统服务的指令引起的中断等。

2.       异常的类型

根据《ARM Architecture Reference Manual》手册中的2.6节我们找到了如下表格,说明我们的arm处理器支持的异常有七种

我们的arm处理器有两种入口地址,默认情况下我们选择Normal address,只有当设置了协处理器CP15的相关寄存器以后,才会启用High vector address。

特别提醒:Data Abort和IRQ这两种异常的入口地址一个为0x00000010一个为0x00000018中间差了4个字节,在arm指令解析一节中我们提到arm的一条指令为4个字节刚好差了一条指令,所以我们看到u-boot这样设置异常向量表。

1 _start:
2     b    reset                            //0x00000000复位异常
3     ldr    pc, _undefined_instruction       //0x00000004未定义指令异常
4     ldr    pc, _software_interrupt          //0x00000008软中断异常
5     ldr    pc, _prefetch_abort              //0x0000000c预取异常
6     ldr    pc, _data_abort                  //0x00000010数据异常
7     ldr    pc, _not_used//中间多差的一条指令。0x00000014
8     ldr    pc, _irq                         //0x00000018外部中断异常
9     ldr    pc, _fiq                         //0x0000001c快速中断异常

3.       异常向量:

当异常发生的时候,由硬件机制处理器自动的跳到一个固定地址去执行相关异常处理程序,而这个固定地址就是所谓的异常向量。

设置CPUSVC模式

1.       U-boot工作的模式:

由于我们的u-boot需要执行更多的指令,访问更多的寄存器对芯片进行初始化设置,所以要工作在SVC模式。

注:在http://www.cnblogs.com/wrjvszq/p/4199682.html 一文介绍过arm处理器的工作模式

2.       如何设置CPU工作在SVC模式

同样在http://www.cnblogs.com/wrjvszq/p/4199682.html 一文中我们介绍过通过CPSR寄存器设置处理器的工作模式,其实就是设置CPSR中的M[0-4]为0b10011这也就很容易明白u-boot为什么这么设置了。

1 reset:
2     /*
3      * set the cpu to SVC32 mode
4      */
5     mrs    r0, cpsr        //导入CPSR寄存器的值到R0
6     bic    r0, r0, #0x1f//0b1 1111对M[0-4]清零
7     orr    r0, r0, #0xd3//0b1 0011对M[0-4]置1
8         msr     cpsr,r0//将R0写入CPSR中

今天有点不舒服,所以就到此为止了,明天继续分析。

内容有点少,大家谅解!!!

时间: 2024-08-07 19:19:43

u-boot分析(四)---设置异常向量表|设置SVC模式的相关文章

[国嵌笔记][032][异常向量表]

异常定义: 因为内部或外部的一些事件,导致处理器停下正在处理的工作,转而去处理这些发生的事件 异常类型: 1.reset 0x00000000 2.undefine instructions 0x00000004 3.software interrupt(swi) 0x00000008 4.prefetch bort(instruction fetch memory abort)   0x0000000C 5.data abort(data access memory abort) 0x0000

我的RTOS 之一 --S5PV210 异常向量表基址和软中断测试

1.异常向量表基址 s5pv210 默认指定了异常向量基址0xD003_4700, 当异常比如中断触发时,会自动跳转到基址查找异常处理函数s5pv210 默认指定了异常向量基址0xD003_4700, 当异常比如中断触发时,会自动跳转到基址查找异常处理函数 通过代码可以这样实现,通过代码可以这样实现, #define _Exception_Vector 0xD0037400 #define pExceptionRESET ( *((volatile unsigned long *)(_Excep

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

20.核心初始化之异常向量表 一.异常向量表: 包含:1.异常定义 ???? 2.异常类型 ???? 3.异常入口 ???? 4.向量表 首先异常定义,在ARM Architecture Reference Manual.pdf文档中,2.Programmers' Model的2.6.Exceptions异常: 异常:因为内部或外部的一些事件,导致处理器停下来正在处理的工作,转而去处理这些发生的事件. 2.异常类型 当一种异常发生的时候,ARM处理器会跳转到对应该异常的固定地址去执行异常处理程序

5.1异常向量表

异常:因为内部或者外部的一些事件,导致处理器停下正在处理的工作,转而去处理发生的事件 异常向量:7个异常向量及异常向量处理函数跳转关系,组合在一起即为异常向量表 Reset 复位异常 Undefined interrupt 未定义指令异常 Software interrupt软中断 Prefetch Abort预取指令异常 Data Abort 数据异常 Not used 没有使用 IRQ 中断异常 FIQ 快速中断异常

异常向量表设计

在ARM Architecture Reference Manual-A2.6章节给了明确的定义 异常:因为内部或者外部的一些事件,导致处理器停下正在处理的工作,转而去处理这些发生的事件 异常向量:当一种异常发生的时候,ARM处理器会跳转,到对应该异常的固定地址去执行异常处理程序,而这个固定的地址,就称异常向量 起始文件start.c .text .global _start _start: b reset ldr pc, _undefined_instruction ldr pc, _soft

u-boot1.1.6启动过程分析-异常向量表

前言 根据u-boot1.1.6的编译过程可以得知,u-boot启动执行的第一个代码是cpu/arm920t/start.S,下面就从这个文档开始吧. .globl _start_start: b reset ldr pc, _undefined_instruction ldr pc, _software_interrupt /* 0x00000008软中断异常 */ ldr pc, _prefetch_abort /* 0x0000000c预取异常 */ ldr pc, _data_abort

6、异常向量表的学习---设置SVC模式

这是手册的资料,我们看到,要设置svc模式,就是要把我们的cpsr的后五位设置为0b10011即可.Cpsr的结构: 接下来,我们就来把cpsr的后五位设置为0b10011. 设置的思路: 首先把这五位清零(bic指令),使用orr往这五位写入0b10011.当然,这些操作的实现必须借助mrs和msr两个指令来完成(cpsr和spsr不能直接访问). 操作如下: 看运行的结果,设置成功. ? 看门狗实现 看门狗的结构图: 6410的看门狗的资料: 我们通过上面的看门狗的控制寄存器的设置就可以关闭

ARM基础:MMU 异常向量表 重映射

/******************************************************************************************************************参考:说明:在学习裸机中断时重新遇到这个几个词,这次就要搞明白了. *****************************************************************************************************

(4.3)uboot详解——异常和异常向量

(4.3)uboot详解--异常和异常向量 中断是一个较难掌握知识,因为它是一个过程,而不是一个结果,其中的步骤都建立在理论的层面上,需要理解.比如按下按键1会使led1亮,这个"起因-结果"的操作我想小孩子也能掌握,因为它是一个现象,但是要掌握"起因-过程-结果"却需要花一些功夫,因为这个过程需要理解.如果你认真的了解了前面两节的内容,那么现在就该到了实现"过程"的时候了. 前面两节分析了外部中断和内部中断相关的内容,这篇文章将对处理器的异常情