1、中断是什么
中断指的是在设备运行过程中,当某个事件或条件发生时,处理器能够暂停当前正在执行的程序,转而执行一段特定的代码(称为中断服务程序或中断处理程序),以响应这个事件或条件。中断处理完成后,处理器将返回到被中断的程序中继续执行。
中断的主要目的是提高系统的响应能力和处理效率。通过中断机制,嵌入式系统可以实时地响应外部设备或内部状态的变化,而无需轮询或等待这些变化的发生。这使得嵌入式系统能够更加灵活地处理各种任务,并在需要时立即采取行动。
中断关键要素
-
中断源:触发中断的源头,可以是外部设备(如按键、传感器、定时器等)或内部事件(如除零错误、软件指令等)。
-
中断请求:当中断源检测到特定事件或条件时,会向处理器发送中断请求信号。这个信号通常通过特定的硬件引脚或中断线传输到处理器。
-
中断优先级:处理器可能同时接收到多个中断请求,因此需要根据中断的优先级来决定先处理哪个中断。优先级高的中断会先得到处理。
-
中断向量表:处理器内部或外部存储的一个表,用于存储中断服务程序的入口地址。当中断发生时,处理器会根据中断类型查找中断向量表,找到对应的中断服务程序的入口地址,并跳转到该地址执行。
-
中断服务程序:一段特定的代码,用于处理中断请求。中断服务程序会执行与中断源相关的操作,如读取外部设备的数据、更新内部状态等。处理完成后,中断服务程序会执行中断返回指令,使处理器返回到被中断的程序中继续执行。
-
中断屏蔽:处理器提供了一种机制来屏蔽某些中断请求,以避免不必要的中断干扰。通过设置中断屏蔽位,可以禁用或启用特定的中断源。
中断分类
外部中断(External Interrupts):
- 由外部设备或信号触发的中断。例如,按钮被按下、串口接收到数据等。
- 这些中断通常通过中断控制器(如GIC、VIC等)进行管理,并映射到CPU的特定中断号上。
内部中断(Internal Interrupts):
- 由CPU内部事件触发的中断。这些中断通常与CPU的执行状态或内部硬件功能有关。
- 例如,定时器到期中断、软件触发的中断(如通过软件指令产生的中断)等。
异常中断(Exception Interrupts):
- 这类中断通常不是由外部设备或信号触发的,而是由CPU在执行指令时遇到的异常情况引起的。
- 例如,除数为零错误、地址越界、指令未定义等异常条件会导致CPU进入异常中断处理程序。
系统调用中断(System Call Interrupts):
- 在裸机环境中,虽然不常见操作系统层面的系统调用,但类似的概念可以通过软件中断(如SVC、SWI等)来实现。
- 这些中断允许用户程序请求操作系统(在裸机环境中可能是由用户自己管理的低级服务)执行某些操作。然而,在纯粹的裸机环境中,这种中断可能由用户自定义的服务例程来处理。
常用中断
I/O中断:来自外部设备通道的中断。
当外部设备(如磁盘、打印机等)完成其操作或需要CPU进行干预时,会向CPU发送中断信号。
程序性中断:由运行程序本身的问题引起的中断,如溢出、缺页中断、缺段中断、地址越界等。
当程序执行到某条机器指令时,可能出现各种问题,如定点操作数溢出、除数为0、地址越界等,这些情况都会导致程序性中断。
时钟中断:由定时时钟触发的中断。
用于实现操作系统的时钟管理,如时间片轮转调度、定时任务处理等。
控制台中断:由控制台(如键盘、鼠标等)输入触发的中断。
用户通过控制台输入指令或数据时,会产生控制台中断,以便CPU及时响应。
硬件故障中断:由硬件故障引起的中断。
当硬件设备发生故障时,会向CPU发送中断信号,以便操作系统进行故障处理。
执行I/O操作:如读写磁盘、打印机等。
创建进程:当用户需要创建新的进程时,会触发访管中断。
分配内存:当用户需要为程序分配内存时,会触发访管中断。
信号量操作:在进程同步和互斥中,信号量的操作(如P操作、V操作)会触发访管中断。
发送/接收消息:在进程间通信中,发送和接收消息会触发访管中断。
2、单片机中断原理是什么
当中断发生时,CPU会根据中断向量表中的中断向量找到对应的中断服务程序地址,并开始执行中断服务程序。中断服务程序处理完中断事件后,会返回到被中断的程序继续执行。
3、中断用在什么地方
1. 定时器中断
应用场景:定时器中断是单片机中最常用的中断功能之一。通过定时器中断,可以实现定时器的定时功能,并在特定的时间点执行相应任务。例如,可以使用定时器中断来实现精确的延时功能,或者定时获取某种数据等。定时器中断广泛应用于各种计时、测速、调度等场景。
优点:定时器中断能够提高系统的实时性和响应速度,确保任务在预定的时间点准确执行。
2. 外部中断
应用场景:外部中断用于处理外部事件,如按键触发、传感器信号等。在单片机中,常见的外部中断如INT0和INT1,它们分别对应于特定的引脚。当这些引脚的状态发生变化时,可以触发相应的外部中断,从而执行中断服务程序。
优点:外部中断允许单片机实时响应外部事件,提高了系统的交互性和响应速度。
3. 串口中断
应用场景:串口中断用于处理串口通信的数据接收和发送。在单片机中,串口通信常用的是UART(通用异步收发器)。通过设置相应的中断使能位,可以实现串口接收数据时的中断处理。这样,当数据到达时,单片机可以立即进行处理,而无需轮询串口接收缓冲区。
优点:串口中断有效减少了系统资源的占用,提高了系统的响应速度和效率。
4、中断如何使用(stm32为例)
定时器中断
1. 定时器选择与时钟配置
2. 定时器初始化
3. 使能定时器中断
4. 编写中断服务函数和回调函数
5. 启动定时器
按键中断
先GPIO引脚的引脚使能,初始化gpio,配置需要使用国的gpio引脚,如按键1,GPIO_PIN_4,模式设为中断下降沿模式,上下拉为上拉。这里通过HAL_NVIC_SetPriority函数设置中断优先级,HAL_NVIC_EnableIRQ函数使能中断。
重定义中断向量表中对应的中断函数 EXTI4_IRQHandler,在其内部调用中断处理函数HAL_GPIO_EXTI_IRQHandler,这个函数会调用中断回调函数(重定义函数)HAL_GPIO_EXTI_Callback,自己在内部写入回调操作即可。
主函数调用相关初始化函数。
串口中断
1. 初始化串口
2. 启动中断接收或发送
3. 编写中断回调函数
5、FreeRTOS里的中断
在FreeRTOS中,中断除了上面的一些作用,还可以用来任务调度,具体需要了解Free RTOS中的任务调度器(Scheduler)和中断服务例程(ISR)。
在FreeRTOS中,如果中断跳转的任务优先级比当前任务优先级低,任务调度器通常不会立即跳转任务。这是因为FreeRTOS采用的是基于优先级的抢占式调度策略。
在FreeRTOS中使用中断
1. 中断配置
中断优先级分组:
-
ARM Cortex-M系列处理器支持中断优先级分组,FreeRTOS通常建议使用分组4(NVIC_PriorityGroup_4),即所有8位中断优先级寄存器的高4位用于设置抢占优先级,低4位保留不用。这样做可以简化中断优先级管理,使每个中断只有一个抢占优先级。
中断优先级设置:
-
使用FreeRTOS时,需要为PendSV(上下文切换)和SysTick(任务调度)中断设置较低的优先级,以确保它们不会干扰其他高优先级的中断和任务。
NVIC配置:
-
使用NVIC(嵌套向量中断控制器)来配置中断的使能、优先级等属性(将isr放在中断向量表里)。FreeRTOS本身不直接管理中断的硬件级配置,但提供了接口或宏定义来帮助用户进行配置。
2. 编写中断服务例程(ISR)
ISR的定义:
-
中断服务例程(ISR)是一个在中断发生时由硬件自动调用的函数。在FreeRTOS中,用户需要定义这些函数来处理特定的中断事件。
ISR的编写:
-
ISR应该尽可能简短,只进行必要的处理,如清除中断标志、唤醒等待的任务等。复杂的处理应该放在任务中执行。
FreeRTOS API的调用:
-
在ISR中,通常不建议直接调用FreeRTOS的API函数,因为这些函数可能不是可重入的。但是,FreeRTOS提供了
FromISR
后缀的API函数,这些函数可以在ISR中安全地调用。
3. 中断与任务之间的通信
通信机制:
-
FreeRTOS提供了多种机制来实现中断与任务之间的通信,如消息队列、信号量、任务通知(只可以发送)或事件标志组等。
示例流程:
-
任务运行:主任务在运行时等待某个事件或条件。
-
中断发生:当外设或内部事件触发中断时,CPU跳转到ISR执行。
-
ISR处理:ISR执行必要的处理,如清除中断标志,并通过FreeRTOS提供的通信机制(如发送信号量或消息)通知任务。
-
任务响应:任务接收到中断通知后,执行相应的处理逻辑。
4. 注意事项
-
中断嵌套:FreeRTOS允许中断嵌套,即高优先级的中断可以打断低优先级的中断。但是,需要确保中断处理程序的健壮性,以避免死锁或优先级反转等问题。
-
中断延迟:中断处理应该尽可能快,以避免造成系统响应延迟。对于耗时较长的处理,应该将其放在任务中执行。
-
临界区保护:在ISR中访问共享资源时,需要确保使用临界区保护机制来避免数据竞争或不一致。