微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM裸机开发bootloader核心初始化

ARM裸机开发bootloader核心初始化

时间:11-19 来源:互联网 点击:
一、异常向量表

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:nop	
gboot.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、什么

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top