【发布时间】:2014-03-18 09:15:19
【问题描述】:
我正在尝试从头开始为中断程序编写自己的代码。我正在使用 zynq7000,它由两个 ARM cortex A9 处理器组成。
我将使用 SDK 用 C 编写的程序连同在 PlanAhead 中生成的FSBL 和位文件加载到闪存中。当我的程序开始运行时,处理器进入用户模式。在用户模式下,IRQ 和 FIQ 被禁用。我正在尝试使用SWI 指令进入管理员模式以启用IRQ 和FIQ 中断。我调试的时候显示调用SWI指令时遇到了SIGTRAP。
那么,即使在处理器启动 (FSBL) 并启动之后,我如何在 C 中编写我自己的代码,它可以启用中断并运行我的ISR?
谢谢
【问题讨论】:
-
要使用 SWI,您需要提供一个 SWI 处理程序,在该处理程序中您可以做任何您想做的事情。 C 作为一种语言不了解启用/禁用中断所需的 ARM 指令,因此需要一些汇编。所有这些都可能以编译器特定的方式为您完成,但这当然会使您的代码极难移植。
-
我根据 armgcc 提供的语法制作了自己的 SWI 处理程序,但它从未进入处理程序。我还在 arm_vectors.S 中找到了 SWI 处理程序(我猜它是启动文件),它使用“BL”命令跳转到处理程序。我试图将其更改为跳转到我的处理程序,但它永远不会。关于传递给 SWI 指令的值意味着什么的任何想法可能会有所帮助?
-
swi指令中传入的值在指令中编码,见arm手册。同样,正如 arm 手册告诉您的那样,您可以使用链接寄存器来了解什么指令称为 swi,然后您必须阅读指令然后提取传递的值。这些值仅对处理程序有任何价值,如果您使用一些股票 arm rom 监视器或 arm linux 或任何操作系统处理程序,那么它们会有一个数字含义列表。