核心初始化---异常向量表、svc模式、关闭看门狗、关闭中断、关闭mmu
2017-03-17 21:17
337 查看
异常向量表
异常(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 reset undifined_instruction: nop software_interrupt: nop prefetch_abort: nop data_abort: nop not_used: nop irq: nop fiq: nop reset: 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
相关文章推荐
- 基于S3C6410的ARM11学习(五) 核心初始化之关闭看门狗
- Part5核心初始化_lesson3---关闭看门狗
- 基于S3C6410的ARM11学习(六) 核心初始化之关闭所有中断
- Part5核心初始化_lesson1---异常向量表
- 基于S3C6410的ARM11学习(七) 核心初始化之关闭MMU和CACHE
- Part5核心初始化_lesson2---设置svc模式
- u-boot分析(四)---设置异常向量表|设置SVC模式
- Part5核心初始化_lesson4---关闭mmu
- u-boot分析(四)---设置异常向量表|设置SVC模式
- Part5核心初始化_lesson4---关闭中断
- uclinux中断和异常向量初始化--------4
- 6、异常向量表的学习---设置SVC模式
- Cortex-M3异常中断及向量表定义
- 系统初始化,关闭MMU、CACHE
- ARM 中断状态和SVC状态的堆栈切换 (异常)
- AM335X平台下的mcspi源代码详解---中断模式下的初始化、收发数据
- 【中断异常】中断向量表IDT的初始化
- 【Linux操作系统分析】中断和异常(1)——中断描述符表IDT,I/O中断处理,中断向量
- uboot初始化中,为何要设置CPU为SVC模式而不是设置为其他模式
- Cortex-M3异常中断及向量表定义