首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在irq()中运行irq()?或者在第二个irq上禁用一个irq?

在irq()中运行irq()是指在中断服务程序(Interrupt Service Routine,简称ISR)中调用另一个中断服务程序。在大多数操作系统中,ISR是在发生硬件中断时自动调用的函数,用于处理硬件事件或响应软件触发的中断。在IRQ处理过程中调用另一个IRQ可以实现嵌套中断。

要在irq()中运行irq(),需要确保操作系统和硬件平台支持中断嵌套,并遵循操作系统的中断处理机制。以下是一种可能的实现方式:

  1. 配置中断控制器:使用特定的硬件平台和操作系统的相关函数或驱动程序,配置中断控制器以支持中断嵌套。具体方法可能因平台而异,可以参考硬件厂商提供的文档。
  2. 注册中断处理函数:使用操作系统提供的API,在初始化阶段注册中断处理函数(ISR)到特定的中断号。例如,在Linux中,可以使用request_irq()函数注册中断处理函数。
  3. 编写嵌套中断代码:在主ISR中,根据需要使用适当的方法调用次级ISR。这可能涉及禁用/启用中断、保存/恢复上下文等操作,以确保嵌套的中断处理过程正确执行。

以下是一个示例,演示如何在irq()中运行irq()的伪代码:

代码语言:txt
复制
void secondary_irq_handler(void)
{
    // 次级中断处理函数的具体代码
    // ...
}

void primary_irq_handler(void)
{
    // 主IRQ处理函数的代码

    // 禁用次级IRQ
    disable_secondary_irq();

    // 执行次级IRQ处理函数
    secondary_irq_handler();

    // 启用次级IRQ
    enable_secondary_irq();

    // 继续主IRQ处理流程
    // ...
}

需要注意的是,嵌套中断的实现要考虑硬件平台、操作系统和应用程序的兼容性,并确保嵌套中断不会导致系统不稳定或死锁等问题。

关于禁用一个IRQ上的另一个IRQ,可以使用特定硬件平台和操作系统提供的函数或方法来实现。一般情况下,可以使用中断控制器提供的相关函数来禁用和启用特定中断线。具体的方法可能因平台和操作系统而异,建议查阅相关硬件和操作系统的文档来获取详细信息。

总结: 在irq()中运行irq()需要操作系统和硬件平台的支持,需要配置中断控制器并注册中断处理函数。嵌套中断的实现需要禁用和启用次级中断,并确保嵌套中断的顺序和上下文切换正确。禁用一个IRQ上的另一个IRQ可以通过硬件平台和操作系统提供的函数或方法来实现,具体方法建议查阅相关文档。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

《Linux Device Drivers》第十章 中断处理——note

