TQ2440 软中断的基本使用


   在C源程序中用软中断时可以使用 格式:__swi(软中断号) 函数名(形参)  来声明一个软中断函数 例如:__swi(0x01) led(void);   这样就声明了一个具有中断号为0x01的软中断函数。

  注:在ARM处理器中,一般将软中断号放在发生软中断的那条指令的低24位。

          发生软中断时,处理器会将发生软中断的下一条指令放到lr寄存器中,所以中断号就在地址 lr - 4 的低24位。


下面是处理软中断的汇编代码:(在汇编代码前面需要加IMPORT C_Swi_handler)

HandlerSWI
	stmfd	sp!, {r0-r3,r12,lr}          ;保存现场,APCS规定汇编和C函数之间形参的传递为:r0作为第一个形参,少于4个时使用r0-r3传递,多的要使用堆栈
	ldr		r0,	[lr,#-4]     ;取出软中断号所在的指令
	bic		r0, r0,	#0xff000000  ;低24位为软中断号
	bl		C_Swi_handler        ;调用软中断处理函数
	ldmfd	sp!, {r0-r3,r12,pc}^         ;恢复现场


在软中断服务函数中,如果不止一个软中断,则需要使用软中断号来判断

 

完整程序的例子:

#include "2440addr.h"
#include "config.h"

extern void C_Swi_handler(unsigned num);
__swi(0x01)	void led(void);
void ledInit(void);

void Main(void)
{
	ledInit();
	led();
	while(1)
		;
}

void C_Swi_handler(unsigned int num)
{
	switch(num)
	{
		case 0x01:
			rGPBDAT &= ~(1<<5);break;
	}
	
}


void ledInit(void)
{
	rGPBCON &= ~(3<<10);
	rGPBCON |= (1<<10);
	rGPBDAT |= (1<<5);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值