我想知道在基于 ARM 的微控制器上编写 SVC 调用的正确方法。
到目前为止,我的理解是 ARM 有一个异常向量表,这意味着任何程序中的第一条指令都必须分支到适当的处理程序:
RESET ;Handles reset
UNDEFINED ;Undefined instructions
SVC BL SVC_Entry
PRE_ABORT ;Prefetch abort
DAT_ABORT ;Data abort
然后,每次运行 SVC 指令时,模式切换到监督模式,SVC 提供的编号存储在 R0 中,程序将跳转到适当的处理程序:
;== Handling SVC calls ========================================================
Max_SVC EQU 1
SVC_Entry CMP R0, #Max_SVC ;Check upper limit
BHI SVC_end ;Does nothing if unknown
ADD R0, PC, R0, LSL #2 ;Calculate table address
LDR PC, [R0, #0]
Jump_table DEFW SVC_0 ;Halt
DEFW SVC_1 ;Print string
;== SVC calls ================================================================
SVC_1 B SVC_end
SVC_end MOVS PC, LR ;Exiting
所以,如果我们有这些说明:
ADR R1, string ;R1 points to the string
SVC 1 ;SVC_1 handles the printing
程序必须切换到主管模式,将数字“1”存储在 R0 中,然后按照跳转表分支到 SVC_1,运行代码并切换回用户模式。
这个对吗?我做对了吗?
到目前为止,我遇到的问题是我的编译器对这一行说“操作员预期”:
SVC BL SVC_Entry
在 Internet 上很难找到有关此主题的信息,我只想知道如何在 ARM 微控制器上正确使用 SVC 调用。
非常感谢。
编辑:底层处理器是时钟频率约为 240 MHz 的 ARM9。这存在于 AT91 微控制器中。它所在的实验室板已经过修改,以适应我大学的需要。
代码通过串行端口使用定制程序加载到板上。该程序还允许调试。