核心初始化---异常向量表、svc模式、关闭看门狗、关闭中断、关闭mmu
来源:互联网 发布:yy淘宝互刷平台 编辑:程序博客网 时间:2024/05/22 10:41
异常向量表
异常(Exception) : 因为内部或者外部的一些事件,导致处理器停下正在处理的工作,转而去处理这些发生的事件。
ARM有 7 种异常。
异常向量:当一种异常发生的时候,ARM处理器会跳转到对应该异常的固定地址去执行异常处理程序,而这个固定的地址,就称之为异常向量。
有两组异常向量供选择,有低位地址和高位地址,可以通过cp15进行设置,但是默认情况下一般选择低位的地址。
异常向量表:由七个异常向量及其处理函数跳转关系组成的表即为异常向量表。
代码举例:
.text.global _start_start: b reset ldr pc, _undifined_instruction ldr pc, _software_interrupt ldr pc, _prefetch_abort ldr pc, _data_abort ldr pc, _not_used@此处一定要加上not—used,因为上下两个地址间隔了8个字节,不是4个字节,必须加上。 ldr pc, _irq ldr pc, _fiq@ldr不再是伪指令,而是装载指令,从标号地址处取地址值装载到pc寄存器中。标号就是地址_undifined_instruction: .word undifined_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 resetundifined_instruction: nopsoftware_interrupt: nopprefetch_abort: nopdata_abort: nopnot_used: nopirq: nopfiq: nopreset: bl set_svc bl disable_watchdog bl disable_interrupt bl disable_mmu
需要注意:对于210 开发板,需要对代码进行加头,用于计算bl1中有多少个1,否则运行不了。
svc模式
将arm设置为svc模式(supervisor),运行Bootloader和内核。
通过设置程序状态字寄存器(cpsr)来完成对svc模式的设置。
cpsr寄存器:
cpsr和spsr寄存器不能在寄存器内直接修改,只能导出到通用寄存器内,然后将修改的值导回。
设置最后5位,进行模式设置。
代码举例:
set_svc: mrs r0, cpsr bic r0, r0,#0x1f @后5位清零 orr r0, r0,#0xd3 @设置为svc模式,关闭中断,使用0x13也可以 msr cpsr, r0 mov pc, lr
关闭看门狗
在嵌入式领域,有些系统需要长期运行在无人看守的环境。在运行过程中,难免不出现系统死机的情况,这时就需要系统自身带有一种自动重启的功能。 watchdog一般是一个硬件模块,其作用就是在系统死机时,帮助系统实现自动重启。
Watchdog在硬件上实现了计时功能,启动计时后,用户(软件)必须在计时结束前重新开始计时,俗称“喂狗”,如果到超时的时候还没有重新开始计时,那么它就认为系统是死机了,就自动重启系统。
一般在学习应用时,为避免不断喂狗,选择先关闭看门狗。
watchdog原理图:
代码举例: 以6410为例
#define pWTCON 0x7e004000 @6410中的WTCON寄存器disable_watchdog: @关闭看门狗 ldr r0, =pWTCON mov r1, #0x0 str r1, [r0] @注意[]表示取寄存器的值 mov pc, lr
关闭中断
有两个地方需要设置,一个是cpsr寄存器中,上面已经设置了,另一个就是中断控制寄存器。
以6410为例,需要设置VIC0INTENCLEAR寄存器和VIC1INTENCLEAR寄存器的内容全部为1。
代码举例: 以6410为例
disable_interrupt: @关闭中断 mvn r1, #0x0 @取反 ldr r0, =0x71200014 @VIC0INTENCLEAR str r1, [r0] ldr r0, =0x71300014 @VIC1INTENCLEAR str r1, [r0] mov pc, lr
关闭 mmu 和 cache
ARM存储体系:
越往上,数量越少,价格越贵,速度越快。
Cache是一种容量小但存取速度非常快的存储器,它保存最近用到的存储器中数据的拷贝。对于程序员来说,Cache是透明的。它自动决定保存哪些数据、覆盖哪些数据。按照功能划分:
I-Cache: 指令Cache,用于存放指令。
D-Cache: 数据Cache,用于存放数据。
6410中I-Cache和D-Cache都是16KB
虚拟地址:
虚拟地址:程序中使用的地址。
物理地址:物理存储单元实际的地址
使用虚拟地址的意义:
1、可以让进程使用更多的地址空间,如果纯粹使用实际地址,则只能使用空闲的内存地址。如果使用虚拟地址,就可以指定更多的地址空间,只需要映射到实际地址就可以了。
2、可以解决冲突。不同的程序员编写的程序,可能并不知道内存的使用情况,如果采用虚拟地址,可以任意指定虚拟的地址,然后再映射到相应的实际地址中,如果纯粹使用虚拟地址,则不同程序使用了相同地址时会冲突。
mmu的工作就是将虚拟地址映射到物理地址。
ARM11及以后版本的处理器访问cache都必须经过mmu,将虚拟地址映射到实际地址。
在Bootloader的编写中,一开始核心初始化时,先关掉mmu和cache,等以后使用时再打开。
mmu和cache都是通过cp15协处理器来控制的。在ARM核手册有记录。
代码举例: 以6410为例
cache先要失效(invalidate),然后再关闭(disable)。
disable_mmu: @关闭mmu,关闭cache mcr p15,0,r0,c7,c7,0 @首先让I/D Cache失效 mrc p15,0,r0,c1,c0,0 @I Cache可以不关 bic r0, r0, #0x00000005 @关闭I/Dcache,关闭MMU mcr p15,0,r0,c1,c0,0 mov pc, lr
- 核心初始化---异常向量表、svc模式、关闭看门狗、关闭中断、关闭mmu
- 关闭中断和关闭MMU
- 系统初始化,关闭MMU、CACHE
- 关闭看门狗
- Uboot之关闭看门狗、设置主机频率、关闭中断
- 6、异常向量表的学习---设置SVC模式
- 基于S3C6410的ARM11学习(五) 核心初始化之关闭看门狗
- 基于S3C6410的ARM11学习(七) 核心初始化之关闭MMU和CACHE
- 【中断异常】中断向量表IDT的初始化
- u-boot分析(五)----I/D cache失效|关闭MMU和cache|关闭看门狗
- 关闭中断
- u-boot关闭看门狗
- 二十五.关闭看门狗
- tiny6410关闭看门狗
- 关闭看门狗-喂狗
- 二十七.关闭MMU
- 关闭mmu和cache
- uboot关闭看门狗和中断---嵌入式回归第八篇
- 无线网络学习笔记(1)
- 关于ScrollView的fillViewport属性
- MFC下对位图的旋转
- 基础最短路 九 POJ 2240
- 基础最短路 十 POJ 1511
- 核心初始化---异常向量表、svc模式、关闭看门狗、关闭中断、关闭mmu
- POJ 1661Help Jimmy(基础dp)
- Android 代码写布局
- POJ3253_Fence Repair_贪心
- Python零碎知识点
- C与C++的文件简单操作
- Windows第二次实验——C++复习(二)类和对象
- js对象的创建方式(小记)
- 您的设计模式——抽象工厂模式【Abstract Factory Pattern 】