您的位置 首页 应用

ARM裸机开发bootloader中心初始化

一、异常向量表1、异常的定义异常:因为内部或者外部的一些事件,导致处理器停下正在处理的工作,转而去处理这些发生的事情。2、异常的类型…

一、反常向量表

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和V%&&&&&%1INTENCLEAR

下面咱们以6410为比如进行介绍:

编码如下

disable_interrupt:mvn r1, #0x0ldr r0, =0x71200014str r1, [r0]ldr r0, =0x71300014str r1, [r0]

五、封闭MMU和Cache

1、前语

从ARM的存储系统,咱们能够看到,坐落金子塔顶端的是处理器的寄存器,后边依次为TCM和辅佐存储器。明显从金子塔的底部到顶部存储器的存取速度愈来愈快,价格也越来越高,而数量却越来越少。

2、什么是Cache

咱们都知道处理器的拜访速度是非常快的,而内存的速度却慢的很。这样当处理器在拜访内存时就呈现了问题。而Cache恰恰就用来处理这个问题。从物理结构上来讲,Cache坐落处理器与内存之间,cache中存储了处理器常常从内存拜访的数据与指令,也便是cache是内存的部分劳动。这时处理器往往先拜访cache,假设cache中没有想要的数据,才去内存查找。而cache的拜访速度要比内存大的多,这样就提高了整个的运转功率。

cache又分为:I-Cache和D-Cache

3、MMU

谈到MMU这个时分就要先说一下虚拟地址:作为一个程序员,咱们都知道有逻辑地址和物理地址之分,假设咱们不直接和硬件打交道,咱们底子不必去管物理地址,只要用逻辑地址就能够了。而MMU便是把逻辑地址转换为物理地址的协议。

假设咱们只运用物理地址就会呈现两个问题要处理:1、地址抵触(两段程序运用同一物理地址)。2、规模小

咱们运用了MMU就能够把逻辑地址映射到物理地址,再详细的说便是两段程序运用的是同一逻辑地址,而通过映射后,它们都被映射到不同的物理地址。还有便是地址空间变大了。详细的物理地址的分配不必程序员来管,都要MMU来分配,这样就能够更好的运用物理空间。

ARM11之间Cache坐落MMU前面接近处理器,也便是说cache运用的是虚拟地址(逻辑地址),而ARM11之后包含ARM11的MMU接近内存,这个时分运用的是物理地址。

4、为什么要封闭MMU和Cache

MMU和Cache在运用之前要进行装备,在ARM初始化的时分还没有进行装备,所以这个时分要封闭它们。还有便是防止Bootloader将linux内核下载到D-cache中,而I-cache这个时分能够不管它。

封闭MMU和Cache的过程:

1、使I-cache和D-cache失效

2、封闭I-Cache和D-Cache,封闭MMU

下面是cp15的寄存器解说:

代码如下:

disable_mmu:

mcr p15, 0, r0, c7, c7, 0

mrc p15, 0, r0, c1, c0, 0

bic r0, r0, #0x00000007

mcr p15, 0, r0, c1, c0, 0

2440、6410和210的cp15是相同的。所以这儿的代码也是相同的。

整个中心初始化的代码为:

.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:bl set_svcbl disable_watchdogbl disable_interruptbl disable_mmuset_svc:mrs r0, cpsrbic r0, r0, #0x1forr r0, r0, #0xd3msr cpsr, r0mov pc, lr#define pWTCON 0x7E004000disable_watchdog:ldr r0, =pWTCON	/*mov的操作数最多为8位*/mov r1, #0x0str r1, [r0]mov pc, lrdisable_interrupt:mvn r1, #0x0ldr r0, =0x71200014str r1, [r0]ldr r0, =0x71300014str r1, [r0]mov pc, lrdisable_mmu:mcr p15, 0, r0, c7, c7, 0mrc p15, 0, r0, c1, c0, 0bic r0, r0, #0x00000007mcr p15, 0, r0, c1, c0, 0mov pc, lr

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/265167.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部