微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM微处理器的编程模型之:异常中断处理

ARM微处理器的编程模型之:异常中断处理

时间:09-13 来源:互联网 点击:

他SWI空间可用于特定应用程序的SWI。在一个特定的应用程序中,如果从指令中提取SWI编号的开销太大,就可使用这个方法。ARM(0x123456)和Thumb(0xAB)半主机方式的SWI就是这样实现的。

下面的例子显示了如何使用_swi将C函数调用映射到半主机方式的SWI。

#ifdef __thumb

/* Thumb 状态的Semihosting软中断处理*/

#define SemiSWI 0xAB

#else

/* ARM状态下的Semihosting的软中断处理*/

#define SemiSWI 0x123456

#endif

/* 使用Semihosting软中断输出一个字符*/

__swi(SemiSWI) void Semihosting(unsigned op, char *c);

#define WriteC(c) Semihosting (0x3,c)

void write_a_character(int ch)

{

char tempch = ch;

WriteC( tempch );

}

编译程序含有一个机制,用以支持使用r12来传递所需运算的值。根据AAPCS标准,r12为IP寄存器,并且专用于函数调用。其他时间内可将其用作暂存寄存器。如前面所述,通用SWI参数和返回值通过r0~r3寄存器传递。而r12可用于传递通用SWI调用的中断功能编号。

下面的例子显示了通用SWI的C语言程序框架。

__swi_indirect(0x80)

unsigned SWI_ManipulateObject(unsigned operationNumber,

unsigned object,unsigned parameter);

unsigned DoSelectedManipulation(unsigned object,

unsigned parameter, unsigned operation)

{

return SWI_ManipulateObject(operation, object, parameter);

}

生成的汇编代码如下。

DoSelectedManipulation PROC

STMFD sp!,{r3,lr}

MOV r12,r2

SWI 0x80

LDMFD sp!,{r3,pc}

ENDP

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top