中断配置及使用
单片机外部中断原理及应用

单片机外部中断原理及应用单片机是一种集成电路,可以执行特定任务的微型计算机。
它被广泛应用于各种电子产品中,如电视机、洗衣机、空调等。
为了提高单片机的灵活性和扩展性,可以通过外部中断来实现对特定事件的响应。
本文将探讨单片机外部中断的原理及其应用。
一、单片机外部中断的原理外部中断是指当某个特定的事件发生时,使单片机将正常的程序执行中断,转而去执行与该事件相关的程序。
在单片机中,外部中断信号通过引脚同内部中断控制电路相连。
当引脚的电平发生变化时,中断控制电路就会引起一个中断请求。
接下来,我们将详细介绍外部中断的工作原理。
1.引脚配置:首先,需要将外部中断所连接的引脚配置为中断引脚。
这通常是通过配置相应的寄存器来实现的。
具体的配置方法可能因不同的单片机而有所不同。
2.中断优先级:各个外部中断的优先级需要正确地设置。
当多个中断请求同时发生时,单片机应该按照设定的优先级执行相应的中断程序。
3.中断屏蔽:有时,我们可能不希望某些中断请求引起中断。
在这种情况下,可以设置相应的中断屏蔽。
屏蔽某个中断请求后,单片机将不会对该请求进行响应。
4.中断触发方式:外部中断可以基于边沿触发或电平触发。
在边沿触发中断中,中断请求的触发方式可以为上升沿触发、下降沿触发或双边沿触发;而在电平触发中断中,中断请求的触发方式可以为高电平触发或低电平触发。
5.中断服务程序:当发生中断时,单片机将会执行与该中断相关的中断服务程序。
中断服务程序是一段特定的代码,用于处理中断事件。
二、单片机外部中断的应用外部中断在单片机的应用中起到了关键作用。
通过外部中断,单片机可以及时响应外部事件,并执行相应的处理程序。
下面将以一个具体的应用场景来说明外部中断的应用。
假设我们正在设计一款智能家居系统,该系统可以通过远程控制来控制家中的灯光。
我们使用一个红外遥控器来发送控制码,单片机则通过外部中断来接收红外信号并解码。
1.硬件连接:将红外接收模块连接到单片机的外部中断引脚上。
串口收发 中断配置函数 usart1_irqhandler

