繁体   English   中英

ARM中断处理程序

[英]ARM Interrupt Handler

首先要说我已经读过这篇文章 ,无法理解或得到清晰的答案。 我是试图学习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);
}

链接答案的基本要点是“在ARM M-profile体系结构中,您通常不需要执行任何操作”。 采取任何例外措施会自动掩盖所有其他优先级相同或更低的例外情况。 从异常处理程序返回的内容将自动恢复先前的状态。 如果您发现自己想在较低优先级的处理程序中掩盖较高优先级的异常,请首先考虑是否首先适当设置了优先级-偶尔有这样做的有效理由,但是如果您不这样做,已经知道为什么需要,您不需要。

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启动的序列。 NMI。 其他RTOS可以处理来自嵌套IRQ和/或NMI的系统调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM