【发布时间】:2015-04-26 06:29:32
【问题描述】:
我正在研究 FIQ 在 ARM 上的工作原理,并发现 FIQ 应该始终用汇编而不是 C 编写,但不明白为什么?
我已经浏览了以下链接
http://comments.gmane.org/gmane.linux.ports.arm.kernel/14004
但仍然无法弄清楚为什么需要它?
谁能通过一些例子指出我在汇编中编写FIQ的必要性?
【问题讨论】:
-
正如讨论中的最后两篇文章所指出的,这不是必需的,不这样做几乎没有意义。另请注意,讨论仅限于 Linux 上下文。
-
一个问题是上下文切换回中断模式,可能是 IRQ, Supervisor, System, User, ... ,这需要特殊指令,但这些可以实现为内在函数或库调用.另一个问题是速度和利用 R8-R14 的影子副本,但编译器扩展可能会将这些用于声明为“FIQ”寄存器类型的变量。
-
您的问题含糊不清。上面的讨论是针对 Linux 的。 2004 年,Linux 还没有 FIQ 堆栈。如果您自己设置,您可能拥有一个 FIQ 堆栈。实际上并不清楚您想要什么,也不清楚您尝试过什么。您可能不容易在“C”中处理 FIQ,就像 IRQ 一样,因为 ARM 向量表需要分支。您至少需要一个存根或“C”扩展和链接器魔术。理论上,使用 gcc 和一些扩展是可能的;至少要进行立即返回的 FIQ。您在互联网上阅读的内容并不总是正确的,而且通常取决于上下文。
-
可能值得注意的是,FIQ 模式的 original 上下文支持无缓冲外设,其中数据仅在一定数量的周期内有效,并且内存足够慢,以至于当您将几个寄存器压入堆栈以保存它们时,您获取中断的设备数据已经丢失 - 在您甚至尝试读取它之前。因此增加了额外的存储寄存器。当然,那是 30 年前的事了,现代系统大不相同。
-
@Notlikethat Kudos,我刚知道第一个 arm 芯片是 30 年前的,并且支持 FIQ。
标签: c assembly arm interrupt-handling fiq