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这样设置异常向量表。

 _start:
    b reset //0x00000000复位异常
ldr pc, _undefined_instruction //0x00000004未定义指令异常
ldr pc, _software_interrupt //0x00000008软中断异常
ldr pc, _prefetch_abort //0x0000000c预取异常
ldr pc, _data_abort //0x00000010数据异常
ldr pc, _not_used//中间多差的一条指令。0x00000014
ldr pc, _irq //0x00000018外部中断异常
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为什么这么设置了。

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

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

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

最新文章

  1. [译] MongoDB Java异步驱动快速指南
  2. Spring中配置和读取多个Properties文件
  3. CentOS PPTP配置FreeRADIUS+DaloRADIUS实现高级用户控制+流量控制
  4. PushKit和传统长连接方式的比较
  5. javascript权威指南笔记--javascript语言核心(二)
  6. Win7_Wifi热点
  7. poj 2955 括号匹配 区间dp
  8. GoAhead 嵌入式web
  9. linux实现自动远程备份(scp+ssh)
  10. JSP写入MySQL数据库中出现乱码问题笔记
  11. java 属性
  12. 引用:初探Sql Server 执行计划及Sql查询优化
  13. 设置input中placeholder的样式(placeholder设置字体)
  14. mac查看当前调用tcp的进程并关闭指定进程
  15. python系统性能模块笔记
  16. 分别用postman和python做post请求接口功能测试
  17. RPC笔记之初探RPC:DIY简单RPC框架
  18. linux计算文件大小
  19. python2.0_day21_bbs系统评论自动加载+文章创建
  20. 卸载oracle11g步骤图解

热门文章

  1. C++在WINdow桌面绘制文字图形
  2. [USACO06NOV]糟糕的一天Bad Hair Day BZOJ 1660 单调栈
  3. zmq导致master收不到minion的key
  4. php curl 请求api 接口
  5. Ancoda 下的python多版本共存
  6. 使用vue-router beforEach实现判断用户登录跳转路由筛选功能
  7. VC6.0开发中一些链接错误的解决方法
  8. iterable- 什么是可迭代对象
  9. KEIL的多工程多目标
  10. Elasticsearch简单运算