ARM 的反常处理
这部分比较欠好了解。
当反常间断产生时,体系履行完当时指令后,将跳转到相应的反常间断处理程序处履行。当反常间断处理程序履行完结后,程序回来到产生间断指令的下条指令处执 行。在进入反常间断处理程序时,要保存被间断程序的履行现场,从反常间断处理程序退出时,要康复被间断程序的履行现场。
1、引起反常的原因
(1)、指令履行引起的反常
软件间断、未界说指令(包含所要求的协处理器不存在是的协处理器指令)、预取址间断(存储器毛病)、数据间断。
(2)、外部产生的间断
复位、FIQ、IRQ。
(1)、指令履行引起的反常
软件间断、未界说指令(包含所要求的协处理器不存在是的协处理器指令)、预取址间断(存储器毛病)、数据间断。
(2)、外部产生的间断
复位、FIQ、IRQ。
2、ARM中反常间断的品种
(1)、复位(RESET)
a、当处理器复位引脚有用时,体系产生复位反常间断,程序跳转到复位反常间断处理程序处履行,包含体系加电和体系复位。
b、经过设置PC跳转到复位间断向量处履行称为软复位。
a、当处理器复位引脚有用时,体系产生复位反常间断,程序跳转到复位反常间断处理程序处履行,包含体系加电和体系复位。
b、经过设置PC跳转到复位间断向量处履行称为软复位。
(2)、未界说的指令
当ARM处理器或许是体系中的协处理器以为当时指令未界说时,产生未界说的指令反常间断,能够经过改反常间断机制仿真浮点向量运算。
当ARM处理器或许是体系中的协处理器以为当时指令未界说时,产生未界说的指令反常间断,能够经过改反常间断机制仿真浮点向量运算。
(3)、软件间断
这是一个由用户界说的间断指令(SWI)。可用于用户形式下的程序调用特权操作指令。在实时操作体系中能够经过该机制完结体系功用调用。
这是一个由用户界说的间断指令(SWI)。可用于用户形式下的程序调用特权操作指令。在实时操作体系中能够经过该机制完结体系功用调用。
(4)、指令与取停止(Prefech Abort)
假如处理器预取的指令的地址不存在,或许该地址不答应当时指令拜访,当被预取的指令履行时,处理器产生指令预取停止反常间断。
假如处理器预取的指令的地址不存在,或许该地址不答应当时指令拜访,当被预取的指令履行时,处理器产生指令预取停止反常间断。
(5)、数据拜访停止(DATAABORT)
假如数据拜访指令的方针地址不存在,或许该地址不答应当时指令拜访,处理器产生数据拜访停止反常间断。
假如数据拜访指令的方针地址不存在,或许该地址不答应当时指令拜访,处理器产生数据拜访停止反常间断。
(6)、外部间断请求(IRQ)
当处理器的外部间断请求引脚有用,并且CPSR的寄存器的I操控位被铲除时,处理器产生外部间断请求反常间断。体系中个外设经过该反常间断请求处理服务。
当处理器的外部间断请求引脚有用,并且CPSR的寄存器的I操控位被铲除时,处理器产生外部间断请求反常间断。体系中个外设经过该反常间断请求处理服务。
(7)、快速间断请求(FIQ)
当处理器的外部快速间断请求引脚有用,并且CPSR的F操控位被铲除时,处理器产生外部间断请求反常间断。
当处理器的外部快速间断请求引脚有用,并且CPSR的F操控位被铲除时,处理器产生外部间断请求反常间断。
3、反常的呼应进程
除了复位反常外,当反常产生时,ARM处理器尽可能完结当时指令(除了复位反常)后,再去处理反常。并履行如下动作:
除了复位反常外,当反常产生时,ARM处理器尽可能完结当时指令(除了复位反常)后,再去处理反常。并履行如下动作:
(1)、将引起反常指令的下一条指令的地址保存到新形式的R14中,若反常是从ARM状况进入,LR寄存器中保存的是下一条指令的地址(当时PC+4或 PC+8,与反常的类型有关);若反常是从Thumb状况进入,则在LR寄存器中保存当时PC的偏移量,这样,反常处理程序就不需求确认反常是从何种状况 进入的。例如:在软件间断反常SWI,指令MOV PC,R14_svc总是回来到下一条指令,不论SWI是在ARM状况履行,仍是在Thumb状
态履行。
(2)、将CPSR的内容保存到要履行反常间断形式的SPSR中。(留意:假如经进程序修改CPSR进入反常形式,硬件将不会将CPSR保存到SPSR中)
(3)、设置CPSR相应的位进入相应的间断形式。
(4)、经过设置CPSR的第7位来制止IRQ。假如反常为快速间断和复位。则还要设置CPSR的第6位来制止快速间断。
(5)、给PC强制赋向量地址值。
(2)、将CPSR的内容保存到要履行反常间断形式的SPSR中。(留意:假如经进程序修改CPSR进入反常形式,硬件将不会将CPSR保存到SPSR中)
(3)、设置CPSR相应的位进入相应的间断形式。
(4)、经过设置CPSR的第7位来制止IRQ。假如反常为快速间断和复位。则还要设置CPSR的第6位来制止快速间断。
(5)、给PC强制赋向量地址值。
ARM处理器内核会主动履行以上几步,程序计数器PC总是跳转到相应的固定地址。
假如反常产生时,处理器处于Thumb状况,则当反常向量地址加载入PC时,处理器主动切换到ARM状况,则反常处理回来时,主动切换到Thumb状况,即间断处理只在ARM状况下处理。
4、反常间断处理回来/**下面引用了http://www.mcu16.com/embed/arm/中的内容**/
反常处理完毕之后,ARM微处理器会履行以下几步操作从反常回来:
反常处理完毕之后,ARM微处理器会履行以下几步操作从反常回来:
(1)、将一切修改正的用户寄存器从处理程序的维护栈中康复。
(2)、将SPSR仿制回CPSR中,将衔接寄存器LR的值减去相应的偏移量后送到PC中。
(3)、若在进入反常处理时设置了间断制止位,要在此铲除。
(2)、将SPSR仿制回CPSR中,将衔接寄存器LR的值减去相应的偏移量后送到PC中。
(3)、若在进入反常处理时设置了间断制止位,要在此铲除。
复位反常处理程序不需求回来。
5、程序示例剖析
下面结合Samsung公司依据ARM7TDMI内核的S3C44B0微操控器的发动代码具体阐明关于反常处理中的Reset、IRQ和FIQ处理进程及完结办法,
下面结合Samsung公司依据ARM7TDMI内核的S3C44B0微操控器的发动代码具体阐明关于反常处理中的Reset、IRQ和FIQ处理进程及完结办法,
以下代码均在Embest IDE 集成开发环境下能够编译运转并经过实践验证。
.text
#Embest IDE集成开发环境能够经过链接脚本文件将下面的句子定位在零开端地址,体系上
#加电后CPU从此处开端履行。
ENTRY:
b ResetHandler /*0x00000000; for debug*/
b HandlerUndef /*0x00000004; handlerUndef*/
b HandlerSWI /*0x00000008; SWI interrupt handler*/
b HandlerPabort /* 0x0000000C;handlerPAbort*/
b HandlerDabort /*0x00000010; handlerDAbort*/
b . /* handlerReserved */
b HandlerIRQ /* 0x00000018*/
b HandlerFIQ /*0x0000001C */
上面的代码用于在出现反常时,CPU依据不同状况运用标号主动跳转到对应的反常处理程序处,别离对应于处理器的7种不同作业形式。当复位后,由零地址的跳 转指令使CPU转去履行发动代码,它是用于初始化CPU内部特别功用寄存器和外围电路以及用来为高档言语写的软件做好运转前预备的一小段汇编言语,这部分 汇编代码也能够被成为嵌入式体系的Bootloader。运转完bootloader代码后,会主动跳转至运用高档言语编写的体系应用程序或是开端运转操 作 体系内核。而关于间断的处理在体系发动代码中关于初学者是较难了解的。
当CPU接收到间断请求信号之后且答应CPU呼应间断请求,则关于FIQ和非矢量IRQ间断CPU会依据间断操控器设定的作业形式去主动履行
.text
#Embest IDE集成开发环境能够经过链接脚本文件将下面的句子定位在零开端地址,体系上
#加电后CPU从此处开端履行。
ENTRY:
b ResetHandler /*0x00000000; for debug*/
b HandlerUndef /*0x00000004; handlerUndef*/
b HandlerSWI /*0x00000008; SWI interrupt handler*/
b HandlerPabort /* 0x0000000C;handlerPAbort*/
b HandlerDabort /*0x00000010; handlerDAbort*/
b . /* handlerReserved */
b HandlerIRQ /* 0x00000018*/
b HandlerFIQ /*0x0000001C */
上面的代码用于在出现反常时,CPU依据不同状况运用标号主动跳转到对应的反常处理程序处,别离对应于处理器的7种不同作业形式。当复位后,由零地址的跳 转指令使CPU转去履行发动代码,它是用于初始化CPU内部特别功用寄存器和外围电路以及用来为高档言语写的软件做好运转前预备的一小段汇编言语,这部分 汇编代码也能够被成为嵌入式体系的Bootloader。运转完bootloader代码后,会主动跳转至运用高档言语编写的体系应用程序或是开端运转操 作 体系内核。而关于间断的处理在体系发动代码中关于初学者是较难了解的。
当CPU接收到间断请求信号之后且答应CPU呼应间断请求,则关于FIQ和非矢量IRQ间断CPU会依据间断操控器设定的作业形式去主动履行
0x0000001C 或0x00000018处的跳转指令。履行
b HandlerIRQ
#跳转到
HandlerIRQ HANDLER HandleIRQ
#这个宏界说的动作是要跳转到HandleIRQ中寄存的地址去运转。
#然后在复位初始化代码(ResetHandler)中会看到有:
/* Setup IRQ handler*/
ldr r0,=HandleIRQ
ldr r1,=IsrIRQ
str r1,[r0]
这里是把IsrIRQ的地址放到了HandleIRQ中。因而程序会跳转到IsrIRQ去履行。
#ARM7TDMI 内核只支撑FIQ和IRQ两个间断请求,当有多个间断请求信号一起有用的时#候,是运用软件的方法来完结优先级断定,然后再跳转到相应的间断服务程序。在 IsrIRQ中,CPU会读取间断挂起寄存器的数值来断定间断来历和优先级。而S3C44B0中集成的间断操控器供给了一种更为快速有用的间断呼应方法: 矢量间断运用间断操控器的硬件方法直接供给对间断服务的快速呼应:当多重间断请求信号产生时,由硬件优先级断定逻辑确认哪个间断请求将被呼应,一起硬件逻 辑还运用向量表中的跳转指令使CPU直接跳转到相应的间断服务程序进口出。这样在很大程度上减小了间断呼应的推迟。
那么在程序设计上,就需求咱们在矢量间断表中对应的地址上放置各个间断请求对应的服务程序进口地址,如:
VECTOR_BRANCH:
ldr pc,=HandlerEINT0 /*0x00000020*/
ldr pc,=HandlerEINT1 /*0x00000024*/
ldr pc,=HandlerEINT2 /*0x00000028*/
ldr pc,=HandlerEINT3 /*0x0000002C*/
ldr pc,=HandlerEINT4567 /*0x00000030*/
ldr pc,=HandlerTICK /*0x00000034 */
b .
b .
ldr pc,=HandlerZDMA0 /*0x00000040*/
ldr pc,=HandlerZDMA1 /*0x00000044*/
……
b HandlerIRQ
#跳转到
HandlerIRQ HANDLER HandleIRQ
#这个宏界说的动作是要跳转到HandleIRQ中寄存的地址去运转。
#然后在复位初始化代码(ResetHandler)中会看到有:
/* Setup IRQ handler*/
ldr r0,=HandleIRQ
ldr r1,=IsrIRQ
str r1,[r0]
这里是把IsrIRQ的地址放到了HandleIRQ中。因而程序会跳转到IsrIRQ去履行。
#ARM7TDMI 内核只支撑FIQ和IRQ两个间断请求,当有多个间断请求信号一起有用的时#候,是运用软件的方法来完结优先级断定,然后再跳转到相应的间断服务程序。在 IsrIRQ中,CPU会读取间断挂起寄存器的数值来断定间断来历和优先级。而S3C44B0中集成的间断操控器供给了一种更为快速有用的间断呼应方法: 矢量间断运用间断操控器的硬件方法直接供给对间断服务的快速呼应:当多重间断请求信号产生时,由硬件优先级断定逻辑确认哪个间断请求将被呼应,一起硬件逻 辑还运用向量表中的跳转指令使CPU直接跳转到相应的间断服务程序进口出。这样在很大程度上减小了间断呼应的推迟。
那么在程序设计上,就需求咱们在矢量间断表中对应的地址上放置各个间断请求对应的服务程序进口地址,如:
VECTOR_BRANCH:
ldr pc,=HandlerEINT0 /*0x00000020*/
ldr pc,=HandlerEINT1 /*0x00000024*/
ldr pc,=HandlerEINT2 /*0x00000028*/
ldr pc,=HandlerEINT3 /*0x0000002C*/
ldr pc,=HandlerEINT4567 /*0x00000030*/
ldr pc,=HandlerTICK /*0x00000034 */
b .
b .
ldr pc,=HandlerZDMA0 /*0x00000040*/
ldr pc,=HandlerZDMA1 /*0x00000044*/
……
6、间断向量表http://www.mcu16.com/embed/arm/arm593.htm
a、间断向量表指定了个反常间断及其处理程序的对应联系。他一般寄存在存储地址的低端。在ARM体系中,反常间断向量表的巨细为32字节,其间每个反常间断占有4个字节巨细,保存了4个字节空间。
b、每个反常间断对应的间断向量表中的4个字节的空间中寄存了一个跳转指令或许一个向PC寄存器中赋值的数据拜访指令。经过这两种指令,程序将跳转到相应的反常间断处理程序处履行。
c、当几个反常间断一起产生时,体系并不能依照必定的次第来处理这些反常间断,例如:当FIQ、IRQ和第三个其他间断一起产生,FIQ比IRQ优先级高,IRQ会疏忽,直到FIQ回来到用户代码停止。
b、每个反常间断对应的间断向量表中的4个字节的空间中寄存了一个跳转指令或许一个向PC寄存器中赋值的数据拜访指令。经过这两种指令,程序将跳转到相应的反常间断处理程序处履行。
c、当几个反常间断一起产生时,体系并不能依照必定的次第来处理这些反常间断,例如:当FIQ、IRQ和第三个其他间断一起产生,FIQ比IRQ优先级高,IRQ会疏忽,直到FIQ回来到用户代码停止。
各个反常间断的间断向量地址以及间断的处理优先级
——————————————————————————————————————
间断向量地址 | 反常间断类型 | 反常间断形式 | 优先级(6最低) |
—————————|—— ——————|—————————|———— —————|
0x00 | 复位 | 特权形式 | 1 |
0x04 | 未界说的指令 | UND停止形式 | 6 |
0x08 | 软件间断 | 特权形式 | 6 |
0x0C | 指令预取停止 | 停止形式 | 5 |
0x10 | 数据拜访停止 | 停止形式 | 2 |
0x14 | 保存 | 未运用 | 未运用 |
0x18 | 外部间断请求 | IRQ形式 | 4 |
0x1C | 快速间断请求 | FIQ形式 | 3 |
——————————————————————————————————————
——————————————————————————————————————
间断向量地址 | 反常间断类型 | 反常间断形式 | 优先级(6最低) |
—————————|—— ——————|—————————|———— —————|
0x00 | 复位 | 特权形式 | 1 |
0x04 | 未界说的指令 | UND停止形式 | 6 |
0x08 | 软件间断 | 特权形式 | 6 |
0x0C | 指令预取停止 | 停止形式 | 5 |
0x10 | 数据拜访停止 | 停止形式 | 2 |
0x14 | 保存 | 未运用 | 未运用 |
0x18 | 外部间断请求 | IRQ形式 | 4 |
0x1C | 快速间断请求 | FIQ形式 | 3 |
——————————————————————————————————————
7、总结
S3C44B0运用两个向量表高效而牢靠的完结了对反常的处理,把握了S3C44B0微处理器的反常形式以及对反常处理中复位、FIQ和IRQ呼应的过 程,能够在很大程度上协助咱们了解ARM7TDMI内核对反常处理的作业原理,有利于了解S3C44B0的发动代码(或Bootloader),还能够更 有用的运用芯片的硬件资源编写出精简而由高效的嵌入式程序代码。对嵌入式体系全体设计会起到很大的协助,是进行嵌入式体系开发的根底。
S3C44B0运用两个向量表高效而牢靠的完结了对反常的处理,把握了S3C44B0微处理器的反常形式以及对反常处理中复位、FIQ和IRQ呼应的过 程,能够在很大程度上协助咱们了解ARM7TDMI内核对反常处理的作业原理,有利于了解S3C44B0的发动代码(或Bootloader),还能够更 有用的运用芯片的硬件资源编写出精简而由高效的嵌入式程序代码。对嵌入式体系全体设计会起到很大的协助,是进行嵌入式体系开发的根底。