核心初始化---异常向量表、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
0 0
原创粉丝点击