函数原型:void USART1_IRQHandler(void)功能:处理 USART1 中断请求,包括接收和发送中断。
中断配置步骤:1.确定 USART1 中断向量号:这通常在芯片手册中指定,例如在 STM32F103系列中为IRQ_USART1。
2.在中断向量表中启用 USART1 中断:在中断向量表中将 USART1 中断向量号指向USART1_IRQHandler函数。
可以在启动代码中或使用函数NVIC_EnableIRQ()来完成此操作。
3.配置 USART1 中断优先级:使用函数NVIC_SetPriority()设置 USART1 中断的优先级。
优先级较高的中断将在低优先级中断之前得到响应。
4.配置 USART1 中断屏蔽:使用函数USART_ITConfig()或寄存器USART_CR1->RXNEIE和USART_CR1->TXEIE来配置 USART1 的接收(RXNE)和发送(TXE)中断。
中断服务例程:USART1_IRQHandler函数是 USART1 中断服务例程,它将在 USART1 发生中断时执行。
该函数通常会检查中断标志寄存器USART_SR中的标志位,以确定中断源并相应地采取操作。
以下是一个处理 USART1 接收和发送中断的示例中断服务例程:void USART1_IRQHandler(void){// 检查接收中断标志if(USART_GetITStatus(USART1, USART_IT_RXNE)!= RESET){// 读取接收数据uint8_t data = USART_ReceiveData(USART1);// 处理接收到的数据}// 检查发送中断标志if(USART_GetITStatus(USART1, USART_IT_TXE)!= RESET){// 发送数据USART_SendData(USART1, data);// 禁用发送中断(发送数据后)USART_ITConfig(USART1, USART_IT_TXE, DISABLE);}}。
嵌入式中断按键实验报告

嵌入式中断按键实验报告本实验的目的是学习如何在嵌入式系统中使用中断来处理按键输入。
通过该实验,我们可以掌握如何配置和使用中断,以及如何编写中断服务程序来处理按键输入。
实验材料:1. 嵌入式开发板2. 按键模块3. 电源适配器实验步骤:1. 将按键模块连接到嵌入式开发板的GPIO引脚上,确保连接正确。
2. 打开开发板的开关,给开发板供电。
3. 在开发板上配置GPIO引脚作为中断输入,并使能中断。
4. 编写中断服务程序来处理按键输入。
当按键被按下时,中断服务程序将被调用,并执行相应的操作。
5. 在主程序中初始化中断服务程序,并进入一个无限循环。
在该循环中,可以进行其他的操作,并等待按键中断的发生。
实验结果:在实验中,我们成功地配置并使用了中断来处理按键输入。
当按键被按下时,中断服务程序被调用,并执行了相应的操作。
讨论与分析:通过该实验,我们学习到了中断的基本原理和使用方法。
中断是一种非常重要的机制,可以使嵌入式系统更高效地响应外部事件。
在实际的嵌入式应用中,按键输入是非常常见的操作,使用中断可以很好地处理按键输入,提高系统的响应速度和可靠性。
然而,中断也存在一些问题。
首先,中断处理需要一定的时间,在高速的系统中,中断的处理时间可能会影响到系统的性能。
另外,当系统存在多个中断源时,中断处理的优先级和调度也需要仔细设计,以确保系统的正常运行。
总结:通过本实验,我们成功地学习了嵌入式系统中使用中断处理按键输入的方法。
中断是一种重要的机制,可以使系统更高效地响应外部事件。
通过合理地设计和使用中断,可以提高系统的性能和可靠性。
在实际的嵌入式应用中,我们应该根据具体的需求和系统条件来选择最合适的中断处理方法,并进行适当的优化和调试。
cubemx定时器中断函数

cubemx是一款用于STM32微控制器的图形化配置工具,它可以帮助开发人员快速、方便地生成代码框架。
在使用cubemx进行定时器中断函数的配置时,需要遵循一定的步骤和注意事项,下面将详细介绍cubemx定时器中断函数的配置方法。
一、打开cubemx工具打开cubemx工具,并选择对应的STM32微控制器型号。
在“Peripherals”选项卡中找到定时器模块,点击“TIM”进行配置。
二、配置定时器参数在定时器配置页面,可以设置定时器的时钟源、计数模式、分频系数等参数。
需要根据具体的应用场景来确定这些参数的取值。
值得注意的是,如果需要使用中断功能,需要勾选“中断”选项,并且选择“更新事件”或者其他需要中断的事件类型。
三、生成代码配置完成后,点击“Project”菜单中的“Generate Code”选项,cubemx会自动生成相应的初始化代码,并将其添加到工程中。
四、编写中断服务函数在生成的代码中,会自动生成定时器中断服务函数的框架,开发人员需要根据实际需求来编写中断服务函数的具体内容。
中断服务函数通常包括清除中断标志位、处理中断事件等操作。
五、使能定时器中断需要在主函数中启用定时器中断,在m本人n.c文件中调用HAL_TIM_Base_Start_IT函数来启用定时器中断功能。
以上就是使用cubemx配置定时器中断函数的基本步骤,开发人员在实际应用中可以根据具体的需求对定时器中断函数进行更详细的配置和优化,以满足实际应用的要求。
希望本文能帮助开发人员更好地掌握cubemx定时器中断函数的配置方法。
在实际的嵌入式系统开发中,定时器中断函数的配置和优化可以极大地影响系统的性能和稳定性。
开发人员需要深入了解定时器中断函数的相关知识,并在实际的项目中灵活应用。
下面将继续扩展讨论使用cubemx进行定时器中断函数的更详细配置和优化。
一、定时器中断优化在配置定时器中断函数时,需要注意一些优化的技巧,以提高系统的效率和响应速度。
中断函数使用说明

中断函数使用说明:
中断函数语法:
attachInterrupt(中断通道, 中断函数, 触发方式);
中断通道如下图所示:
中断函数:
在程序中自己定义的函数,中断后需执行的函数。
触发方式:
触发方式有以下几种
LOW 低电平触发
CHANGE 电平变化,高电平变低电平、低电平变高电平
RISING 上升沿触发
FALLING 下降沿触发
HIGH 高电平触发(该中断模式仅适用于Arduino due)
在定义中断函数后,要使用外部中断,你只需要在程序的Setup部分配置好中断函数即可,配置函数如下:
attachInterrupt(interrupt, function, mode);
interrupt为中断通道编号,function为中断函数,mode为中断触发模式
需要注意的是在Arduino Due中,中断设置有点不同:
attachInterrupt(pin, function, mode); //due 的每个IO均可以进行外部中断,所以这里第一个参数为pin,即你使用的引脚编号。
如果在程序中途,你不需要使用外部中断了,你可以用中断分离函数detachInterrupt(interrupt );来取消这一中断设置。
同样在Arduino Due上,该函数为detachInterrupt(interrupt );。
官方例程如下:。
单片机中断系统详细教程

单片机中断系统详细教程一、中断系统的原理中断系统是一种异步事件响应机制,它允许设备在正常程序运行的过程中插入一个特殊事件,中断请求触发后,处理器即刻中断当前程序的执行,执行特定的中断服务程序,完成对事件的处理。
其流程如下:1.当外设需要处理器响应时,会向处理器发送中断请求信号,通常为一个引脚的高电平触发。
2.处理器在接收到中断请求信号后,暂停当前的程序执行,保存当前现场(保存中断发生时的CPU状态),并进入中断服务程序执行,执行完成后再返回到原来的程序继续执行。
二、中断系统的使用方法1.初始化中断控制器:对中断向量表进行初始化,设置中断优先级等。
2.配置外设的中断请求触发方式:设置外设的中断触发方式,包括电平触发和边沿触发。
3.编写中断服务程序:根据需要,编写中断服务程序来处理中断事件。
4.启动中断系统:启动中断系统,使处理器能够响应外设的中断请求。
三、中断系统的实例下面以8051单片机为例,演示如何使用中断系统。
1.初始化中断控制器使用8051单片机的中断系统,首先需要初始化中断控制器,设置中断向量表和中断优先级。
具体步骤如下:```cvoid init_interrup//设置中断向量表EA=1;//打开总中断使能ET0=1;//打开定时器0中断EX0=1;//打开外部中断0EX1=1;//打开外部中断1//设置中断优先级IP=0x10;//设置定时器0中断为高优先级P3=0x0F;//设置外部中断0和中断1为低优先级```2.配置外设的中断请求触发方式在8051单片机中,外部中断0和中断1的触发方式可由用户进行配置,可以选择为低电平触发或上升沿触发。
例如,将外部中断0配置为上升沿触发:```cvoid init_external_interrupIT0=1;//设置外部中断0为边沿触发方式(上升沿触发)EX0=1;//打开外部中断0使能```3.编写中断服务程序根据需要,编写相应的中断服务程序来处理中断事件。
stm32刹车中断的用法
stm32刹车中断的用法STM32刹车中断的用法一、引言在STM32单片机应用中,刹车功能是非常重要的,特别是在需要实现高精度控制的应用中,如电机控制、机器人等。
为了实现有效刹车操作,STM32提供了刹车中断功能。
本文将一步一步回答如何使用STM32刹车中断的问题,并介绍其中的重要知识点和注意事项。
二、刹车中断概述刹车中断是STM32单片机上的一种特殊的中断方式,用于在需要刹车操作时,及时中断当前的程序执行,并进行刹车操作。
刹车中断可以响应外部的刹车触发信号,根据配置的中断优先级,及时中断当前的任务。
三、刹车中断的配置步骤下面我们将一步一步来介绍如何配置STM32的刹车中断。
1. 硬件连接首先,需要将外部的刹车触发信号连接到STM32单片机的相应引脚。
确保引脚连接正确,以便触发中断。
2. 中断优先级设置刹车中断可能与其他中断并存,所以需要设置中断优先级。
在STM32开发环境中,可以通过寄存器来设置中断优先级。
首先确定中断的优先级级别,然后设置相关的寄存器。
3. 中断触发方式设置刹车中断可以根据不同的触发方式进行配置,常见的有边沿触发和电平触发。
边沿触发分为上升沿触发和下降沿触发,在中断配置中需要指定具体的触发方式。
4. 中断服务程序编写刹车中断触发后,需要执行相应的中断服务程序,即处理刹车操作。
在编写中断服务程序时,需要考虑到刹车的具体需求,包括刹车类型(硬刹车还是软刹车)、刹车力度等。
5. 中断使能最后,需要将刹车中断使能,确保刹车触发后可以中断当前的任务,并执行相应的中断服务程序。
通过寄存器设置可以实现中断使能。
四、刹车中断的重要知识点和注意事项在使用STM32刹车中断时,需要注意以下几个方面的问题。
1. 中断优先级冲突由于STM32单片机上可以同时存在多个中断,不同的中断可能具有不同的优先级。
在进行中断配置时,需要避免中断优先级冲突,避免不必要的中断屏蔽等问题。
2. 中断服务程序的执行时间刹车中断服务程序应尽量保持执行时间短,以避免影响其他任务的执行。
简要叙述中断优先级的配置方法
简要叙述中断优先级的配置方法
中断优先级的配置方法:
中断优先级是指当多个中断同时发生时,处理器按照一定的优先级顺序来处理这些中断。
中断优先级的配置可以通过以下步骤实现:
1. 确定所有可能出现的中断类型及其优先级。
2. 在系统初始化时,设置每个中断的优先级。
通常情况下,越重要的中断应该设置为较高的优先级。
3. 在编写中断服务程序时,需要根据具体情况使用适当的屏蔽和开启中断指令来控制不同中断之间的优先级关系。
例如,在处理高优先级中断时,需要屏蔽低优先级中断以避免干扰。
4. 如果系统支持动态改变中断优先级,则可以在运行过程中根据需要进行调整。
但是,这种操作需要非常谨慎,因为不正确的操作可能会导致系统崩溃或数据损坏等问题。
总之,合理配置和管理中断优先级对于保证系统稳定性和可靠性非常
重要。
因此,在进行相关操作时应该仔细分析和评估各种因素,并采取适当措施来确保系统正常运行。
exti是什么在使用中的具体流程是什么
Exti是什么?在使用中的具体流程是什么?1. 引言在软件开发领域中,中断(Interrupt)是一种用于打断正常程序运行的机制,通常用于处理紧急事件和实时任务。
Exti(External interrupt)是一种外部中断机制,适用于很多微控制器。
在本文档中,我们将介绍Exti是什么,以及在使用中的具体流程。
2. Exti的概述Exti是一种外部中断机制,它允许外部设备(例如传感器或按键)通过硬件信号触发中断,以便及时响应外部事件。
通过使用Exti,我们可以在程序执行期间立即处理外部事件。
使用Exti能够提高系统的实时性和响应能力。
3. Exti的具体流程下面是使用Exti的一般流程:3.1. 引入相关库在使用Exti之前,我们需要引入相关的库文件。
这些库文件通常由硬件供应商提供,并包含有关Exti的函数和常量定义。
3.2. 配置中断引脚在使用Exti之前,我们需要配置相应的引脚作为中断输入。
这通常需要在芯片级别的寄存器中设置引脚的模式和触发方式。
例如,我们可以选择上升沿触发、下降沿触发或双边沿触发。
3.3. 设置中断优先级如果系统中存在多个中断源,我们需要为每个中断源设置优先级。
这可以通过修改寄存器中的中断优先级位实现。
根据需求,我们可以将某些中断源的优先级设置为更高,以确保及时处理紧急事件。
3.4. 编写中断服务函数中断服务函数是用于处理中断事件的函数。
当外部事件触发时,处理器将自动跳转到中断服务函数,并在中断结束后返回到先前的执行点。
在中断服务函数中,我们可以编写自定义的事件处理代码,以响应外部事件。
3.5. 注册中断服务函数在使用Exti之前,我们需要将自定义的中断服务函数注册到系统中。
注册的过程通常包括向硬件注册表中写入函数指针,并启用中断源。
3.6. 启用中断在所有配置完成后,我们可以通过使能相应的中断源来启用中断。
一旦中断被启用,当外部事件触发时,处理器将立即跳转到中断服务函数,以处理相应的事件。
c语言interrupt用法
c语言interrupt用法在C语言中,可以使用中断(interrupt)来处理硬件设备的事件或特定的软件事件。
中断是一种硬件或软件产生的信号,它会打断当前正在执行的程序,并立即转移控制权到一个特定的中断处理程序。
以下是使用中断的一般步骤:1. 定义中断处理程序:- 中断处理程序是一个函数,用于处理中断事件。
- 可以使用关键字```__interrupt```或特定的中断修饰符(例如```__attribute__((interrupt))```)来标识该函数为中断处理程序。
- 通常,中断处理程序应该是短小、高效的,并尽量避免执行耗时操作。
2. 配置中断向量表:- 中断向量表是一个数据结构,用于将中断向量号(中断号)映射到相应的中断处理程序。
- 可以使用特定的语法来配置中断向量表,以确保当发生中断时,正确的中断处理程序被调用。
3. 初始化中断:- 在程序的初始化阶段,需要配置相关的硬件设备或设置相应的标志位,以启用或禁用中断。
- 通常,需要设置相关的中断控制器(例如PIC、NVIC)来使能或禁用特定的中断或中断源。
4. 处理中断:- 当中断事件发生时,硬件会自动触发中断,并将控制权转移到相应的中断处理程序。
- 在中断处理程序中,可以执行与中断相关的操作,例如读取中断源的数据、清除中断标志位、保存上下文等。
- 处理完中断事件后,可以使用特定的指令(例如```return from interrupt```)来返回到被中断的程序继续执行。
需要注意的是,中断处理程序应该尽量简洁高效,并且对共享资源(如全局变量)进行适当的保护,以避免竞态条件和数据不一致等问题。
此外,合理的中断优先级设置也非常重要,以确保高优先级的中断能够及时响应并处理。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中断的配置及使用
龙芯3系列IP引脚
Pmon和内核的接口规范中规定3号系列IP引脚的使用方式如下
目前内核中使用的IP引脚包括:
IP2: UART/LPC中断引脚;
IP3: HT上i8259的南桥中断引脚;
IP6: 核间中断引脚;
IP7: mips时钟中断引脚,中断号63;
中断引脚在板卡布线时已经确定,在龙芯3号系列的板卡上,按上表约定。
龙芯3A处理器内、外部中断
龙芯处理器核casuse寄存器上IP0-IP7 8个位域,龙芯内部中断有:
IP2:UART/LPC中断;
IP7:对应mips内部时钟中断、性能计数器中断;
IP6:核间中断,龙芯4个处理器核之间相互通信;
龙芯3A处理器外部中断指i8259的中断,涵盖板卡上的外部设备中断。
中断控制器(8259)
简单的说它提供了16个中断输入引脚(对应着16个中断号)和一个输出引脚,其中输入引脚用于连接设备的中断引脚,也就是连接从PCI总线过来的中断引脚以及ISA总线过来的中断和其它设备过来的中断线。
中断输出引脚连接CPU的INTA。
8259的每一个输入引脚有效都可以引起它的输出的有效(低电平有效),从而将CPU的INTA拉低,CPU便知道有一个中断产生。
并且8259还有另外一个特别重要的功能,就是它为每个连接到它的输入引脚的中断源都保存了一个中断向量,这个中断向量保存了这个中断源对应的中断服务子程序的起始地址。
比如某一时刻,一个申请了中断的ISA设备(它的中断线连接到了8259的输入上面)有效了它的中断线,8259的输出也立刻有效,通知CPU。
CPU得到中断有效的信号后,马上停止正在进行的工作,和8259进行一次通信,从8259那里读取这个中断的中断向量(这个过程叫做“中断确认”),然后程序跳到中断服务子程序的起始地址开始运行。
经过上面的论述,我们了解到8259给所有的计算机设备,包括硬盘、软盘、PCI总线设备、ISA总线设备等,提供了16个可用的中断线。
这里所要注意的是很多系统设备以及ISA总线的设备对于中断线都是独占的,在大多数情况下,除去系统设备以及ISA总线设备所占
用的中断外,8259所剩下的可用的中断线就很少了,基本上最多是4、5个。
但是我们知道PCI设备很多是多功能设备,要申请不止一个中断,更何况有时候一个计算机要插不止一个PCI设备。
那么现在矛盾产生了,即8259所能提供的中断线少于或者远远少于PCI总线设备所需要的中断线,那么这个矛盾怎么解决呢?就需要用到我们上面提到的可编程中断路由器了。
可编程路由器有很多输入引脚,所有PCI设备的中断线与其连接,它的输出引脚比较少,连接到中断控制器的几个没有被占用的输入引脚上面。
可编程路由器的特点在于可以对它进行编程使它的输入对应到输出。
总的结果一般是几个输入共享一个输出。
中断处理流程
PMON下SB700中断配置
BIOS启动程序首先在内存里面建立一个中断表,这个中断表有很多入口,其中有些入口每一个对应一个系统中断号,这个表的作用随后会提到。
在某一个时刻,BIOS启动程序按一定顺序扫描所有的PCI设备,我们都知道每个PCI设备有一个配置空间,里面有很多寄存
器,有一些寄存器用于表明这个设备所需要的资源,比如内存地址范围、IO地址范围以及中断。
跟中断有关的寄存器有两个:中断管脚寄存器和中断线寄存器。
中断管脚寄存器用于表明这个设备是否申请了中断(非零表示申请了中断)以及它的中断引脚连接到了PCI插槽的哪个中断源上(每个PCI插槽提供四个中断源:INTA#,INTB#,INTC#,INTD#)。
BIOS 启动程序每扫描到一个PCI设备,便读取它的配置空间的寄存器,给它分配相应的内存地址和IO地址,并且同时读取它的中断管脚寄存器的值,如果非零则表明申请了中断,则BIOS 启动程序对可编程路由器进行编程,将这个设备的中断所对应的可编程路由器的那个输入管脚和可编程路由器的某一个输出也即某一个中断控制器的输入管脚对应起来,这样就将这个设备的中断管脚和某一个系统中断号对应了起来,然后BIOS启动程序把这个信息储存到PCI设备的中断线寄存器中。
然后继续扫描完所有的PCI设备,执行类似的操作。
以3a780e为例,代码位于Targets/Bonito3a780e/Bonito/tgt_machdep.c sb700_interrupt_fixup 函数中。
此处详细寄存器地址偏移可以看南桥sb700相关的文档。
1,Map usbint1map和usbint3map到PCI_INTC,map usbint2map和usbint4map到PCI_INTC;2,Map sataintmap到PCI_INTH;
3,Map HDA 中断AzIntMap到INTE;
4,设置GPIO42为HD 函数;
5,开始设置SB700中断PIC:
bus4:INTA →IRQ3 PCIeX1(right)
bus5:INTB →IRQ3 PCIeX1 (left)
INTC →IRQ6 USB
INTC →IRQ6 PCIeX8 dev2
bus7:INTD →IRQ5 RTL8169DL
INTE →IRQ5 HDA
bus10:
INTF →IRQ3 PCI(left) dev4
INTG →IRQ3 PCI(right) dev5
INTH →IRQ4 SATA
6,设置中断triggle mode:level or edge;
7,针对网卡rte0,硬盘sata,IDE, USB, LPC,HDA, VGA设备进行路由;
8,检查pci/pcie中断线寄存器(此处不检查多功能设备)。
Kernel下中断处理
中断处理流程按上图所示,依次向下查询处理。
中断触发时,硬件设置cause寄存器的Excode 域以及相应的IP位,并开始软件处理,软件通过查询Excode确定使用哪一类异常处理例程,软件再通过查询相应的IP位,确定中断dispatch,平台函数再根据中断号确定是哪一类中断,即都到上述流程的最末端,确定具体的发出中断的设备,执行do_IRQ()为中断服务。
3号系列中断处理主要在(arch/mips/loongson/loongson3/irq.c)
第一级中断判断(cause 寄存器IP位域定义)
IP7(timer 内部时钟中断、性能计数器中断)
IP6(核间中断)
IP3(8259中断)
IP2(UART/LPC中断)
代码详见:arch/mips/loongson/loongson-3/irq.c中match_irq_dispatch函数
asmlinkage void mach_irq_dispatch(unsigned int pending)
在这个函数中,通过pending与IP的比较,判断是哪个IP位。
第二级,平台中断判断
arch/mips/loongson/loongso-3/irq.c中dispatch_ht_irq()函数,将与平台相关,连入HT终端控制器的中断,依次找出并调用do_IRQ函数处理,例如:
int ls3a_ht_int_cpumask[NR_CPUS]={-1, (1<<5),(1<<6),(1<<3)};
表示在HT的5/6/3位被置起,对应有设备终端进入。
中断路由
龙芯3A处理器有4个处理器核、32个中断源、每个处理器核上有4个中断引脚INT0-INT3,分别对应cause寄存器的IP2-IP5,中断源可通过软件配置选择期望中断的目标处理器核。
对任何一个中断源都可以配置使能、触发、以及被路由到的目标处理器核中断脚。
32位中断源每一个都对应一个8位的路由控制器,其定义如下:[3:0]路由的处理器核向量号;[7:4]路由的处理器核中断引脚向量号。
例如:0x48,低位8标识3号处理器,高位4标识IP2引脚,即该中断源被路由到了3号处理器的INT2上。
从而完成中断源的中断路由工作。
例如:
arch/mips/loongsn/loongson-3/irq.c代码中:
INT_router_regs_HT1_int0 = 0x21;就是对应将HT的中断源路由到0号处理器,INT1的引脚。
中断使能
中断相关配置寄存器都是以位的形式对应的中断线进行控制,中断使能配置有三个寄存器:Intenset:设置中断使能,写1的位对应的中断被使能;
Intenclr:清除中断使能,写1清除;
Inten:寄存器读取当前各种使能的情况。
每一种中断源,有中断处理时,就往对应的中断位写入1,使能即可。
而对于有自己中断控制器的,需要根据其配置寄存器手册单独配置,如HT,LPC的中断控制器。
例如:HT的中断使能,下面的宏取到了HT控制器中断使能的寄存器地址:
#define HT_irq_enable_reg0 *(volatile unsigned int *)(HT_control_regs_base + 0xA0)
然后HT_irq_enable_reg0 = irqs的函数判断,即在dispatch_irq_dispatch的函数中判断被置1的位。
使能HT中断控制器。
中断分发
中断分发的过程,就是本节中中断流程图中自上而下,依次进行IP判断、平台设备判断、do_IRQ操作等等一系列的流程,在这个流程中,cpu通过一层一层过滤,确定中断是处理器内部中断还是外部设备中断,然后进入对应的中断处理,即do_IRQ的操作。