【问题标题】:ARM Interrupt HandlerARM 中断处理程序
【发布时间】:2016-10-31 23:58:14
【问题描述】:

首先要说我已经阅读了this 并且无法理解或得到明确的答案。 我是一个试图学习 ARM 的 AVR 人。我正在对 ATMEL 的 ATSAM4LC2AA 进行编程。 当我遇到 ISR 处理程序时,我应该禁用全局中断吗? 如果是这样,这是正确的代码吗?

void USARTx_Handler(void)
{
    /* Disable interrupts */
    irqflags_t flags = cpu_irq_save();

    /* Read USART Status. */
    Do_small_task();

    /* Enable interrupts */
    cpu_irq_restore(flags);
}

【问题讨论】:

    标签: c arm isr


    【解决方案1】:

    链接答案的基本要点是“在 ARM M-profile 架构中,您通常不需要做任何事情”。接受任何异常会自动屏蔽任何其他具有相同或更低优先级的异常。从异常处理程序返回会自动恢复之前的状态。如果您发现自己想要在较低优先级的处理程序中屏蔽 较高 优先级的异常,请首先考虑您是否已正确设置优先级 - 偶尔会有这样做的正当理由,但如果您还不知道为什么需要这样做,则不需要。

    【讨论】:

    • 我遇到了 USART0 和 USART2 中断同时发生的问题。我不熟悉 ARM 优先级。我现在就在网上搜索。感谢您的回答。
    【解决方案2】:

    cpu_irq_save() 通常不会禁用中断,它只是返回标志的状态。当前和所有较低优先级的中断已被禁用。 cpu_irq_restore(flags),恢复标志。我不确定为什么需要这些调用,除非 USARTx_Handler() 正在改变标志的状态。通常有一些内核(操作系统)代码在调用 USARTx_Handler() 之前已经保存了“上下文”。

    如果这不是嵌套中断,则 ARM 从线程模式更改为处理程序模式来处理中断。 USARTx_Handler() 之外处理实际中断(异常)的典型内核(操作系统)代码调用 USARTx_Handler(),然后当 USARTx_Handler(void) 返回时,内核代码会将 ARM 恢复到之前的状态,通常是返回到线程模式(除非它处于嵌套中断状态)。

    在多线程内核的情况下(如某些版本的 RTOS),它可能包含可以从中断处理程序调用的函数,这些函数最终会在中断函数返回时导致上下文切换到不同的线程。

    更新 - 根据 Tedi 的评论,cpu_irq_save() 也在禁用中断(显然在禁用中断之前保存标志)。函数名本来可以更好,cpu_irq_save_and_disable_irq(),但可能太长了。只要文档显示这些函数应该如何工作,名称就不是那么重要。

    这会在调用 USARTx_Handler() 之后但在 cpu_irq_disable 实际禁用中断之前的任何时间创建时序窗口,更高优先级的中断可以抢占 USARTx_Handler()。此外,在 cpu_irq_restore() 启用中断之后(假设此处)的任何时间,但在 USARTx_Handler() 返回之前,更高优先级的中断也可以抢占 USARTx_Handler()。但至少你知道 cpu_irq_save() 和 cpu_irq_restore() 之间的中断是禁用的。

    如果您不希望 USARTx_Handler() 禁用更高优先级的中断怎么办?为此需要什么特殊的电话吗?

    由于我对此处使用的内核/RTOS 一无所知,因此我不确定以这种方式实现中断处理程序的含义。一个问题是内核是否支持嵌套中断能够调用内核函数,例如当中断链从处理程序模式返回线程模式时导致上下文切换的函数。

    还有如何处理 NMI(不可屏蔽中断)的问题。一些 RTOS 不处理这个问题,因此解决方案是让嵌入式设备在 NMI 处理程序中设置一个特殊的基于硬件的中断 (IRQ),然后从 NMI 中返回,其中特殊的中断处理程序完成由NMI。其他 RTOS 可以处理来自嵌套 IRQ 和/或 NMI 的系统调用。

    【讨论】:

    • Appart from the IRQ 刚刚得知 cpu_irq_save 调用 cpu_irq_disable 所以我们需要重新考虑。
    • @Tedi - 我更新了我的答案以回复您的评论。
    • 谢谢。有很多关于 ARM 的内容需要阅读,您阅读的内容越多,我发现需要学习的内容就越多。
    • @Tedi - 在这种情况下,问题更多是关于内核/RTOS 以及它如何处理嵌套中断,而不是关于 ARM。
    猜你喜欢
    • 2017-01-07
    • 2013-12-24
    • 2012-11-26
    • 2014-06-12
    • 1970-01-01
    • 2011-07-20
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多