关于ARM9的中断嵌套
- 格式:doc
- 大小:30.00 KB
- 文档页数:2
arm中断嵌套的原理摘要:1.引言2.arm 中断嵌套的原理2.1 arm 的中断向量表2.2 中断嵌套的实现2.3 中断嵌套的优点和应用3.arm 中断嵌套的实现3.1 硬件方面的支持3.2 软件方面的支持4.arm 中断嵌套的注意事项4.1 中断处理时间的考虑4.2 中断优先级的处理5.总结正文:在嵌入式系统中,中断处理是一个常见的功能。
ARM 处理器提供了丰富的中断处理功能,使得开发者可以灵活地处理各种中断事件。
中断嵌套是ARM 中断处理的一个重要特性,可以提高系统的响应速度和处理效率。
本文将详细介绍ARM 中断嵌套的原理、实现以及注意事项。
首先,我们需要了解ARM 中断嵌套的原理。
ARM 的中断向量表是一个关键概念。
中断向量表是一个存储中断向量地址的数组,用于快速定位和处理各种中断事件。
当有中断请求时,处理器会根据中断类型号在中断向量表中查找对应的中断向量地址,然后跳转到该地址执行中断处理程序。
中断嵌套的实现主要依赖于中断向量表的布局和中断处理程序的设计。
在一个系统中,可能会有多个中断源,它们的中断向量地址可能会相互重叠。
为了实现中断嵌套,我们需要保证中断向量表中的下一个中断向量地址在当前中断处理程序执行完毕之前可以被访问到。
这样,当一个中断请求到来时,处理器可以在当前中断处理程序执行完毕后,快速跳转到下一个中断向量地址,执行下一个中断处理程序。
中断嵌套的优点主要体现在可以提高系统的响应速度和处理效率。
例如,当一个外部中断请求到来时,处理器可以在执行当前中断处理程序的同时,响应外部中断请求,这样可以减少中断处理的时间。
此外,中断嵌套还可以实现中断优先级的功能,使得高优先级的中断请求能够更快地被处理。
要实现ARM 中断嵌套,需要硬件和软件两方面的支持。
在硬件方面,处理器需要支持中断嵌套,这通常需要处理器具有中断控制器,可以实现中断请求的排队和嵌套处理。
在软件方面,需要编写适当的中断处理程序,确保在当前中断处理程序执行完毕之前可以跳转到下一个中断向量地址。
ARM9(以S3C2410为例)中断机制一、ARM异常机制介绍ARM9处理器有7种工作模式。
分别是(除了用户模式其他都是异常模式用户模式(usr:ARM处理器正常的程序执行状态。
快速中断模式(fiq:用于高速数据传输或通道处理。
外部中断模式(irq:用于通用的中断处理。
管理模式(svc:操作系统使用的保护模式。
数据访问终止模式(abt:当数据或指令预取终止时进入该模式。
系统模式(sys:运行具有特权的操作系统任务。
未定义指令中止模式(und:当未定义的指令执行时进入该模式。
每种模式通过5位二进制编码进行标示:用户模式10000快速中断模式10001外部中断模式10010管理模式10011数据访问终止模式10111未定义指令中止模式11011系统模式11111模式编码存放在CPSR(程序当前状态寄存器,记录当前工作模式的编码的值)中的[4:0]。
快速中断模式、外部中断模式、数据访问终止模式、未定义指令中止模式、管理模式称为异常模式。
异常类型具体含义复位当处理器的复位电平有效时,产生复位异常,程序跳转到复位异常处理程序处执行。
未定义指令遇到不能处理的指令时,产生未定义指令异常。
软件中断该异常由执行SWI指令产生,可用于用户模式下的程序调用特权操作指令。
可使用该异常机制实现系统功能调用。
指令预取中止若处理器预取指令的地址不存在,或该地址不允许当前指令访问,存储器会向处理器发出中止信号,但当预取的指令被执行时,才会产生指令预取中止异常。
数据中止若处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常。
IRQ(外部中断请求)当处理器的外部中断请求引脚有效,且CPSR中的I 位为0时,产生IRQ异常。
系统的外设可通过该异常请求中断服务。
FIQ(快速中断请求)当处理器的快速中断请求引脚有效,且CPSR中的F 位为0时,产生FIQ异常。
当多个异常发生时,处理器根据优先级进行处理。
优先级1(最高)复位2 数据中止3 FIQ4 IRQ5 预取指令中止6(最低)未定义指令、SWI异常中断发生时,处理器执行完当前的指令,需要保存当前执行现场,切换到相应的异常模式,并跳转到相应的异常中断处理程序。
嵌入式技巧:ARM的三种中断调试方法介绍技巧:的三种中断调试办法介绍嵌入式软件开发流程参照嵌入式软件的开发流程。
第一步:工程建立和配置。
其次步:编辑源文件。
第三步:工程编译和链接。
第四步:软件的调试。
第五步:执行文件的固化。
在囫囵流程中,用户首先需要建立工程并对工程做初步的配置,包括配置处理器和配置调试设备。
编辑工程文件,包括自己编写的汇编和源程序,还有工程编译时需要编写的链接脚本文件,调试过程中需要编写存储区映像文件和指令脚本文件,以及上电复位时的程序运行入口的启动程序文件。
对后四种文件的理解很重要,其作用说明如下。
(1) 链接脚本文件:在程序编译时起作用。
该文件描述代码链接定位的有关信息,包括代码段,数据段,地址段等,链接器必需用法该文件对囫囵系统的代码做正确的定位。
在SDRAM中调试程序、在FLASH中调试或固化后运行的链接脚本文件应加以区别。
(在IDE开发环境中用法扩展名*.ld) (2)指令脚本文件:在SDRAM中调试程序时起作用。
在集成环境与目标衔接时、软件调试过程中以及目标板复位后,有时需要集成环境自动完成一些特定的操作,比如复位目标板、清除、屏蔽中断寄存器、存储区映射等。
这些操作可以通过执行一组指令序列来完成,保存一组指令序列的文本文件称为指令脚本文件(在 IDE开发环境中用法扩展名*.cs)。
(3)存储区映像文件:在SDRAM中调试程序时起作用。
在软件调试过程中拜访非法存储区在部分处理器和目标板上会产生异样,假如异样没有处理,则会导致软件调试过程无法继续,为了防止以上问题并调节器拜访速度以达到最合适的水平,提供这样一种用于描述各个存储区性质的文件叫存储区映像文件(在IDE开发环境中用法扩展名*.map)。
在程序的调试过程中可以挑选用法存储区映像文件*.map和指令脚本文件*. cs协作程序的调试。
(4) 启动文件:它主要是完成一些和硬件相关的初始化的工作,为应用程序做预备。
嵌⼊式实时操作系统试题1、⽬前使⽤的嵌⼊式操作系统主要有那些?请举出六种常⽤的。
Windwos CE、Windows Mobile、VxWork、Linux、uCos、Symbian、QNX2、⼀般⽽⾔,嵌⼊式系统的架构可以分为4个部分,分别是(处理器)、存储器、输⼊输出和软件,⼀般软件分为(操作系统)和应⽤软件两个主要部分。
3、从嵌⼊式操作系统特点可以将嵌⼊式操作系统分为(实时操作系统)和分时操作系统,其中实时系统可分为(硬实时系统)和软实时系统4、uc/os操作系统不包括以下哪集中状态A、运⾏B、挂起C、退出D、休眠5、0x70&0x11的运算结果是A、0x1B、0x11C、0x17D、0x76、下列哪种⽅式不是ucos操作系统中任务之间的通信⽅式A、信号量B、消息队列C、邮件D、邮箱7、在将ucos操作系统移植到ARM处理器上时,以下那些⽂件不需要修改A、OS_CORE.CB、include.hC、OS_CPU.HD、OSTaskInit设计实时操作系统时,⾸先应该考虑系统的()。
A.可靠性和灵活性B.实时性和可靠性C.分配性和可靠性D.灵活性和实时性2. ⼤多数嵌⼊式实时操作系统中,为了让操作系统能够在有突发状态时迅速取得控制权,以作出反映,⼤都采⽤()的功能。
A:抢占式任务调度B:时间⽚轮转调度C:单调速率调度D:FIFO调度8、所有的电⼦设备都属于嵌⼊式设备简单题:1、根据嵌⼊式系统的特点、写出嵌⼊式系统的定义答:以应⽤为中⼼,以计算机技术为基础,软硬件可裁剪、功能、可靠性、成本、体积、功耗严格要求的专⽤计算机系统2、试分析实时操作系统的⼯作特点及相互之间的转换运⾏:获得CPU的控制权就绪:进⼊任务等待队列,通过调度中转为运⾏状态挂起:由于系统函数调⽤⽽被设置成挂起状态,任务发⽣阻塞,等待系统实时事件的发⽣⽽被唤醒,从⽽转为就绪或运⾏。
休眠:任务完成或者错误被清除的任务,该任务此时不具有任务控制块。
arm中断嵌套的原理【实用版】目录1.ARM 中断嵌套的原理概述2.中断嵌套的实现机制3.中断嵌套的优缺点分析4.总结正文【1.ARM 中断嵌套的原理概述】ARM(Advanced RISC Machine)是一种高级精简指令集计算机(RISC)架构,广泛应用于嵌入式系统和移动设备等领域。
在 ARM 系统中,中断嵌套是一种重要的技术,用于实现多个中断之间的协同处理。
当一个中断处理程序(Interrupt Handler,IH)在执行过程中,可能会触发另一个中断处理程序,这就形成了中断嵌套。
【2.中断嵌套的实现机制】中断嵌套的实现主要依赖于 ARM 处理器的中断处理机制。
具体来说,当一个中断发生时,处理器会立即保存当前程序的状态,包括程序计数器、寄存器等,然后跳转到对应的中断处理程序入口。
在这个过程中,处理器会启用中断优先级控制,根据中断优先级确定处理程序的执行顺序。
在执行中断处理程序时,如果遇到另一个更高优先级的中断,处理器会再次保存当前程序的状态,并跳转到新的中断处理程序入口。
这样就形成了嵌套的层次结构。
在嵌套的过程中,处理器会按照优先级顺序逐个处理中断,直到所有中断处理完毕,恢复执行最初被中断的程序。
【3.中断嵌套的优缺点分析】中断嵌套技术具有以下优点:1.提高系统响应速度:当外部事件发生时,系统可以快速响应并进行处理,提高系统的实时性能。
2.资源利用率高:中断嵌套允许多个中断处理程序并发执行,充分利用系统资源。
然而,中断嵌套也存在以下缺点:1.代码复杂度增加:由于中断嵌套导致程序流程分支较多,可能会增加代码的复杂度,影响程序的可维护性。
2.系统稳定性降低:中断嵌套可能导致系统在处理多个中断时出现死锁、竞态等问题,影响系统的稳定性。
【4.总结】总之,ARM 中断嵌套技术在提高系统响应速度和资源利用率方面具有显著优势,但同时也带来了代码复杂度和系统稳定性方面的挑战。
一 ARM9(S3C2440)的中断系统——理论知识转载自:骨Zi里德骄傲概述S3C2440A 中的中断控制器接受来自60 个中断源的请求。
提供这些中断源的是内部外设,如DMA 控制器、UART、IIC 等等。
在这些中断源中,UARTn、AC97 和EINTn 中断对于中断控制器而言是“或”关系。
当从内部外设和外部中断请求引脚收到多个中断请求时,中断控制器在仲裁步骤后请求ARM920T 内核的FIQ或IRQ。
仲裁步骤由硬件优先级逻辑决定并且写入结果到帮助用户通告是各种中断源中的哪个中断发生了的中断挂起寄存器中中断控制器操作程序状态寄存器(PSR)的F 位和I 位如果ARM920T CPU 中的PSR 的F 位被置位为1,CPU 不会接受来自中断控制器的快中断请求(FIQ)。
同样的如果PSR 的I 位被置位为1,CPU 不会接受来自中断控制器的中断请求(IRQ)。
因此,中断控制器可以通过清除PSR 的F 位和I 位为0 并且设置INTMSK 的相应位为0 来接收中断。
中断模式ARM920T 有两种中断模式的类型:FIQ 或IRQ。
所有中断源在中断请求时决定使用哪种类型。
中断挂起寄存器S3C2440A 有两个中断挂起寄存器:源挂起寄存器(SRCPND)和中断挂起寄存器(INTPND)。
这些挂起寄存器表明一个中断请求是否为挂起。
当中断源请求中断服务,SRCPND 寄存器的相应位被置位为1,并且同时在仲裁步骤后INTPND 寄存器仅有1 位自动置位为1。
如果屏蔽了中断,则SRCPND 寄存器的相应位被置位为1。
这并不会引起INTPND 寄存器的位的改变。
当INTPND 寄存器的挂起位为置位,每当I 标志或F 标志被清除为0 中断服务程序将开始。
SRCPND 和INTPND 寄存器可以被读取和写入,因此服务程序必须首先通过写1 到SRCPND寄存器的相应位来清除挂起状态并且通过相同方法来清除INTPND 寄存器中挂起状态。
ARM处理器中断处理的编程实现中断是指外部事件打断正在执行的程序,并暂时转去执行与该事件有关的处理程序。
在ARM处理器上,中断处理是通过中断向量表和中断服务程序来实现的。
下面是ARM处理器中断处理的编程实现的主要内容。
1.中断向量表的设置在ARM处理器中,中断向量表是一个保存中断服务程序地址的表。
每个中断号对应一个中断服务程序的地址,当发生中断时,处理器会跳转到相应中断号对应的中断服务程序。
中断向量表必须存储在内存中,并且要先设置好才能使得中断处理正常工作。
为了设置中断向量表,需要将每个中断号对应的中断服务程序的地址写入到相应的中断向量表项中。
具体的实现方式根据不同的ARM架构有所不同。
以ARM Cortex-M系列处理器为例,中断向量表的每个向量表项占用4个字节,存储中断服务程序的地址。
下面是使用C语言设置中断向量表的示例代码:```c//声明中断向量表typedef void (*interrupt_handler_t)(void);//中断服务程序声明void interrupt_handler1(void);void interrupt_handler2(void);...//中断向量表__attribute__ ((section(".isr_vector")))const interrupt_handler_t interrupt_vector_table[] =interrupt_handler1, // 中断号0对应的中断服务程序interrupt_handler2, // 中断号1对应的中断服务程序...```2.中断服务程序的编写中断服务程序负责处理中断的具体逻辑。
当中断发生时,处理器会跳转到对应中断号的中断服务程序进行处理。
中断服务程序必须具有固定的格式和规范,以确保在中断发生时能正常执行。
中断服务程序的编写一般包括以下几个步骤:-保存寄存器状态:由于中断服务程序会暂时打断正在执行的程序,需要在进入中断服务程序时保存当前的寄存器状态,以便中断处理完成后能够正确恢复现场。
中断嵌套是指中断系统正在执行一个中断服务时,有另一个优先级更高的中断提出中断请求,这时会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断服务程序继续执行的过程。
简介其实就是更高一级的中断的“加塞”,处理器正在执行着中断,又接受了更急的另一件“急件”,转而处理更高一级的中断的行为!中断优先级定义优先级高的中断源可以中断优先级低的中断服务程序,这就形成了中断服务程序中套着中断服务程序的情况,即形成了所谓的中断嵌套。
MCU暂停现行程序而转去响应中断请求的过程称为中断响应;为使系统能及时响应并处理发生的所有中断,系统根据引起中断事件的重要性和紧迫程序,硬件将中断源分为若干个级别,称作中断优先级。
查询优先级中断的优先级有两个:查询优先级和执行优先级。
查询优先级是datasheet或书上的默认(IP寄存器不做设置,上电复位后为00H)的优先级:外部中断0> 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断或int0,timer0,int1,timer1,serial port 或 INT0、T0、INT1、T1、UART或PX0>PT0>PX1>PT1>PS>......其实都是查询优级。
首先查询优先级是不可以更改和设置的。
这是一个中断优先权排队的问题,是指多个中断源同时产生中断信号时,中断仲裁器选择对哪个中断源优先处理的顺序。
而这与是否发生中断服务程序的嵌套毫不相干。
当CPU查询各个中断标志位的时候,会依照上述5个查询优先级顺序依次查询,当数个中断同时请求的时候,会优先查询到高优查询先级的中断标志位,但并不代表高查询优先级的中断可以打断已经并且正在执行的低查询优先级的中断服务。
例如:当计数器0中断和外部中断1(按查询优先级,计数器0中断>外部中断1)同时到达时,会进入计时器0的中断服务函数;但是在外部中断1的中断服务函数正在服务的情况下,这时候任何中断都是打断不了它的,包括逻辑优先级比它高的外部中断0计数器0中断。
ARM异常中断机制.ARM9(以S3C2410为例)中断机制一、ARM异常机制介绍ARM9处理器有7种工作模式。
分别是(除了用户模式其他都是异常模式用户模式(usr:ARM处理器正常的程序执行状态。
快速中断模式(fiq:用于高速数据传输或通道处理。
外部中断模式(irq:用于通用的中断处理。
管理模式(svc:操作系统使用的保护模式。
数据访问终止模式(abt:当数据或指令预取终止时进入该模式。
系统模式(sys:运行具有特权的操作系统任务。
未定义指令中止模式(und:当未定义的指令执行时进入该模式。
每种模式通过5位二进制编码进行标示:用户模式10000快速中断模式10001外部中断模式10010管理模式10011数据访问终止模式10111未定义指令中止模式11011系统模式11111模式编码存放在CPSR(程序当前状态寄存器,记录当前工作模式的编码的值)中的[4:0]。
快速中断模式、外部中断模式、数据访问终止模式、未定义指令中止模式、管理模式称为异常模式。
异常类型具体含义复位当处理器的复位电平有效时,产生复位异常,程序跳转到复位异常处理程序处执行。
未定义指令遇到不能处理的指令时,产生未定义指令异常。
软件中断该异常由执行SWI指令产生,可用于用户模式下的程序调用特权操作指令。
可使用该异常机制实现系统功能调用。
指令预取中止若处理器预取指令的地址不存在,或该地址不允许当前指令访问,存储器会向处理器发出中止信号,但当预取的指令被执行时,才会产生指令预取中止异常。
数据中止若处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常。
IRQ(外部中断请求)当处理器的外部中断请求引脚有效,且CPSR中的I 位为0时,产生IRQ异常。
系统的外设可通过该异常请求中断服务。
FIQ(快速中断请求)当处理器的快速中断请求引脚有效,且CPSR中的F 位为0时,产生FIQ异常。
当多个异常发生时,处理器根据优先级进行处理。
ARM学习过程中中断嵌套问题ARM的中断管理体系和51系列微控制器的中断管理体系不太一样。
熟悉51体系结构的用户需要特别注意这一点。
ARM的中断不会自动嵌套,实现ARM微控制器的中断嵌套比较烦琐,我们不提倡中断嵌套。
但不排除需要嵌套的应用,因而在启动代码中,有对中断嵌套的处理。
模板中的文件IRQ.S用于处理中断嵌套,是以下中断处理方法的依据。
用户要根据自己的应用更改此文件,只需要在文件末尾添加中断处理程序的句柄即可。
中断嵌套的原则:低优先级的中断嵌套高优先级的中断。
可嵌套中断服务程序编写方法:1、保存当前中断使能寄存器VICIntEnable的值;2、禁止当前中断和低优先级中断;3、清除中断逻辑,使VIC能够响应更高优先级的中断;4、中断处理服务程序;5、恢复保存的中断使能寄存器的值。
声明需要嵌套的中断服务程序时,不能使用'__irq'关键字,而需要通过句柄的方式进行。
请注意IRQ.S中宏$IRQ_Label HANDLER $IRQ_Exception_Function的用法。
例子如下:/********************************************************************************************* 文件名:VIC_Nesting.c* 功能:本实验演示中断嵌套现象。
程序开启了两个中断:定时器0和外部中断0。
定时器0使LED8~LED1 * 闪烁,而外部中断0取反蜂鸣器控制口。
分配定时器0中断优先级高于外部中断0的优先级。
设置* KEY1连接外部中断0。
按住KEY1键后全速运行程序,看LED8~LED1能否闪烁,若闪烁,则说明中* 断嵌套成功。
需要在文件IRQ.S末尾添加句柄:* Timer0_Handler HANDLER IRQ_Timer0* Eint0_Handler HANDLER IRQ_Eint0* 说明:用跳线帽短接KEY1,BEEP,74HC595_2相关跳线。
ARM9嵌入式系统原理及应用教程第3章ARM9是一种常用的嵌入式系统处理器架构,被广泛应用于各种嵌入式系统中。
ARM9嵌入式系统原理及应用教程第3章主要介绍了ARM9嵌入式系统的编程模型和寄存器,以及ARM体系结构中的异常处理机制和中断处理机制。
在ARM9嵌入式系统中,ARM架构采用了一个三级、32位的保留字段处理器,这个处理器具有高度的灵活性和可编程性。
ARM9嵌入式系统主要由CPU、存储器、外设和外围接口组成。
ARM9的寄存器包括13个通用寄存器、程序计数器(PC)和程序状态寄存器(PSR)。
通用寄存器用于存储数据,而PC用于存储程序地址。
PSR用于存储程序状态,如标志位和操作模式等。
ARM9的编程模型采用了两种指令集,即Thumb指令集和ARM指令集。
Thumb指令集是一种紧凑的32位指令集,适用于存储空间有限的系统。
而ARM指令集是一种更为灵活和强大的32位指令集,适用于需要更高性能和更大存储空间的系统。
ARM9嵌入式系统可以根据需要在两种指令集之间进行切换。
ARM9嵌入式系统中的异常处理机制是一种用于处理系统中断或异常事件的机制。
ARM9嵌入式系统中的异常分为两种类型,即预取中止(Prefetch Abort)和数据中止(Data Abort)。
异常处理机制可以帮助嵌入式系统在出现异常情况时进行错误处理和恢复,并确保系统继续正常运行。
ARM9嵌入式系统中的中断处理机制是一种用于处理外部中断事件的机制。
ARM9嵌入式系统通过设计中断控制器和中断向量表来实现中断处理机制。
中断控制器负责检测和识别外部中断信号,而中断向量表则用于存储中断处理程序的入口地址。
当发生外部中断事件时,中断控制器会向CPU发送中断请求,CPU会根据中断向量表中的入口地址跳转到相应的中断处理程序进行处理。
ARM9嵌入式系统的应用非常广泛,包括但不限于移动设备、网络设备、工业控制系统、智能家居等。
ARM9嵌入式系统具有低功耗、高性能、灵活性和可编程性等特点,可以满足不同应用领域的需求。
嵌入式基于ARM9的中断驱动程序设计摘要随着移动设备的流行和发展,嵌入式系统已经成为一个热点。
当前,嵌入式技术的应用越来越广泛,从航天科技到民用产品,嵌入式产品的身影无处不在,而这些嵌入式产品的核心——处理器决定了产品的市场和性能。
在32位嵌入式处理器市场中,ARM处理器占有很大的份额。
而嵌入式系统的功能越来越强大,实现也越来越复杂,随之出现的就是可靠性大大降低。
本文所要研究的就是基于ARM嵌入式系统的中断处理程序设计与实现。
关键字:嵌入式,ARM,中断目录第1章设计目的 (1)第2章设计思路 (2)2.1 ARM实验箱硬件资源概述 (2)2.2 ARM的中断原理 (3)第3章关键技术 (4)3.1 arm9处理器 (4)3.2 嵌入式C语言开发技术 (5)3.3 ADS开发环境 (6)3.4 中断流程 (7)3.5 数据结构 (8)3.5.1 中断优先级产生模块 (8)3.5.2 中断优先级 (8)3.6 寄存器工作原理 (9)3.6.1 程序状态存储器PSR (9)3.6.2 中断模式 (9)3.6.3 中断请求寄存器 (10)3.6.4 中断屏蔽寄存器 (10)3.7 实验详解 (10)3.7.1 源请求寄存器SRCPND (10)3.7.2 中断模式寄存器INTMOD (12)3.7.3 中断屏蔽寄存器INTMSK (12)3.7.4 中断请求寄存器INTPND (13)3.7.5 中断偏移寄存器INTOFFSET (13)3.7.6 子中断源请求寄存器SUBSRCPND (13)3.7.7 子中断屏蔽寄存器INTSUBMSK (14)第4章程序流程 (15)第5章主要源代码 (16)5.1 主函数设计 (16)5.2 核心板的初始化 (16)5.3 定时器初始化程序 (17)第6章运行结果及结论 (18)6.1运行结果 (18)6.2结论 (18)参考文献 (19)第1章设计目的通过本次课程设计,能够熟悉基于ARM微处理器的嵌入式系统开发的过程,掌握嵌入式系统开发的知识。
基于ARM9芯片S3C2410异常中断程序设计[日期:2008-1-16] 来源:微计算机信息作者:书瑞于明剑飞彦莽[字体:大中小]摘要:验证的代码详细分析了基于ARM嵌入式系统的异常处理流程。
然后阐明关键字“-irq”的作用,设计出中断处理函数。
最后,通过设置中断控制寄存器,设计外部中断EINT3的初始化程序,并给出主程序流程图。
实践证明程序运行稳定可靠。
关键字:S3C2410 异常–irq 中断引言计算机体系结构中,异常或者中断是处理系统中突发事件的一种机制,几乎所有的处理器都提供这种机制。
异常主要是从处理器被动接受的角度出发的一种描述,指意外操作引起的异常。
而中断则带有向处理器主动申请的意味。
但这两种情况具有一定的共性,都是请求处理器打断正常的程序执行流程,进入特定程序的一种机制。
若无特别说明,对“异常”和“中断”都不作严格的区分。
本文结合经过实际验证的代码对ARM9中断处理流程进行分析,并设计出基于S3C2410芯片的外部中断处理程序。
1.异常中断响应和返回系统运行时,异常可能会随时发生。
当一个异常出现以后,ARM微处理器会执行以下几步操作:1) 将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。
2) 将CPSR复制到相应的SPSR中。
3) 根据异常类型,强制设置CPSR的运行模式位。
4) 强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处。
这些工作是由ARM 核完成的,不需要用户程序参与。
异常处理完毕之后,ARM微处理器会执行以下几步操作从异常返回:1) 将连接寄存器LR的值减去相应的偏移量后送到PC中。
2) 将SPSR复制回CPSR中。
3) 若在进入异常处理时设置了中断禁止位,要在此清除。
这些工作必须由用户在中断处理函数中实现。
为保证在ARM处理器发生异常时不至于处于未知状态,在应用程序的设计中,首先要进行异常处理。
GNU ARM汇编--(五)中断汇编之嵌套中断处理在上篇《GNU ARM汇编--(四)中断汇编之非嵌套中断处理》中分析了最简单的中断处理的写法,再看TQ2440启动代码中的中断向量表的写法就一目了然了.今天抽时间对嵌套中断处理的学习做下整理.嵌套中断处理的核心代码如下:[cpp]view plaincopyprint?1./*2.; * ____________________________________________________________________3.; *4.; * Copyright (c) 2004, Andrew N. Sloss, Chris Wright and Dominic Symes5.; * All rights reserved.6.; * ____________________________________________________________________7.; *8.; * NON-COMMERCIAL USE License9.; *10.; * Redistribution and use in source and binary forms, withor without11.; * modification, are permitted provided that the followingconditions12.; * are met:13.; *14.; * 1. For NON-COMMERCIAL USE only.15.; *16.; * 2. Redistributions of source code must retain the abovecopyright17.; * notice, this list of conditions and the following disclaimer.18.; *19.; * 3. Redistributions in binary form must reproduce the above20.; * copyright notice, this list of conditions and the following21.; * disclaimer in the documentation and/or other materials provided22.; * with the distribution.23.; *24.; * 4. All advertising materials mentioning features or useof this25.; * software must display the following acknowledgement:26.; *27.; * This product includes software developed by Andrew N.Sloss,28.; * Chris Wright and Dominic Symes.29.; *30.; * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS''AND ANY31.; * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE32.; * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR APARTICULAR33.; * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE34.; * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,35.; * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,36.; * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,37.; * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY38.; * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR39.; * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANYWAY OUT40.; * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY41.; * OF SUCH DAMAGE.42.; *43.; * If you have questions about this license or would like adifferent44.; * license please email :45.; *46.;*****************47.; *48.; *49.; */50.51./***********************************************************************52.; *53.; * Module : nih9_9.s54.; * Descriptions : Nested Interrupt Handler55.; * Example : 9.956.; * OS : generic57.; * Platform : generic58.; * History :59.; *60.; * 31th December 200361.; * - added header62.; *63.; ***********************************************************************/64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.91.92.93.94.95.96.if97.return98.99.100.101.102.103.104.105.106.107.108.109.int 110.111.112.113.114.115.116.117.118.return120.121.122.123.124.return125.126.代码的关键就是在中断后切换到SVC模式下,利用svc mode的stack来实现中断嵌套过程的备份以及恢复操作.从代码中可以看到,从R0到PC都在栈中有备份,这里我们叫栈帧.记得《深入理解计算机系统》一书在讲x86汇编的函数调用时也是栈帧的概念.这点上中断嵌套和函数调用有相似之处.有了这个栈帧,利用压栈出栈操作就一切ok了.刚看这个代码,对有个地方有疑问,就是觉得中断开早了:BIC r1,r1,#I_Bit ; 8 :MSR CPSR_c,r1 ; 8 : enable intSTMDB r13!,{r4-r7} ; 9 : save r4-r7 SVCSTR r2,[r13,#FRAME_PSR] ; 9 : save PSRSTR r8,[r13,#FRAME_R12] ; 9 : save r12STR r9,[r13,#FRAME_PC] ; 9 : save pcSTR r14,[r13,#FRAME_LR] ; 9 : save lr觉得开中断的代码应该放在后面,这样才能保证svc mode下的stack frame不会被破坏.但在草稿纸上画一下irq和svc下的stack图,就发现堆栈操作并没有问题.可以假设刚开中断立马就有新的中断了,r4-r7 r8 r9都有在STMIA r13,{r4-r11} 中保存到svc的stack中,LDMIA r0,{r4-r9} 和STMDB r13!,{r4-r7} 保证了最初的r0-r3在栈中,而LDMIA r0,{r4-r9}和STR r8,[r13,#FRAME_R12] 以及STR r9,[r13,#FRAME_PC] 保证了R12和PC,保证正确返回.(这里的r9装的是r14_irq,所以pc就是r14_irq,这样就保证了从中断服务例程中返回).至于STR r14,[r13,#FRAME_LR]中的r14是r14_svc,将其压入svc的stack中,中断例程用bl就不会出现错误了,在最后LDMIA r13!,{r14,pc}^ 中r14得到恢复.而r2保存的是spsr,也就是svc模式的状态,一直不变,不用担心会被覆盖.最后,再看了一遍图,觉得r10和r11的帧可以省去,因为r4-r9是用来存atpcs的r0-r3,r12,r14,而r10和r11用不到.貌似可以省点空间和时间,具体的待会实验一下.下面给出实际的嵌套中断处理,利用r10来保存INTOFFSET的值,根据该值来判定是什么中断,从而做不同的处理.具体的效果是:代码会做流水灯的动作,Key1代表INT1,中断处理动作是4个灯全全亮然后全灭,Key4代表代表INT0,中断处理动作是第一个灯和第三个灯亮,然后第二个灯和第四个灯亮.[cpp]view plaincopyprint?1./*2.simple interruption3.copyleft@*****************4.*/5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.90.91.92.93.94.95.96.97.98.99. 100. 101. 102. 103. 104. 105. 106. 107. 108.109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120.122.123.124.125.126.127.128.129.130.131.132.133.134.135.136.137.138.139.140.141.142.143.144.145.146.if147.retur n148.149.150.151.152.153.154.155.156.157.158.160.161.162.163.164.165.166.167.168.169.170.171.172.173.174.175.176.177.178.179.int 180.181.182.183.184.185.186.187.188.189.190.191.192.193.194.195.196.197.198.199.200.201.return 202.203.204.205.206.207.208.209.210.211.212.213.214.215.216.217.218.219.220.221.222.223.224.225.226.227.228.229.230.231.232.233.234.235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276.277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318.319.320.321.322.323.324.325.326.327.328.329.330.代码比较繁琐,有几点值得注意:在嵌套中断处理中,压栈后先保存INTOFFSET的值,再清中断(SRCPND和INTPND).因为SRCPND和INTPND清除后INTOFFSET就自动清除了,所以要先保存.在中断服务程序中,是可以用bl跳转到各自的中断服务程序的,比如blne blink1和blne blink3,值得对比的blink1和blink3,他们的不同在于blink1自己用代码做了延时,而blink3是调用bl delay做的延时,那么这个时候要注意的就是lr的push和pop操作,不然lr就被覆盖了,程序不能正确返回了.注意了以上两点,程序上达到了嵌套处理的效果.因为采用的是下降边沿触发,而按键没有防抖处理,有时候单按一个键就有嵌套中断了.最后总结一下这种处理的优缺点:优点是在为一个中断处理服务完成前允许其它中断,以缩短中断延迟;而缺点是不处理中断的优先级,因此低优先级的中断会阻塞高优先级的中断.。
Arm中断中对 HANDLER宏的研究本人最近在研究ARM9的裸机中断处理过程,对这过程中体会写下来与大家分享一下。
希望对初学者有所帮助!--Ly322一个重要的宏请看下面一段代码MACRO$HandlerLabel HANDLER $HandleLabel$HandlerLabelsub sp,sp,#4stmfd sp!,{r0}ldr r0,=$HandleLabelldr r0,[r0]str r0,[sp,#4]ldmfd sp!,{r0,pc}MEND在后面的程序有多处调用,其大致作用是把宏的第一个参数$HandlerLabel 转变为一个标号,然后让程序跳转到第二个参数 $HandleLabel (第二个参数应该为一个地址)对应的值的地址去我对此段代码有不解于是亲自在ADS1.2中编写了一段 具体如下。
并用JLINK亲自一步一步测试下面一句一句分析一下,为了便于分析,假设sp = 0x33ff8000,$HandleLabel = 0x33ffff00,[0x33ffff00] =0x10000000,r0 = 0x56001234:$HandlerLabel HANDLER $HandleLabel宏的名字叫HANDLER ,有两个参数$HandlerLabel定义一个标号sub sp,sp,#4把栈顶指针减4,留出一个字的空间(用于保存跳转地址的值),sp=0x33ff7ffcstmfd sp!,{r0}首先把sp减4 (sp=0x33ff7ff8),然后把将要使用的r0寄存器入栈,此时[0x33ff7ff8]=0x56001234ldr r0,=$HandleLabel给寄存器r0赋值,r0=0x33ffff00ldr r0,[r0]给寄存器r0赋值,r0=0x10000000str r0,[sp,#4]把寄存器r0保存到0x33ff7ffc (sp=0x33ff7ff8但是SP的值一直没有变),此时 [0x33ff7ffc] = 0x10000000ldmfd sp!,{r0,pc}把栈顶的两个字弹出,分别保存到r0、pc,此时sp=0x33ff8000,r0=0x56001234,pc=0x10000000 ,此时SP回到了原来的位置将SP中的值,通过比较不难发现,sp和r0在执行前后都没有变化,程序就跳转到0x10000000处执行。
关于嵌⼊式中断的⼀点理解
这⾥简要介绍下嵌套中断
arm9有两种中断模式,中断和快速中断
在中断时可发⽣快速中断,只有这⼀中嵌套中断,其余没有
多中断源同时发⽣中断时会通过各种寄存器的仲裁最后只有⼀种中断会响应
中断的处理过程发⽣在svc管理模式下,我个⼈认为这是在为嵌套中断做准备,即响应有可能发⽣的快速中断
中断发⽣的过程是这样的:
当发⽣中断时切换到中断模式,在中断模式下把前⼀个状态的返回地址和状态寄存器的值保存在中断模式下的堆栈中,把中断模式下的栈寄存器保存到⼀个通⽤寄存器中(这是为了把刚才保存在中断模式栈中的内容保存到svc模式下)
切换到svc模式下,在该状态下保存刚才在中断模式下堆栈中保存的内容,便于直接返回到中断前的状态,在svc管理模式下进⾏中断的处理操作。
NoInt EQU 0x80 //禁止IRQ中断
USR32Mode EQU 0x10 //用户模式
SVC32Mode EQU 0x13 //管理模式
SYS32Mode EQU 0x1f //系统模式
IRQ32Mode EQU 0x12 //中断模式
FIQ32Mode EQU 0x11 //快速中断模式
;引入的外部标号在这声明
//IMPORT表示引用外部的信息
IMPORT OSIntCtxSw ;任务切换函数//引用外部的函数
IMPORT OSIntExit ;中断退出函数
IMPORT OSTCBCur ;UC/OS II正在运行的任务指针
IMPORT OSTCBHighRdy ; UC/OS II任务就绪表中级别最高的优先级
IMPORT OSIntNesting ;中断嵌套计数器
IMPORT StackUsr ;用户模式堆栈
IMPORT OsEnterSum ;开关中断的次数
CODE32
AREA IRQ,CODE,READONLY
MACRO
$IRQ_Label HANDLER $IRQ_Exception_Function
EXPORT $IRQ_Label ; 输出的标号
IMPORT $IRQ_Exception_Function ; 引用的外部标号
$IRQ_Label
SUB LR, LR, #4 ; 计算返回地址
//进入中断后,它的返回地址该怎么计算呢,可以这样来理解,因为它的指令流水线是3级的,即执行进入中断函数时,PC已经指向欲取值的指令即当前执行的地址+8;当已进入中断时,LR里面装的是PC,所以要想中断返回到正确的地址处,就必须把LR-4。
STMFD SP!, {R0-R3, R12, LR} ; 保存任务环境
//这里面为什么只把R0-R3,R12,LR保存呢,其它不用吗,是这样的,我们可以从你装的ADS1.2目录下的PDF文件夹里面的ADS_DeveloperGuide_D.PDF文件的2.2就可以发现r4-r11装的是局部变量,在进行函数跳转时,编译器它会自动保护它们的。
MRS R3, SPSR ; 保存状态
STMFD SP, {R3, SP, LR}^ ; 保存用户状态的R3,SP,LR,注意不能回写,前面一个SP 是IRQ模式的,后面一个SP是用户模式的,为什么不能回写呢,如果你回写的话,那么它保存的是用户的SP,显然是不行的。
不知这样理解对不对。
这里保存SP和LR的目的是为了嵌套,
; 正是因为没有回写,所以后面调整了SP ,调整指令是SUB SP, SP, #4*3
LDR R2, =OSIntNesting ; OSIntNesting++ 中断嵌套数+1
;(相当于调用了一次中断进入函数OSIntEnter(),与后面的BL OSIntExit 形成呼应)LDRB R1, [R2]
ADD R1, R1, #1
STRB R1, [R2]
SUB SP, SP, #4*3 ;由于前面SP没有回写,保存了3个32位的寄存器,这里调整指针
;做好弹出这三个数据的准备
MSR CPSR_c, #(NoInt | SYS32Mode) ; 切换到系统模式。
只有切换到系统模式,让后面的服务程序在系统模式下运行,才能实现嵌套。
CMP R1, #1 ;判断是否是只有第一次进入中断,还是有嵌套
LDREQ SP, =StackUsr ;如果是第一次中断则设定系统模式的堆栈指针
BL $IRQ_Exception_Function ; 调用c语言的中断处理程序
MSR CPSR_c, #(NoInt | SYS32Mode) ; 切换到系统模式。
做好中断退出的准备
LDR R2, =OsEnterSum ; OsEnterSum,使OSIntExit退出时中断关闭
MOV R1, #1 ;相当于调用了OS_ENTER_CRITICAL();
STR R1, [R2]
BL OSIntExit ;调用UC/OS的中断退出函数 OSIntNesting--
; 如果中断嵌套数不等于0 则不进行任务调度
LDR R2, =OsEnterSum ; 因为中断服务程序要退出,所以OsEnterSum=0 MOV R1, #0 ; 相当于调用了OS_EXIT_CRITICAL()
STR R1, [R2]
MSR CPSR_c, #(NoInt | IRQ32Mode) ; 切换回irq模式
LDMFD SP, {R3, SP, LR}^ ; 恢复用户状态的R3,SP,LR, //前面一个SP是IRQ模式的,后面一个SP是用户模式的,为什么不能回写呢,如果你回写的话,那么它保存的是用户的SP,显然是不行的。
不知这样理解对不对。
; 正是因为没有回写,所以后面调整了SP ,调整指令是ADD SP, SP, #4*3 ;
LDR R0, =OSTCBHighRdy ;读出就绪表中任务最高优先级,判断是否需要任务切换LDR R0, [R0]
LDR R1, =OSTCBCur
LDR R1, [R1]
CMP R0, R1 ;//判断被挂起的任务是不是具有最高优先级
ADD SP, SP, #4*3 ; ;如果不是则进行任务切换
MSR SPSR_cxsf, R3
LDMEQFD SP!, {R0-R3, R12, PC}^ ; 不进行任务切换
LDR PC, =OSIntCtxSw ; 进行任务切换
MEND
END。