本来想整中断呢,结果被迫的整下ARM体系结构的异常,想要讲异常,那就需要知道6410的7种工作模式:用户模式(USER)、系统模式(SYS)、管理模式(SVC)、快速中断模式(FIQ)、中断模式(IRQ)、未定义模式(UND)、数据访问终止模式(ABT)。
除了USER,其他的又属于特权模式;除了USER与SYS模式之外,其他的又称为异常模式!如图:
那这些模式之间又什么联系和区别呢?设置这么多模式有什么用呢?
user模式不可以访问一些特殊资源,比如有些内存地址等,跑应用程序时用这个模式,防止非法访问造成系统瘫痪
sys模式和user的模式的区别就在于,sys模式的资源访问不受限制。其他一样,比如这个模式下的寄存器都一样。
Svc模式,系统一上电就跑这个模式;swi #0x123
Abt 模式,当数据或指令预取终止时进入这个模式,比如6410要求指令4字节对齐,也就是指令的 地址%4,== 0,如果 地址%4 != 0,那么就发生取指令异常。取数据异常是什么?希望知道的人指明!
Und模式,当取指时发现一条不是指令的指令,就进入这个模式。
这些模式都是由 软件 引起的!
Fiq,riq模式,一般来说都是由硬件引起的,因为我看了中断体系那章的datasheet,有说到软件中断寄存器。不知道是不是指的效果和硬件一样:发生中断后后进入中断模式。至少我知道那个不常用,笑。希望知道的指明:中断体系结构中的 软件中断寄存器怎么用?
这些模式之间可以通过控制CPSR的M[4:0]来切换或者硬件发生异常时自动切换。
以上说了关于ARM7种工作模式已经,每种工作模式的特点或工作范围。
这里说说这些模式,相对应的寄存器,每种模式都有自己的r0-r15寄存器,和CPSR或SPSR寄存器。
具体每个寄存器的含义和作用我就不罗嗦了,自己网上搜!需要强调的是,CPSR寄存器每一位什么含义,自己查。
7种模式除了user和sys模式没有spsr寄存器,其他模式都有,spsr是为了进入相应的模式时,保存前一个模式的CPSR寄存器中的值。加上保存r0-r14中的值?也就是常说的现场的保存。
这里再说说ARM的nand flash方式启动,板子上电时,硬件自动把nand前8k内容拷到三星出厂时自带的8k sram(???)中,并跳到地址0处,开始执行,若是想要你写的程序,支持这7种模式,那么你应该写相应的7种模式的跳转指令,下图为7中模式的跳转指令的地址:……
贴代码,语言无法描述了:
.align 2
.text
.global _start
_start:
b reset
b und
b swi
b ipabt
b daabt
.word 0 @占位,上图Abort和IRQ之间缺一个0x00000014.
b irq
b fiq
@vectors,stubs
reset:
mov r0,#0x70000000
orr r0,r0,#0x13
mcr p15,0,r0,c15,c2,
mov sp,#0x2000 @svc stack
bl main
b .
und:
mov sp,#0x1800 @设置und模式的堆栈
@也可以提前修改CPSR的值来改变模式,然后设置堆栈。
stmfd sp!,{r0-r12,lr} @保存上一个模式的状态
mrs r0,cpsr
sub r2,lr,#4
ldr r1,[r2]@前三句传参
bl do_und
ldmfd sp!,{r0-r12,pc}^ @加^符号是表示同时连spsr的值返回到cpsr中法。
swi:
b .
ipabt:
b .
daabt:
b .
irq:
b .
fiq:
b .
这里是start.s里的函数,具体如何实现一个und命令,可以用一个C函数里面嵌入汇编来实现。
这里只实现了und模式的测试,其他异常基本一样,这里就不赘述了。
阅读(2321) | 评论(0) | 转发(2) |