一、反常向量表
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