并口就会产生一个中断 引脚9是并口数据字节的最高位 安装中断处理例程 中断信号线是很珍贵且有限的资源 内核维护了一个中断信号线的注冊表。...该注冊表类似于I/Oport的注冊表 模块使用中断前要先请求一个中断通道,然后使用后释放该通道 int request_irq(unsigned int irq,.../proc/interrupts 不依赖体系结构 /proc/stat 依赖体系结构 当前x86体系结构定义的中断数量是224,能够从头文件include/asm-386/irq.h得到解释...通常做清除接口卡一个位。...返回值应该是IRQ_NONE 启用和禁用中断 有时设备驱动程序必须在一个时间段内堵塞中断的发出,拥有自旋锁的时候堵塞中断 禁用单个中断 void disable_irq(

61020

eBPF 入门开发实践教程十: eBPF 中使用 hardirqs 或 softirqs 捕获中断事件

eBPF (Extended Berkeley Packet Filter) 是 Linux 内核一个强大的网络和性能分析工具。它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。...当硬件设备产生一个中断请求时,内核会将该请求映射到一个特定的中断向量,然后执行与之关联的硬件中断处理程序。硬件中断处理程序通常用于处理设备驱动程序的事件,例如设备数据传输完成或设备错误。...实现原理 eBPF ,我们可以通过挂载特定的 kprobe 或者 tracepoint 来捕获和分析 hardirqs 和 softirqs。...这样可以确保程序不同内核版本可以移植和运行。 Softirq 代码也类似,这里就不再赘述了。...运行代码 eunomia-bpf 是一个结合 Wasm 的开源 eBPF 动态加载运行时和开发工具链,它的目的是简化 eBPF 程序的开发、构建、分发、运行

28820
  • eBPF 入门开发实践教程十: eBPF 中使用 hardirqs 或 softirqs 捕获中断事件

    eBPF (Extended Berkeley Packet Filter) 是 Linux 内核一个强大的网络和性能分析工具。它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。...实现原理 eBPF ,我们可以通过挂载特定的 kprobe 或者 tracepoint 来捕获和分析 hardirqs 和 softirqs。... eBPF 程序,收集中断处理程序的相关信息,并将这些信息存储映射中。在用户空间应用程序,读取映射中的数据以分析和展示中断处理信息。...这样可以确保程序不同内核版本可以移植和运行。Softirq 代码也类似,这里就不再赘述了。...运行代码eunomia-bpf 是一个结合 Wasm 的开源 eBPF 动态加载运行时和开发工具链,它的目的是简化 eBPF 程序的开发、构建、分发、运行

    25710

    Linux内核21-Linux内核的中断处理过程

    但是,这种方法不适用于中断,因为当一个不相关的进程正在运行的时候,发送给特定进程的中断信号会被挂起,等到该进程执行的时候才会处理。所以,给中断发送一个信号没有太大意义。...用户可以选择可用的IRQ请求线或者自行探查系统可用的IRQ中断请求线。 系统启动阶段,按照硬件协议进行申请,然后通过协商,尽可能减少冲突。...表4-3展示了一个分配设备和IRQ的示例: IRQ INT Hardware device 0 32 定时器 1 33 键盘 2 34 PIC级联 3 35 第二个串行端口 4 36 第一个串行端口 6...多核系统IRQ分配 我们知道SMP的全称是对称多处理系统,这意味,Linux内核不应该对一个CPU有任何偏向。于是,内核CPU之间采用循环法(round-robin)分配IRQ。...如果发现CPU的中断负载不均衡了,它就会选择将某个IRQ移到另一个负载低的CPU或者采用在所有的CPU循环响应IRQ

    2.4K20

    对中断的一点思考

    然后,CPU再向8259A发出一个INTA脉冲信号,8259A收到CPU的第二个INTA信号后,将中断请求对应的中断向量放到数据总线上,以供CPU读取。...如果8259A工作AEOI(Auto End Of Interrupt,简称AEOI)模式下,则当他收到CPU的第二个INTA信号时,它就自动重置ISR寄存器的相应位。...大家都知道中断类型包括三种: 标志 含义 SA_INTERRUPT 当该位被设置时,表明这是一个快速的中断处理程序。本地处理器,快速中断处理程序禁止所有中断的情况下运行。...我曾经一个培训资料看到如下的结论: 实时应用,中断的发生不但要求迅速的中断服务,还要求迅速的调度有关的进程进入运行,在用户空间中对事件处理。...倘若内核的这段代码恰好需要较长时间来完成的话,或者连续又发生几次中断的话,就可能将调度过分的推迟。

    1.3K20

    local_irq_disable和disable_irq的区别

    全局范围内屏蔽某一个中断号(irq num)。...该irq num对应的irq handler不会在任何一个CPU执行。这个操作是通过设置中断控制器的寄存器来对指定中断进行屏蔽,而其他未屏蔽的中断依然可以正常送往CPU。...ack device irq——–>copy data to ram——>raise softirq 代码,是这样的调用流程: High level irq handler –> mask_ack_irq...(&desc->lock); } 从代码可以看到,函数首先做的就是mask_ack_irq,在其中会调用chip的回调来设置硬件。...当在一个CPU上调用了disable_irq的时候,可能另一个CPU已经接收了中断了,但是handler的处理可以看到,它会判断是否被其它CPU disable了,如果disable了,它会把这个中断标志设置为

    1.6K30

    STM32 禁用或开启总中断

    STM32使用时有时需要禁用全局中断,比如MCU升级过程禁用外部中断,防止升级过程中外部中断触发导致升级失败。   ...ARM MDK中提供了如下两个接口来禁用和开启总中断:   __disable_irq(); // 关闭总中断   __enable_irq(); // 开启总中断 但测试发现这样一个问题,关闭总中断后...这说明__disable_irq()只是禁止CPU去响应中断,没有真正的去屏蔽中断的触发,中断发生后,相应的寄存器会将中断标志置位,__enable_irq()开启中断后,由于相应的中断标志没有清空,...所以要想禁止所有中断,必须对逐个模块的中断进行 Disable操作,由于每个模块中断源有很多,对逐个中断Disable的话比较复杂,较为简单的方法是通过 XXX_ClearITPendingBit()清除中断标志或者直接通过...这样 __enable_irq()开启总中断后,MCU就不会响应之前触发的中断了。

    2.1K20

    Linux的中断下半部机制的对比

    例如,假设一个数据块已经达到了网线,当中断控制器接受到这个中断请求信号时,Linux内核只是简单地标志数据到来了,然后让处理器恢复到它以前运行的状态,其余的处理稍后再进行(把数据移入一个缓冲区,接受数据的进程就可以缓冲区找到数据...TASKLET_STATE_RUN只有多处理器系统才使用,单处理器系统什么时候都清楚一个小任务是不是正在运行(它要么就是当前正在执行的代码,要么不是)。Count域是小任务的引用计数器。...新技术threaded irq,为每一个中断都创建一个内核线程;多个中断的内核线程可以分配到多个CPU执行。...所以多个不同设备中断的work都会由同一个kworker线程来处理,多CPU系统并发效率不如threaded irq。 两者相同: 都是可抢占,可调度,可睡眠的内核线程,是内核态的线程上下文。...② 如果提供的话 返回值必须是:IRQ_WAKE_THREAD。 thread_fn,如果中断被正确处理了,应该返回IRQ_HANDLED。

    34410

    5.分析内核中断运行过程,以及中断3大结构体:irq_desc、irq_chip、irqaction(详解)

    本节目标:    分析linux的中断是如何运行的,以及中断3大结构体:irq_desc、irq_chip、irqaction 裸板程序(参考stmdb和ldmia详解): 1.按键按下, 2....所以irq_desc结构体的action成员是个链表,以action为表头,若是一个以上的链表就是共享中断  irqaction结构定义如下: struct irqaction {...| IRQ_WAITING); /*判断这个中断是否正在运行(INPROGRESS)或者禁止(DISABLED)*/ if (unlikely((desc->status & (IRQ_INPROGRESS...[irqno]->chip等于第二个参数 set_irq_handler(irqno, handle_edge_irq); 设置irq_desc[irqno]->handle_irq等于第二个参数 asm_do_IRQ...中断运行总结: 当产生一个中断异常 1.进入异常向量vector,比如中断异常:  vector_irq + stubs_offset 2.比如中断异常之前是用户模式(正常工作),则进入 __irq_usr

    1.6K80

    韦东山:剥丝抽茧分析linux中断系统的重要数据结构

    最核心的结构体是irq_desc,之前为了易于理解,我们说Linux内核中有一个中断数组,对于每一个硬件中断,都有一个数组项,这个数组就是irq_desc数组。...1.irq_desc数组 irq_desc结构体include/linux/irqdesc.h定义,主要内容如下图: ?...BSP开发人员会设置对应的处理函数,一般是handle_level_irq或handle_edge_irq,从名字看是用来处理电平触发的中断、边沿触发的中断。...3. irq_data结构体 irq_data结构体include/linux/irq.h定义,主要内容如下图: ?...当我们后面从设备树讲起,如何在设备树中指定中断,设备树的中断如何被转换为irq时,irq_domain将会起到极大的作为。

    1.1K20

    ARM(十三).WatchDog1

    main ;IMPORT伪指令指示编译器当前的符号不是本源文件定义的,而是在其它源文件定义的,本源文件可能引用该符号,main定义c源文件 AREA RESET, CODE...) | M_PDIVN)加载到R1,M_HDIVN 和 M_PDIVN 定义一个头文件 STR R1, [R0] ;进行配置 ;/****************************...;UsrStack_BASE一个文件定义,将系统模式的堆栈指针SP指到UsrStack_BASE处 ;/***************************************/ ;...体系结构LR的特殊用途有两种:一是用来保存子程序返回地址;二是当异常发生时,LR中保存的值等于异常发生时PC的值减4(或者减2),因此各种异常模式下可以根据LR的值返回到异常发生前的相应位置继续执行...,从结果来看,符合预期 运行效果是蜂鸣器会一直响,LED灯也会常亮 如果注释掉 main.c 的 rWTCNT = 50625; //喂狗,如果不喂狗,超时就会复位 这一句,再次运行 一小会儿后蜂鸣器就会停响

    78140

    吐血整理 | 肝翻 Linux 中断所有知识点

    中断产生后,可以分发到某一个CPU。比如按键触发一个中断,手机触摸屏触发的中断。...每一个中断控制器对应多个中断号, 而硬件中断号不同的中断控制器是会重复编码的, 这时仅仅用硬中断号已经不能唯一标识一个外设中断,因此 linux kernel 提供了一个虚拟中断号的概念。...假设当前 EL0 运行一个应用程序,触发了一个 EL0 的 irq 中断,则处理器会做如下的操作: 先会跳到 arm64 对应的异常向量表: /* * Exception vectors. */...内核工作队列分为两种: bound:绑定处理器的工作队列,每个 worker 创建的内核线程绑定到特定的 CPU 运行。...代码 worker 对应一个 work_thread() 内核线程。

    3.7K61

    内核中断系统的设备树

    参考 jz2440_irq_all.dts ? gpio控制器实际并不是中断控制器,但我们可以软件认为这是一个控制器 如何描述硬件资源?...源码路径 我们以前按键驱动程序的基础修改按键驱动程序。...以前我们设备树描述中断时,需要指定这个中断是发给哪一个中断控制器,它属于这个中断的哪一个中断。...中断控制器: 第一个表示是这个中断控制器里的哪一个中断; 第二个表表示中断的触发方式; 可以看到两个不同的中断控制器,它们后面的描述数据的数量是不一样的,这个数量的多少,是设备树里面#interrupt-cells...2) 设备的中断 a.1 设备节点中描述(表明使用"哪一个中断控制器里的哪一个中断, 及中断触发方式") a.2 在内核的驱动 (platform_driver.probe获得IRQ资源, 即中断号

    1.2K31

    实时操作系统里面随便怎么写代码都能硬实时吗?

    另外,关于RTOS和Linux实时性方面的差异,我们需要澄清一个误解。并非在RTOS随意编写代码就能满足硬实时的要求,同样,Linux也并非无法实现实时性。...Linux内核,自旋锁的实现主要侧重于核间自旋。当多个核的执行单元尝试获取同一锁时,它们会在各自的核上进行自旋等待。...假设T1、T2、T3和T4这四个任务都在同一个CPU核运行。当T1成功获取到一个自旋锁(spinlock)时,该CPU核的抢占调度机制就会被临时禁用。...内核里面会屏蔽中断的APIlocal_irq_disable、spin_lock_irqsave等 前文已经多次指出,驱动程序调用local_irq_disable()函数往往被视为一个潜在的问题或者说是...原因在于这个函数会禁用本地CPU的中断,但它并不能解决其他CPU核运行的线程或中断服务程序与当前核上线程之间的竞态条件。

    27721

    11_GPIO中断

    如果你正在接一个很重要的电话,突然门铃响了,这是会优先处理其中一件事,比如先让按门铃的人等一下,挂电话后再去开门,或者先挂电话,等开门后再打电话过去。这就存在一个中断优先级的问题。 ​...当有事件产生,处理事件之前我们需要记住现在作业写到第几页了,或者作业一个标记,然后取处理事件,电话铃响了需要到放电话的地方去,门铃响了需要到门口去,口渴需要到放饮水机地方去,也就是说,不同的突发事件需要到不同的地方去处理...嵌入式系统也有类似的情况。CPU在运行过程,也会被各种异常打断。...程序0x00地址通过ldr指令把Reset Handler的地址赋给pc,CPU跳转到Reset Handler运行,发生中断时,CPU跳转到IRQ_Handler运行。...1.5.3.1 参考章节《4-1.4映像文件烧写、运行》烧写、运行程序 ​ 此时观察串口打印 ​ 分别按下松开key1、key2,中断ID打印出来,对应的Led也亮灭,MCIMX6Y2.h文件查询GPIO5

    1.4K20

    Linux内核笔记之中断映射

    硬中断和虚拟中断号 Linux 内核笔记之高层中断处理一文,介绍了ARM gic中断控制器对于硬中断的处理过程。...gic的中断处理程序是从ack一个硬件中断开始的, gic的中断处理过程,会根据中断的映射去寻找对应的虚拟中断号, 再去进行后续的中断处理。...当前的SOC,通常内部会有多个中断控制器(比如gic interrupt controller, gpio interrupt controller), 每一个中断控制器对应多个中断号, 而硬件中断号不同的中断控制器是会重复编码的...外设的驱动初始化过程,创建硬中断和虚拟中断号的映射关系设备的驱动初始化的时候可以调用irq_of_parse_and_map这个接口函数进行该device node中和中断相关的内容的解析,并建立映射关系...()函数用于解析DTS文件设备定义的属性,"reg", “interrupt”, 最后把DTS的"interrupts"存放在*out_irq->args[1]. +-> irq_create_of_mapping

    5.1K30

    【致敬嵌入式攻城狮第2期活动预热征文】【致敬未来的攻城狮计划】连续打卡第10天+使用实时操作系统RTOS

    当使用实时操作系统 (RTOS) 时,单片机上运行的应用程序将拆分为几个较小的半独立代码块,每个代码块通常控制程序的一个方面。这些小片段称为线程。...每个线程还分配有优先级(相对于应用程序的其他线程),并且可以处于不同的状态,例如运行、就绪、阻塞或暂停。...为此,请激活配置器的“Pins” (引脚)选项卡,展开“Ports → P0”(端口 → P0),然后选择 P004。 CPK-RA2L1/RA2E1 评估板, 这是 S1 连接的端口。...右侧的“Pin Configuration”(引脚配置)窗格,为其指定符号名称 SW1 。 配置驱动 我们使用一个八位无符号整型来存储电平状态。 打开并启用连接到板 S1 的 IRQ03。...IRQ Driver on r_icu”(开发人员帮助 → LED 线程 → r_icu 的 g_external_irq03 外部 IRQ 驱动程序),然后将所出现列表末尾的回调函数定义拖放到源文件

    44940

    GICv3驱动初始化

    ,此值等于3代表interrupts中有三个字段 第一个字段代表中断类型(GIC_PPI, GIC_SPI) 第二个字段物理中断号,根据中断类型中断号的范围不同。...{ of_irq_init(__irqchip_of_table); acpi_probe_device_table(irqchip); } 最终of_irq_init函数根据dts...= handle_irq; return 0; } handle_arch_irq会在汇编调用的,中断处理流程详细说明 static asmlinkage void __exception_irq_entry...= ICC_IAR1_EL1_SPURIOUS); } 根据一篇GIC-500的文章最后一小节描述,先会去读IAR寄存器确定中断号的,软件是通过gic_read_iar实现的 得到中断号会去判断当前是哪种中断类型...name,中断控制器的名字,可以/cat /proc/interrupter查看 irq_mask: 用于屏蔽中断源 irq_unmask: 用于取消屏蔽中断源 irq_eoi: end of

    2.1K31

    |RT-Thread—详解PIN设备(基于RA2E1)

    好了,接下来我们开始进入今天的主题,如何在RA2E1基于RT-Thread优雅地使用PIN设备!...---- 设置引脚模式 引脚使用前需要先设置好输入或者输出模式,通过如下函数完成: void rt_pin_mode(rt_base_t pin, rt_base_t mode); 参数 描述 pin...---- 代码 接下来,我们就看一下我们的代码,因为没有板载蜂鸣器,我就自己接了一个P105引脚上(J1-11),实验现象就是灯亮的时候蜂鸣器刚好会闪一下,然后FinSH控制台可以调用我们自己写的msh...比如在drv_gpio.c文件,官方说有一个PIN驱动文件,但是我一直没找到,后来才知道:原来不是所有的BSP都有这个文件的,害得我一顿好找,哈哈哈。...rt_pin_read(led2_pin)); } 后来我才明白:中断里面一般要求快进快出,因为中断时间过长,可能会影响其他部分的正常运行。所以RTOS编程思维与裸机差异较大,以后得转变思想了。

    50940

    Linux内核37-内核数据的同步访问

    让我们举几个例子来说明如何在保持高并发水平的同时还能实现同步: 如果共享的数据结构是一个简单的整数,那么可以使用atomic_t类型的原子变量声明它。...所以,对于上面的代码,内核开发者应该保证它们的执行顺序,不会被编译器或者CPU控制单元破坏。否则,两条赋值语句之间插入进来执行的中断服务程序,会发现一个被破坏了的列表。...但是,不排除,一个CPU激活,一个CPU执行的使用情况。但是,无论哪种情况,它们的执行都是与CPU绑定在一起的,也就是一一对应,也就是不存在并发访问同一个tasklet的时候。...因为,即使中断被禁止,其它CPU的中断处理程序还会继续执行。所以,这时候需要关闭中断的同时,再申请一个自旋锁或者读写自旋锁保护数据结构。值得注意的是,这类自旋锁不会冻结系统。...因为可延时函数本质都是中断激活的,也是运行在中断上下文中的,在运行期间不会被异常中断。也就是说,使用关闭中断和自旋锁相结合的方式就足够了。

    91920
    领券