linux 中断系统调用代码,系统调用与软件中断SWI的实现

;**********************************************************************

;系统调用实验(QQ2440, MINI2440,TQ2440)

;**********************************************************************

GPBCONEQU0x56000010

GPBDATEQU0x56000014

SYS_STACK_BASE EQU0x33000000

EXPORT SWI_LED

AREA SWI_LED ,CODE,READONLY

ENTRY

;**********************************************************************

;设置中断向量,除Reset和HandleSWI外,其它异常都没有使用(如果不幸发生了,

;将导致死机)

;**********************************************************************

; 0x00:复位Reset异常

bReset

; 0x04:未定义异常(未处理)

HandleUndef

bHandleUndef

; 0x08:软件中断异常,跳往软件中断处理函数HandleSWI

bHandleSWI

; 0x0c:指令预取异常(未处理)

HandlePrefetchAbt

bHandlePrefetchAbt

; 0x10:数据访问中止异常(未处理)

HandleDataAbt

bHandleDataAbt

; 0x14:未使用异常(未处理)

HandleNotUsed

bHandleNotUsed

; 0x18:一般中断异常(未处理)

HandleIRQ

bHandleIRQ

; 0x1c:快速中断异常(未处理)

HandleFIQ

bHandleFIQ

Reset;复位异常处理入口

;关闭看门狗

ldr r0, = 0x53000000

mov r1, #0

str r1, [r0]

bl initmem

ldrsp,=0x32000000;设置管理模式栈指针

; LED灯初始化

ldr r0, =GPBCON; LED的GPIO接口配置寄存器

ldr r1, =0x00015400; GPIO配置数据

str r1, [r0];设置GPIO

ldr r0, =GPBDAT; Led数据寄存器

ldr r1, =0x1e0;熄灭所有Led

str r1, [r0]

msrcpsr_c,#0xdf

ldrsp, =SYS_STACK_BASE

msrcpsr_c,#0x50;开启系统中断,进入用户模式,该指令执行完

;就进入用户空间,执行用户程序xmain

ldrlr,=halt_loop;设置管理模式下返回地址

IMPORT xmain

ldrpc,=xmain;跳入主函数main里执行

halt_loop

b halt_loop

;***********************************************************************

;软中断处理

;***********************************************************************

IMPORT do_led_on

IMPORT do_led_off

HandleSWI

STMFDSP!, {R0-R12,LR};保存程序执行现场

LDRR4, [LR, #-4]; LR - 4为指令" swi xxx"的地址,指令低24位软件中断号

BICR4, R4, #0xFF000000;取得ARM指令24位立即数

CMPR4, #1;判断24位立即数的值,如果为1,调用do_led_on系统调用

LDREQLR, =swi_return;软中断处理返回地址

LDREQPC, = do_led_on;软中断号1对应系统调用处理

CMPR4, #2;判断24位立即数的值,如果为2,调用do_led_off系统调用

LDREQLR, =swi_return;软中断处理返回地址

LDREQPC, = do_led_off;软中断号2对应系统调用处理

MOVNER0, #-1;没有该软中断号对应函数,出错返回-1

swi_return

LDMIASP!, {R0-R12, PC}^;中断返回, ^表示将spsr的值复制到cpsr

initmem

ldr r0, =0x48000000;内存控制寄存器起始地址

ldr r1, =0x48000034;内存控制寄存器结束地址

adr r2, memdata ;加载寄存器设置数据区首地址

initmemloop

ldr r3, [r2], #4

str r3, [r0], #4

teq r0, r1

bne initmemloop;循环设置每一个寄存器

mov pc, lr

memdata

DCD0x22000000 ;BWSCON

DCD0x00000700;BANKCON0

DCD0x00000700;BANKCON1

DCD0x00000700;BANKCON2

DCD0x00000700;BANKCON3

DCD0x00000700;BANKCON4

DCD0x00000700;BANKCON5

DCD0x00018005;BANKCON6

DCD0x00018005;BANKCON7

DCD0x008e07a3;REFRESH

DCD0x000000b1;BANKSIZE

DCD0x00000030;MRSRB6

DCD0x00000030;MRSRB7

END;代码结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值