大家好,今天来为大家分享mu网站源码分享的一些知识点,和网站源码吧的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
中断向量表设置
异常的定义:由内部或者外部的事件源产生使得cpu停下正在处理的工作转而去处理异常
异常向量:当某种异常发生的时候ARM处理器跳转到指定的地址去执行相关操作,此确定的内存地址就是异常向量
ARM提供2种向量选择:可配置CP15去配置,默认的异常向量地址是Normaladdress
需要注意的是DataAbort异常向量与IRQ异常向量的中间还有一个异常向量用于后续扩展使用,在normaladdress的异常向量中此预留异常向量地址:0x00000014高向量地址模式下的预留异常向量地址:0xffff0014
详细参考:ARMArchitectureReferenceManual
ARM处理器的7种异常:
异常向量表:异常向量与其对应的处理函数跳转关系所组成的表
设置SVC模式
将CPSR程序状态寄存器的后5位设置位对应的值即可。CPSR和SPSR寄存器的值不能直接进行修改需要先将其值复制到通用寄存器,然后修改通用寄存器的值,再赋值给CPSR/SPSR。
在中断向量表的reset标号处添加如下代码:下述代码在设置cpsr寄存器的时候不仅是设置了svc模式,还关闭了快速中断和中断。
关闭看门狗:
看门狗介绍:看门狗是由硬件搭建的一个计时器,需要定期向此计数器填充初值,如果超过一定时间不填充则看门狗就会产生一个复位信号使得系统重启。
看门狗原理:
下图左端介绍的是OK6410看门狗的时钟源,看门狗使用PCLK作为时钟源,现将此时钟进行预分频,然后再进行分频最终输出时钟为后续的看门狗定时计数器使用。中间部分就是一个定时计数器,首先向定时计数器中装入初值,计数器开始运行,在初值所规定的时间内没有再次喂狗的,就意味着设备死机了,此时可便会产生一个复位信号用于重启设备。
预分频系数和分频因子都是在WTCON寄存器中指定。详细可参考OK6410手册34章
关闭中断:
1.CPSR中的I和F位是控制中断和快速中断.即需要先将CPSR中这两个参数置1
2.设置中断屏蔽寄存器。VIC0INTENCLEARVIC1INTENCLEAR将这两个寄存器中的每一位都置为1即可屏蔽所有中断。详细参考6410手册的12VECTOREDINTRERRUPTCONTROLLERS
6410中的中断是向量分组的。VIC0INTENCLEAR和VIC1INTENCLEAR分别代表两组中断向量
关闭MMU和cache:
ache:
cache是容量小,但存取速度快的存储器。其保存最近用到的存储器中数据的拷贝。cache是透明的,其自动决定保存哪些数据,覆盖哪些数据
I-Cache:指令cache———用于存放指令
D-Cache:数据cache———用于存放数据
下图中带有cache的系统中,当处理器要从主存储器中获取某个数据的时候,其先到cache中查找,如果没有找到则再到主存储器中查找,主存储器将此数据传送到处理器,然后还将此数据传送到cache.下次处理器再要求此数据的时候则直接从cache获取即可。
cache可以提高数据的存取速度,是低速和告诉存储器的桥梁。
MMU:
物理地址:物理存储单元的实际地址
虚拟地址:程序中所使用的地址
使用虚拟地址的好处:
可以让进程使用更大的空间
解决地址冲突
从虚拟地址到物理地址的转化————由MMU来完成
在ARM11之前cache是在MMU之前的,在ARM11后cache在MMU后,即在ARM11之前可以直接使用虚拟地址来访问cache,但是在ARM11后需要使用物理地址来访问cache
关闭MMU和cache:MMU和cache都是通过CP15协处理器来控制
在cache除了关闭外,可能cache中已经有数据需要将cache中的值设置无效。
1.icachedcache失效
2.关闭icachedcache
3,关闭MMu
源码:
start.S
.text
.global_start
_start:
breset
ldrpc,_undefined_instruction
ldrpc,_prefetch_abort
ldrpc,_data_abort
ldrpc,not_used
ldrpc,_irq
ldrpc,_fiq
_undefined_instruction:.wordundefined_instruction
_software_interrupt:.wordsoftware_interrupt
_prefetch_abort:.wordprefetch_abort
_data_abort:.worddata_abort
_not_used:.wordnot_used
_irq:.wordirq
_fiq:.wordfiq
undefined_instruction:
nop
software_interrupt:
nop
prefetch_abort:
nop
data_abort:
nop
not_used:
nop
irq:
nop
fiq:
nop
reset:
blset_svc
bldisable_watchdog
bldisable_interrupt
bldisable_mmu
0xdf
orrr0,r0,diablewatchdog
0x0;关闭看门狗
strr1,[r0]
movpc,lr
definepVIC0INTENCLEAR0x71200014
0x0;
strr1,[r0]
ldrr0,=pVIC1INTENCLEAR
mvnr1,disablemmu&&icachedcache
disable_mmu:
mcrp15,0,r0,c7,c7,0idcache数据失效
mrcp15,0,r0,c1,c0,0
bicr0,r0,#0x00000005
mcrp15,0,r0,c1,c0,0关闭dcache和mmu
movpc,lr调用时的bl的返回操作
gboot.lds
OUTPUT_ARCH(arm)架构
ENTRY(_start)设置入口
SECTIONS{
.=0x50008000;
.=ALIGN(4);4字节对齐
.text:
{
start.o(.text)
*(.text)
}
.=ALIGN(4);
.data:
{
*(.data)
}
.=ALIGN(4);
bss_start=.;
.bss:
{
*(.bss)
}
bss_end=.;
}
Makefile:
all:start.o
arm-none-linux-gnueabi-ld-Tgboot.lds-ogboot.elf$^
arm-none-linux-gnueabi-objcopy-Obinarygboot.elfgboot.bin
%.o:%.S
arm-none-linux-gnueabi-gcc-g-c$^
%.o:%.c
关于mu网站源码分享,网站源码吧的介绍到此结束,希望对大家有所帮助。