ARM裸机开发bootloader核心初始化
1、异常的定义
异常:因为内部或者外部的一些事件,导致处理器停下正在处理的工作,转而去处理这些发生的事情。
2、异常的类型
ARM处理器有7种Exception type分别为:Reset、Undefined instructions、Software interrupt、Prefetch Abort、Data Abort、IRQ、FIQ
2、什么是异常向量
当一种异常发生的时候,ARM处理器会跳转到对应该异常的固定地址去执行异常处理程序,而这个固定的地址,就称为异常向量。
3、异常向量表
由七个异常向量及其处理函数跳转关系组成的表为异常向量表。
下面是一个例子:
start.S
.text.global _start_start:b resetldr pc, _undefined_instructionldr pc, _software_interruptldr pc, _prefetch_abortldr pc, _data_abortldr pc, _irqldr pc, _fiq_undefined_instruction: .word undefined_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 fiqundefined_instruction:nopsoftware_interrupt:nopprefetch_abort:nopdata_abort:nopnot_used:nopirq:nopfiq:nopreset:nopgboot.lds
OUTPUT_ARCH(arm)ENTRY(_start)SECTIONS{. = 0x50008000;. = ALIGN(4);.text :{start.o(.text)*(.text)}. = ALIGN(4);.data :{*(.data)}. = ALIGN(4);bss_start = .;.bss :{*(.bss)}bss_end = .;}
Makefile
all : start.oarm-linux-ld -Tgboot.lds -o gboot.elf $^arm-linux-objcopy -O binary gboot.elf gboot.bin%.o : %.Sarm-linux-gcc -g -c %.S %.o : %.carm-linux-gcc -g -c %.c .PHONY: cleanclean:rm *.o *.elf *.bin关于异常向量表,对于2440和6410以上就结束了,不过对于210还要添加BL1头
./mkv210_image led.bin 210.bin
/home/dnw 210.bin 0x50008000
如果不加头的话,就无法正常工作。原因是210在上电后会运行厂家已经固化在SRAM中的BL0,这个时候,由BL0来调用BL1,BL1运行会产生校验码(这个校验码就在添加的头里面)并与BL0里的校验码进行比对,确认是否为要运行的BL1。成功后就运行BL1.
Header Info (check sum(user writing)、BL1 size(user writing)).
二、设置SVC模式
此时设置ARM的工作模式为SVC(supervisor),这样可以使用更多的寄存器,同时拥有很大的操作权限。具体可以参考下图
通过上图对ARM的状态寄存器的解释,我们可以得知将CPSR的后五位设置为0b10011就可以使用SVC模式。同时我们还要关闭irq和fiq。
具体实现代码:
续上start.S
reset:bl set_svcset_svc:mrs r0, cpsrbic r0, r0, #ox1forr r0, r0, #oxd3msr cpsr, r0
三、关闭看门狗
1、什么是看门狗
有些嵌入式设备要长期工作在无人看管的情况下,这个时候就需要,当发生死机时,设备可以实现自启动。而watchdog就可以完成这样一种功能。watchdog模块是一硬件设备。其作用就是当系统发生死机时,帮助系统实现自启动。
2、看门狗如何工作
看门狗模块有三部分组成,分别为时钟产生器,计时器,重启器。当开启看门狗时,计时器就开始了计时,系统必须在计时结束前对看门狗重新设置使其重新计时,简称喂狗。否则它会认为系统发生了死机,就重启系统。
3、为什么要关闭看门狗
一般情况下,bootloader的运行过程中不会发生死机,所以我们就关闭看门狗。否则我们还要不断的喂狗,而占用系统时间。
下面是6410中的watchdog的解释
代码编写:
reset:bl set_svcbl disable_watchdogset_svc:mrs r0, cpsrbic r0, r0, #0x1forr r0, r0, #0xd3msr cpsr, r0#define pWTCON 0x7E004000disable_watchdog:ldr r0, =pWTCON /*mov的操作数最多为8位*/mov r1, #0x0str r1, [r0]注:我们这里把watchdog的控制寄存器直接清零,也可以达到效果。
四、关闭中断
关闭中断要两个环节:1、CPSR中的I F位 置1,在设置SVC时我们已经做过,所以这里就不做了。2、对中断屏蔽寄存器进行设置
2440的板子需要设置INTMSK寄存器
210的板子需要设置4组寄存器VICINTENCLEAR
6410的板子需要设置2组寄存器VIC0INTENCLEAR和VIC1INTENCLEAR
下面我们以6410为例子进行介绍:
编码如下
disable_interrupt:mvn r1, #0x0ldr r0, =0x71200014str r1, [r0]ldr r0, =0x71300014str r1, [r0]
五、关闭MMU和Cache
1、前言
从ARM的存储体系,我们可以看到,位于金子塔顶端的是处理器的寄存器,后面依次为TCM和辅助存储器。显然从金子塔的底部到顶部存储器的存取速度愈来愈快,价格也越来越高,而数量却越来越少。
2、什么
ARM裸机开发bootloader核心初始 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)