Chinaunix首页 | 论坛 | 博客
  • 博客访问: 318876
  • 博文数量: 49
  • 博客积分: 4045
  • 博客等级: 上校
  • 技术积分: 1195
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-15 12:56
文章分类

全部博文(49)

文章存档

2013年(29)

2010年(6)

2009年(6)

2008年(8)

我的朋友

分类: 嵌入式

2013-03-11 09:38:28

本来想整中断呢,结果被迫的整下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模式的测试,其他异常基本一样,这里就不赘述了。


阅读(473) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~