ARM嵌入式系统中断向量表的动态配置
- 格式:pptx
- 大小:194.44 KB
- 文档页数:15
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 中断嵌套,需要硬件和软件两方面的支持。
在硬件方面,处理器需要支持中断嵌套,这通常需要处理器具有中断控制器,可以实现中断请求的排队和嵌套处理。
在软件方面,需要编写适当的中断处理程序,确保在当前中断处理程序执行完毕之前可以跳转到下一个中断向量地址。
ARM开发教程之ARM体系的嵌入式系统BSP的程序设计简介:ARM公司在32位RISC的CPU开发领域不断取得突破,其结构已经从V3发展到V6。
BSP(Board Support Package)板级支持包介于主板硬件和操作系统之间,其功能与PC 机上的BIOS相类似,主要完成硬件初始化并切换到相应的操作系统。
BSP是相对于操作系统而言的,不同的操作系统对应于不同定义形式的BSP,例如VxWorks的BSP和Linux的BSP相对于某一CPU来说,尽管实现的功能一样,可是写法和接口定义是完全不同的。
另外,仔细研究所用的芯片资料也十分重要,例如尽管ARM在内核上兼容,但每家芯片都有自己的特色。
所以这就要求BSP程序员对硬件、软件和操作系统都要有一定的了解。
本文介绍基于ARM体系的嵌入式应用系统初始化部分BSP的程序设计。
本文引用的源码全部是基于HMS320C7202芯片设计,并已成功运行。
1 ARM开发教程之初始化过程尽管各种嵌入式应用系统的结构及功能差别很大,但其系统初始化部分完成的操作有很大一部分是相似的。
嵌入式系统的启动流程如图1所示。
1.1 设置入口指针启动程序首先必须定义指针,而且整个应用程序只有一个入口指针。
一般地,程序在编译链接时将异常中断向量表链接在0地址处,并且作为整个程序入口点。
入口点代码如下:ENTRY(_start);开始1.2 ARM开发教程之设置异常中断向量表ARM要求中断向量表必须放置在从0开始、连续8×4字节的空间内。
各异常中断向量地址以及中断的算是优先级如表1:表1 各异常中断的中断向量地址以及中断的处理优先级中断向量地址异常中断类型异常中断模式优先级(6最低)0x0 复位特权模式(SVC)10x4 未定义中断未定义指令中止模式(Undef) 60x8 软件中断(SWI)特权模式(SVC)60x0c 指令预取中止中止模式50x10 数据访问中止中止模式20x14 保留未使用未使用0x18 外部中断请求(IRQ)外部中断(IRQ)模式40x1c 快速中断请求(FIQ)快速中断(FIQ)模式 3每当一个中断发生后,ARM处理器便强制把程序计数器(PC)指针置为向量表中对应中断类型的地址值。
不同CPU中断技术对比摘要:本文大体论述了80x86,80c51,和ARM在中断源,中断申请方式、中断优先级管理方式、中断的处理过程、中断向量等方面比较。
关键词:CPU,80x86,80c51,,ARM,中断申请方式,中断优先级管理方式,中断的处理过程,中断向量。
正文:一、X86 CPU,80C51,ARM中断源:X86 CPU支持256个中断向量,中断号00H--0FFH 。
0~19是系统预定义的异常和NMI,20~31被Intel保留,如表1。
所以,外部中断从32开始。
CPU处理的流程都一样,在执行完当前指令后,根据中断源提供的中断向量,在IDT中找到并调用相应的服务例程。
X86 CPU中断分为内部中断和外部中断。
内部中断分为:软中断,内部中断和异常,异常分为3种:Fault:可以被更正的错误,异常处理程序的返回地址是产生fault的指令。
Trap:执行trap指令(例如INT 3)后被报告的异常,异常处理程序的返回地址是产生trap指令的后一条指令。
Abort:严重错误,无法继续执行。
外部中断分为:不可屏蔽硬件中断和可屏蔽硬件中断。
不可屏蔽硬件中断(02H):由NMI端引入的中断请求,中断请求不可被屏蔽;可屏蔽硬件中断请求:由INTR端引入,中断请求可由IF=0进行屏蔽,使中断请求不进入。
表180C51的中断系统包括中断源、中断允许寄存器IE、中断优先级寄存器IP、中断矢量等。
在80C51中,只有两级中断优先级。
图1是80C51的中断系统结构示意图。
80C51有5个中断源分别为:两个外部中断源INT0、INT1和三个内部中断源T0、T1定时/计数谥出中断源和串行口发送或接收中断源。
外部中断是由外部信号引起的,它们的中断请求信号分别从引脚INT0和INT1上引入图1ARM 7TDMI具有常规中断(IRQ)、快中断(FIQ)和软件中断(SoftWare Interrupt)三种中方式。
常规中断和快中断都是硬件中断。
实验一最小系统实验一、实验目的熟悉最小系统的硬件构成,掌握复位电路、晶振电路、电源电路(尤其是滤波电容的应用),编写一个例程,并在最小系统上运行;了解嵌入式开发的基本思想和过程。
掌握最小系统的构成,在将来的项目运用中能根据不同的场合选择相应的复位电路。
二、实验原理本实验通过一个简短的 Boot 引导程序介绍 ARM 开发平台的启动过程,同时该引导程序也可其他章节程序引导的示例程序。
本程序主要为了让读者能够清晰理解启动程序的基本架构组成部分以及掌握ARM 引导程序的编写方法。
三、主要实验设备1.硬件:宿主机、ARM教学试验箱;2.软件:Windows操作系统、ADS1.2集成开发环境。
四、实验内容构建最小系统,用示波器观察一下晶振电路的波形,测一下晶振正常工作时的电压。
编写一个例程,编译并运行。
设置ARM仿真器的开发环境。
程序架构如下:1.程序头IMPORT MDCNFG ;声明 MDCNFG(读写寄存器)物理地址0x48000000IMPORT MDREFR ;声明 MDREFR(刷新寄存器)0x48000004IMPORT MDMRS ;声明 MDMRS(模式/设置寄存器 0x48000040IMPORT init_MDCNFG ; 声明 init_MDCNFG 0x02000ac9IMPORT init_MDREFR ; 声明 init_MDREFR 0x0011e018IMPORT init_MDMRS ; 声明 init_MDMRS 0x320032IMPORT StackSvc ; 声明 StackSvc 0xa0600000IMPORT StackIrq ; 声明 StackIrq 0xa0605000IMPORT StackFiq ; 声明 StackFiq 0xa060a000IMPORT StackAbt ; 声明 StackAbt 0xa060e000IMPORT StackUnd ; 声明 StackUnd 0xa0714000IMPORT StackUsr ; 声明 StackUsr 0xa0720000IMPORT mainIMPORT宏通知编译器本源码文件需要引用在其他文件中定义的变量或函数。
浅谈嵌入式MCU的中断处理众所周知,一方面,MCU在嵌入式系统中的广泛使用的一个重要原因就是其相对于MPU和通用CPU的时效性优势。
而低延迟的外设中断和中断嵌套正是MCU实时性的最大保障。
另一方面,在嵌入式系统MCU软件开发中,随着系统功能的日益复杂,不论是否采用RTOS,多任务都是不可避免的。
在裸奔系统中,为了让时间关键的任务得到最先响应,往往需要通过外设中断嵌套来实现,属于基于外设的硬件中断嵌套,而在RTOS中,则给所有系统任务,都赋以具体的优先级,由内核根据优先级高低来进行调度,实际上是实现了一套基于优先级的软件中断嵌套。
RTOS中的任务软件嵌套通过内核tick 定时器中断不断查询RTOS任务就绪表中各任务的优先级高低来实现任务切换,其外设硬件中断未必需要嵌套。
本文旨在给大家介绍嵌入式MCU的中断处理相关知识,帮助大家理解中断,并使用好中断。
既然中断嵌套对于嵌入式系统设计如此重要,具体什么是中断嵌套呢?在具体解释中断嵌套之前,有必须要先讲一下嵌入式MCU的中断工作机制和中断优先级:写过裸奔程序的工程师都知道,一个内核CPU同一个时刻只能执行一个任务/程序代码/指令,比如数据计算,与片上外设进行交互通信等。
代码的执行顺序是用户自己首先写好的,CPU逐行取指、译码、执行即可。
产品功能的实现就是在main函数的while(1)循环中(常称作主程序),不断的调用其他功能函数实现的。
但实际工作环境中、很多事件是随机发生的,比如网络通信,外部IO输入等不确定事件,这个时候CPU就不得不放下当前正在执行的工作,却响应这些紧急事件,及时读取网络报文、处理并回复网络通信需求,及时外部IO请求。
这样的处理就叫做中断。
嵌入式MCU中内核CPU异常和各种外设工作都能够产生响应的中断,且通过中断控制器统一进行管理。
这样CPU在中断未产生时就可以专心处理顺序执行的任务,而只有在中断产生时才通过中断控制器中断CPU(通过产生一个高电平/低电平信号给CPU,这个过程被称为中断请求),如果此时CPU全局中断处于使能状态,则CPU会结合中断向量表和中。
ARM处理器的Boot与Remap于克兵,吕志明中国地质大学(北京),北京(100083)E-mail:yukebing555@摘要:以ARM为处理器的嵌入式系统,在进入操作系统之前需要执行一段初始化代码,叫做Boot。
它主要负责系统的初始化,包括:中断向量初始化、时钟初始化、MPU初始化、各种处理器模式的堆栈初始化和Image文件的RW段与ZI段的初始化。
处理器每次处理中断都要从非易失性存储器读中断向量表,Remap(重映射)操作可以把中断向量表映射到更快、更宽的RAM中,从而加快了启动速度和中断响应速度,也使更改中断向量表成为可能。
关键词:Boot,Remap,中断向量表,嵌入式系统中图分类号:TP368 文献标识码:A1.引言Boot的意思是“引导”,它是嵌入式系统上电或复位后处理器最开始执行的动作。
Boot 的作用是将处理器引导至操作系统的入口,但是在进入操作系统之前引导程序需要做一些必要的初始化。
这些初始化代码是操作系统在处理器上正常运行的必要条件,也是操作系统和硬件平台的连接纽带。
由于和硬件紧密相关,所以这部分代码一般采用ARM的汇编指令编程实现。
系统每次上电或复位后,处理器都会从0x0地址处取指,因此必须保证0x0地址处有可以正常执行的指令。
一般厂商会将中断向量表固化到ROM(或其它非易失性存储器)里,并将ROM的地址映射到0x0。
但是,为了加快启动速度和中断响应速度,也方便可以更改中断向量表,往往把向量表映射到RAM中。
但是中断向量表的开始地址是由ARM架构决定的,必须位于0x0处,因此,必须把RAM映射到0x0,这个过程就叫Remap。
2.Boot引导程序任何嵌入式系统都不可避免的用到Boot引导程序,引导程序是从系统上电到进入操作系统之前的一段初始化代码,本节将对这段初始化代码的各个组成部分进行说明,着重论述中断向量表与Image文件的分散加载。
2.1中断向量表一个完整的嵌入式系统必须具备异常中断处理能力。
选择题1、在嵌入式系统的存储结构中,存储速度最快的是( B )。
A.Cache B.寄存器组 C.Flash D.内存2、16位的2Mbit×4banks×16的SDRAM容量为( D )。
A.8MB B.32MB C.128MB D.16MB 3、以下说法正确的是( ABD )A.不需将软件引导到RAM中而是让其直接在NorFlash上运行,这种方式启动最快。
B.ARM9对I/O端口进行寻址采用的是存储器映射法。
C.NAND Flash的檫除和写入速度比NOR Flash慢。
D.Nand Flash的存储密度小于Nor Flash。
4、ADD R0,R0,#1 属于( D)。
♦A.基址变址寻址♦B.寄存器寻址♦C.寄存器间接寻址♦D.立即寻址5、()语句将存储器地址为R1的半字数据读入寄存器R0,并将R0的高16位清零。
♦A.LDR R0,[R1]♦B.STRH R0, [R1]♦C.LDRH R0,[R1]♦D.LDRB R0, [R1]6、在下列ARM微处理器的运行模式中,不属于异常模式的是(A )。
A.系统模式B.FIQC.IRQD.数据访问中止模式7、在ARM处理器中,(A )寄存器包括全局的中断禁止位,控制中断禁止位就可以打开或者关闭中断。
A.CPSRB.SPSRC.IPD.PC8、嵌入式系统应用软件一般在宿主机上开发,在目标机上运行,因此需要一个( B)环境。
A.分布式计算 B.交叉编译C.交互平台D.交互操作平台9、通常所说的32位微处理器是指(A )。
♦A.地址总线的宽度为32位♦B.通用寄存器数目为32个♦C.CPU字长为32位♦D.处理的数据长度只能为32位10、在ARM处理器的内部寄存器中,用作子程序连接寄存器的是(C )。
♦A.R12♦B.R13♦C.R14♦D.R15♦S3C2410芯片的I/O端口一共有几个?各端口各有几根I/O引脚?♦每个I/O端口有几个寄存器?有何作用?4、如何告诉汇编编译器下面的指令序列是ARM指令还是Thumb指令?回答:CODE16,CODE325、EQU伪指令相当于C语言的什么语句?回答:#define,用于为一个常量定义字符名称6、如何使用本源文件以外的符号?回答:IMPORT指示符告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号7、如何将本源文件的符号开放给外部源文件使用?回答:EXPRORT声明一个符号可以被其他文件引用。
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 中断嵌套技术在提高系统响应速度和资源利用率方面具有显著优势,但同时也带来了代码复杂度和系统稳定性方面的挑战。
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.中断服务程序的编写中断服务程序负责处理中断的具体逻辑。
当中断发生时,处理器会跳转到对应中断号的中断服务程序进行处理。
中断服务程序必须具有固定的格式和规范,以确保在中断发生时能正常执行。
中断服务程序的编写一般包括以下几个步骤:-保存寄存器状态:由于中断服务程序会暂时打断正在执行的程序,需要在进入中断服务程序时保存当前的寄存器状态,以便中断处理完成后能够正确恢复现场。
arm中断向量表中,只有一个IRQ向量地址,占4字节(另外还有一个FIQ向量地址),可是arm支持多个外部中断源,一个中断发生后,arm如何根据这一个向量地址找到相应的中断服务程序?这里要区分中断是向量中断还是非向量中断。
一个中断源对应一个中断号,对于不同的外部中断源根据处理方式不同分为向量中断和非向量中断。
向量中断:当中断为向量中断时,arm直接跳转到预先提供的中断服务程序执行,这种处理方式响应速度快。
非向量中断:当中断为非向量中断时,无论是什么外部中断源发出的中断,arm将跳到指定的一段程序执行(称为中断解析程序),在解析程序里,通过判断相应的中断状态寄存器找到对应的中断源,跳转到相应的中断执行程序。
有点类似软件中断的处理方式,但是软中断(SWI)与非向量中断不同,它的入口是0x0000,0008。
进入软中断后,系统变为管理模式。
而非向量中断入口是0x0000,0018。
它引导系统进入fiq/irq模式。
这种处理方式简单,但是要通过软件查询来判断具体的中断服务程序,所有延迟时间较长。
如何设置:系统在初始化的时候需要进行中断初始化,设置中断源是向量中断还是非向量中断。
设置方式举例如下:VICIntSelect = 0x00000000; //所有中断都是IRQVICVectCntl0 = 0x20 | 15; //将15号中断EINT1设置为向量中断,并且使用优先级0 VICVectAddr0 = (uint32)EINT1_Exception; //EINT1中断服务程序地址VICDefVectAddr = (uint32)Default_Entry; //其他的非向量中断默认的处理地址,其他非向量中断都会进入Default_Entry进行处理,在Default_Entry中获得具体的中断号再进行具体处理VICIntEnable = 0x00018000; //使能EINT1和EINT2由于在管理向量中断的VICVectCntl0~15和VICVectAddr0~15中只设置了EINT1,故EINT2中断发生时,要进入非向量中断处理程序Default_Entry。
STM8IAR中断向量表重映射分享STM8 IAP方法A:BOOT 项目里操作:1.把BOOT程序跟应用程序分两个项目编写2.在BOOT程序里最重要的是中断向量表重定向,icf文件就不用设置了(BOOT里不能开中断)中断向量表重定向设置方法代码如下:__root const long reintvec[]@".intvec"={ 0x82008080,0x82009004,0x82009008,0x8200900c, //当应用程序地址不是0x9000时则要相应改掉除第一个0x82008080以外的数值0x82009010,0x82009014,0x82009018,0x8200901c,0x82009020,0x82009024,0x82009028,0x8200902c,0x82009030,0x82009034,0x82009038,0x8200903c,0x82009040,0x82009044,0x82009048,0x8200904c,0x82009050,0x82009054,0x82009058,0x8200905c,0x82009060,0x82009064,0x82009068,0x8200906c,0x82009070,0x82009074,0x82009078,0x8200907c,};3.然后BOOT程序的跟一般程序一样编写通信协议及FLASH操作代码就行了,还有一点要记住,BOOT程序里不要开中断哦!这种方法缺点就是会浪费约128个字节的FLASH空间,如果有高手能把这些空间省下来,请指点哦!B:应用程序项目里操作:在应用程序项目里必须在icf文件修改,修改如下:把下面三行define region NearFuncCode = [from 0x8000 to 0xFFFF];define region FarFuncCode = [from 0x8000 to 0xFFFF];define region HugeFuncCode = [from 0x8000 to 0xFFFF];改为define region NearFuncCode = [from 0x9000 to 0xFFFF];define region FarFuncCode = [from 0x9000 to 0xFFFF];define region HugeFuncCode = [from 0x9000 to 0xFFFF];就可以了,应用程序就可以开中断了,IAP就是这么简单吧!当然我这里是用0x9000地址作为应用程序区的首地址,至于各位BOOT大小是多小就按不同的数值设置但是必须记得在BOOT的中断向量重定向表也必须要相应修改哦!解析下BOOT重定向表内的0x82008080为什么是这个数值:因为重定向表跟中断表重叠了,编译器就先分配重定向表,在接着的地址0x008080处,再分配一份中断向量表,所以其实是两份中断向量表,所以BOOT重定向表内的0x82008080就是为了要跳到真正的BOOT程序入口,因为在0x8080处才是真正跳转到__iar_program_start入口。
arm中断向量表的作用及工作原理
作用:
中断向量表在嵌入式系统和计算机体系结构中扮演着关键角色,其主要作用是存储了各个中断源对应的中断服务程序的入口地址。
当CPU接收到外部或内部产生的中断请求时,它会根据中断控制器传递过来的中断号,从预先定义好的中断向量表中查找到与该中断号对应的那个条目,这个条目中存放的就是ISR的地址。
工作原理:
1.中断触发:当一个中断事件发生时,硬件设备或内部逻辑会发出中断请求信号给中断控制器。
2.中断识别与优先级处理:中断控制器接收请求后,会按照优先级进行仲裁,确定最高优先级的中断并将其中断号发送给CPU。
3.中断响应:CPU停止当前执行的任务,保存现场,然后读取中断向量表中的相应位置。
4.跳转至ISR:根据中断号在中断向量表中找到对应的地址,并执行该地址处的指令,通常这个地址包含的是跳转指令,使得CPU 跳转到相应的中断服务程序的起始地址开始执行。
5.中断服务:ISR负责处理中断请求,执行相应的错误处理、数据交换或者任务调度等操作。
6.中断返回:当ISR执行完毕后,通过特定的指令序列恢复现场,清除中断标志位,并通过中断返回指令回到被中断的正常程序流程继续执行。
浅谈嵌⼊式软件开发之影响嵌⼊式MCU中断延迟(InterruptLatency)的因素总结内容提要引⾔(何为中断延迟)1. 存储中断向量表和中断ISR代码的存储器访问速度2. CPU内核Cache命中(hit)与否3. 中断ISR代码的复杂程度(是否需要压栈)4. 中断ISR代码的编译效率(⼯具链编译器的优化设置)5. 中断识别时间(外设中断事件发⽣到中断标志位置位)6. 中断优先级设置与中断嵌套配置7. CPU内核是否正使能硬件浮点数单元(FPU)引⾔(何为中断延迟)经常有客户和公众号的读者问我关于嵌⼊式MCU中断延迟(Interrupt Latency)相关的问题。
所谓嵌⼊式MCU的中断延迟,是指MCU外设发⽣中断事件(⽐如定时器溢出,CAN报⽂接收完成,DMA传输错误等),到CPU内核执⾏相应中断事件中断服务程序(ISR)第⼀条指令/做出相应事件的响应动作所花费的时间。
下⾯,本⽂就此问题,结合作者多年的嵌⼊式MCU开发经验,对影响嵌⼊式MCU中断延迟(Interrupt Latency)的因素进⾏了⼀个全⾯的归纳和总结,希望对⼤家有所启发和帮助。
1. 存储中断向量表和中断ISR代码的存储器访问速度当外设中断被内核的中断控制器(⽐如KEA/S32K系列MCU使⽤的ARM Cortex-M的NVIC和Qorivva MPC56/57xx效率MCU使⽤的Power e200系列内核的INTC中断控制器)识别后,CPU内核会⾸先从中断向量表中读取相应中断的中断向量(即中断ISR函数地址)到内核PC指针,从⽽快速跳转到中断ISR函数执⾏。
若存储中断向量表和中断ISR的存储器,⽐如Flash访问速度不够快,则CPU内核需要等待若⼲内核时钟周期才能拿到中断向量和中断ISR函数代码指令,从⽽将增加MCU的中断延迟时间。
因此,将MCU的CPU内核中断向量表重定向(remap/relocate)到SRAM中,并将关键(频繁发⽣)的内核异常和外设中断ISR拷贝到SRAM中执⾏,可以避免此类中断延迟。
nvic_init函数解读-回复题:nvic_init函数解读导言:在嵌入式系统开发中,中断是一种常用的事件触发机制,可用于处理实时性要求较高的任务。
nvic_init函数是在ARM架构下的嵌入式系统中用于初始化中断控制器(NVIC)的函数。
本文将深入探讨nvic_init函数的工作原理和使用方法,并逐步分析其具体实现细节。
第一部分:中断控制器简介1.1 中断的概念和作用中断是计算机中的一种事件响应机制,可以打断CPU当前操作的执行,转而处理预先定义好的中断事件。
它可以是硬件触发的,如外部设备的中断请求信号;也可以是软件触发的,如软件中断或异常。
中断机制的主要作用是提高系统的响应速度和实时性。
当系统接收到中断请求时,会立即保存当前的现场状态,然后跳转到中断服务程序中执行相关的处理,待处理完成后,再恢复先前的现场状态,继续执行之前的任务。
1.2 中断控制器的作用和结构中断控制器是一种用于管理和响应中断事件的硬件设备。
它负责接收和识别中断请求,并将对应的中断信号发送给CPU。
中断控制器通常由多个中断源和中断优先级判定逻辑组成。
ARM架构下的nvic_init函数用于初始化中断控制器(NVIC),主要完成中断优先级的设置和中断使能的配置。
第二部分:nvic_init函数的实现2.1 函数原型和参数说明- 原型:void nvic_init(void)- 参数:无2.2 函数的作用和工作原理nvic_init函数主要用于初始化中断控制器(NVIC)。
它会根据用户给定的中断优先级、中断使能状态等配置信息,对相应的中断源进行初始化设置。
具体工作流程如下:- 读取用户配置的中断优先级和中断使能状态;- 根据配置信息,设置中断向量表基地址、中断优先级和中断使能状态;- 将配置信息写入对应的中断控制寄存器,完成中断控制器的初始化设置。
2.3 中断优先级的设置中断优先级是中断处理的重要参考标准,用于区分不同中断的紧急程度。
鉴于 ARM 内核微办理器的系一致般为复杂的片上系统,这种复杂系统的多半硬件模块都是可配置的,需要软件设置为特定的工作状态,所以在用户的应用程序以前,需要有一些特意的代码达成对系统的初始化。
因为这种代码直接面对ARM 办理器内核和硬件控制器,一般都使用汇编语言达成。
初始化代码达成的操作与拥有的硬件平台有关,但一般包含一下的内容:--初始化异样向量表(中断向量表)--初始化储存器系统--初始化货仓--初始化有特别要求的端口和设施--初始化应用程序的运转环境--调用主应用程序1、初始化异样向量表(中断向量表)ARM 微办理器构造要求中断向量表一定搁置在从 0x00 地点开始的连续 8×4 字节的空间内,每当一此中断(异样)发生此后, ARM 微办理器便强迫把 PC 置为对应的中断向量。
因为每此中断只占用向量表中一个字( 4 个字节)的储存空间,只好放一条 ARM 指令,所以往常为跳转指令,使程序从向量表跳转到储存器的其余地点,履行真实的中断办理。
详细代码实现以下:AREA Init,CODE,READONLY //初始化ENTRYB Reset_Handler //异样复位B Undef_Handler //不决义指令异样B SWI_Handler //软件中断B PreAbort_Handler //指令预取中断B DataAbord_Handler //数据中断B. //系统保存B IRQ_Handler //一般外面中断B FIQ_Handler //迅速外面中断..........2、初始化储存器系统主假如对系统储存器控制器( MMU )的初始化。
因为储存器控制器其实不是 ARM 架构的一部分,不一样芯片的实现方式各不同样。
因为运算能力和寻址能力的强大,鉴于 ARM 内核的微办理器系一致般都需要外扩展各样种类的储存器。
关于储存器系统的初始化一般包含以下几个方面:--储存器种类、时序和总线宽度的配置--储存器地点的配置(1)储存器种类鉴于 ARM 微办理系统的储存器一般有以下几类: SARM,DRAM,Flah, 同时,即便同类储存器也有接见速度上的不一样。
STMNVIC中断向量表设置以及ETI中断寄存器设置NVIC中断向量表设置以及EXTI中断寄存器设置⼀、开始中断的步骤A.端⼝设置。
这⾥包括了输⼊引脚的设置,务必记得打开GPIO的时钟和AFIO的时钟信号B.中断寄存器的设置C.NVIC中断向量寄存器的设置。
这⾥关键点有优先级分组设置以及中断⼊⼝地址的设置D.中断函数的书写⼆、具体设置1、端⼝设置void GPIOA_init(void){GPIO_DeInit(GPIOA);RCC->APB2ENR |= 0X00000005;GPIOA->CRL &= 0XFFFFFF00;GPIOA->CRL |= 0x00000038;GPIOA->ODR = 0X00000000;GPIOA->ODR |= 0X00000001;AFIO->EXTICR[0] |= 0X00;}a.在对端⼝进⾏任何操作之前,必须打开对应的时钟信号,其设置才能⽣效。
这⾥使⽤了GPIOA.00端⼝作为中断0输⼊,作为输⼊时⼀般我们设置为上拉输⼊,如果要设置成浮空输⼊的话,外部⼀定要加上拉电阻,这样对于过滤输⼊波动很有益处(假设在电压在3.3-2.0之间进⾏波动,时间上没尝试按键操作,因为⼀旦有按键,就应该为0,那么接了上拉的话,除⾮产⽣了低电平,否则⼩波动都会被拉⾼过滤掉)b.复⽤端⼝时钟信号的开启这⾥需要特别注意的是因为我们要对复⽤端⼝寄存器进⾏操作,所以必须打开复⽤端⼝寄存器时钟c.AFIO->EXTICR[0] |= 0X00 ,EXTICR(External interrupt configuration register)即外部中断配置寄存器。
因为所有的外部中断输⼊来源都是经由GPIO⼝输⼊的,所以我们需要选择哪⼀个中断是经由那个IO⼝输⼊的。
我所写的这条代码的意思是EXTI0的中断来源为GPIOX_0⼝输⼊。
图1从寄存器配置中我们可以看到每个中断由四位配置,那么STM32总计有16个外部中断(具体参照STM32参考⼿册P133页),因此EXTIR有四组,在书写时要注意。
嵌入式-中断实验
嵌入式中断实验是一种用来测试和学习嵌入式系统中断功能的实验。
中断是嵌入式系统中常用的一种机制,用于处理紧急事件或高优先级任务。
通过中断,系统可以立即响应外部事件,中断当前正在执行的任务,执行与中断事件相关的代码,然后返回到原来的任务中继续执行。
在进行中断实验时,通常需要以下步骤:
1. 确定中断源:确定要模拟的中断事件,比如外部输入的触发事件、定时器到达时间等。
2. 配置中断控制器:根据硬件平台和实验要求,配置中断控制器的相应寄存器,使其能够正确地处理中断信号。
3. 编写中断服务程序(ISR):定义一个中断服务程序,用于
处理中断事件。
ISR应当对事件进行必要的处理,然后返回到
原来的任务中。
4. 测试和调试:连接硬件平台,运行实验程序,并进行测试和调试,确保中断功能正常工作。
5. 扩展和优化:根据需要,可以进一步扩展和优化中断功能,比如增加多个中断源,实现优先级控制,提高系统响应速度等。
通过嵌入式中断实验,可以深入了解中断机制的工作原理和应用方法,提高对嵌入式系统的理解和能力。