首页
学习
活动
专区
工具
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(

60120

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

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

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

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

    26920

    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.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

    对中断的一点思考

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

    1.3K20

    STM32 禁用或开启总中断

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

    2.1K20

    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.5K80

    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; //喂狗,如果不喂狗,超时就会复位 这一句,再次运行 一小会儿后蜂鸣器就会停响

    77340

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

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

    3.5K61

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

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

    26910

    韦东山:剥丝抽茧分析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

    内核中断系统的设备树

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

    1.1K31

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

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

    90620

    Linux内核22-软中断和tasklet

    1 软中断和Tasklet介绍 之前的文章,讲解中断处理相关的概念的时候,提到过有些任务不是紧急的,可以延后一段时间执行。因为中断服务例程都是顺序执行的,响应一个中断的时候不应该被打断。...软中断是静态分配好的(编译时),而tasklet是在运行时分配并初始化的(比如,加载内核模块的时候)。因为软中断的实现是可重入的,使用自旋锁保护它们的数据结构。所以软中断可以多个CPU并发运行。...最后一个跟软中断实现相关的数据是每个CPU都有一个32位掩码,用来描述挂起的软中断。存储irq_cpustat_t数据结构的__softirq_pending成员。...这表明中断上下文中正在调用do_softirq()函数,或者软中断被禁止。 执行local_irq_save来保存IF标志的状态,并在本地CPU禁用中断。...而do_IRQ()函数最后会调用irq_exit()宏,这个宏会引发另一个调用 __do_softirq()的程序执行。这在Linux内核是禁止的,因为其可延时函数的执行都是串行的。

    1.5K30

    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编程思维与裸机差异较大,以后得转变思想了。

    49140

    Exynos4412 中断处理流程详解

    当外设(SOC内部或者外部都可以)检测到了中断事件,就会通过interrupt requestion line的电平或者边沿(上升沿或者下降沿或者both)通知到该外设连接到的那个中断控制器,而中断控制器就会在多个处理器中选择一个...(1)我们期望保存发生中断时候的硬件现场(HW context),这里就包括ARM的core register。...irq mode的stack,依次保存了发生中断那一点的r0值、PC值以及CPSR值(具体操作是通过spsr进行的,其实硬件已经帮我们保存了CPSR到SPSR中了)。为何要保存r0值?...一个最重要原因是:如果一个中断模式(例如从usr进入irq模式,irq模式)重新允许了中断,并且在这个中断例程中使用了BL指令调用子程序,BL指令会自动将子程序返回地址保存到当前模式的sp(即r14...ret);   调用action的handler,我们注册中断的时候注意任务就是构造一个irqaction结构并添加到irq_desc的irqaction链表的指针action下面。

    1K30

    eBPF文章翻译(2)——BCC介绍(附实验环境)

    ”Hello, World“示例 更多示例 未来还会有更多 BCC是什么 本系列的前一篇文章,我讨论了如何使用eBPF安全地运行内核内用户空间提供的代码。...函数名“kprobe__sys_clone()”的格式很重要:kprobe__前缀表示BCC工具链将一个kprobe附加到它后面的内核符号。在这里,是sys_clone()这个符号。...现在完全只需通过实例化一个新的BPF对象就可以处理。所有低层次的工作都是幕后完成的,就Python bindings和BCC的libbpf库。...输出内容格式说明如下: kprobe触发时正在运行的应用程序名称 这个应用程序的PID 运行在哪个CPU核心上([]里面) 各种进程上下文标志 时间戳 最后一个字段就是我们传递给bpf_trace_printk...倒数第二个字段包含0x00000001这个地址。通常情况下,当内核代码写入跟踪缓冲区时,系统指令trace_printk()被调用后,这个指令的指针地址将打印该字段

    2.7K30
    领券