[英]How to use the SWI in ARM Cortex A9 for enabling the IRQ interrupt?
我正在尝试为中断程序从头开始编写自己的代码。 我正在使用zynq7000 ,它由两个ARM cortex A9处理器组成。
我将使用SDK使用C语言编写的程序以及FSBL
和PlanAhead中生成的位文件加载到闪存中。 当我的程序开始运行时,处理器进入用户模式。 在用户模式下, IRQ
和FIQ
被禁用。 我正在尝试使用SWI
指令进入超级用户模式以启用IRQ
和FIQ
中断。 当我调试时,它表明在我调用SWI
指令时遇到了SIGTRAP
。
因此,即使在处理器启动( FSBL
)并启动后,如何用C编写自己的代码也可以启用中断并运行ISR
?
谢谢
vectors.s
.globl _start
_start:
ldr pc,_reset_handler
ldr pc,_undefined_handler
ldr pc,_swi_handler
b hang
b hang
b hang
b hang
b hang
_reset_handler: .word reset
_undefined_handler: .word hang
_swi_handler: .word swi
reset:
mov sp,#0xD6000000
add sp,sp,#0xC000
bl notmain
hang: b hang
.globl PUT32
PUT32:
str r1,[r0]
bx lr
.globl GET32
GET32:
ldr r0,[r0]
bx lr
swi:
ldr r0,[lr,#-4]
mov r1,#0x00FFFFFF
and r0,r0,r1
movs pc,lr
.globl switest
switest:
stmdb r13!,{lr}
swi #0x23
ldmia r13!,{lr}
bx lr
链接描述文件
MEMORY
{
ram : ORIGIN = 0x00000000, LENGTH = 0x4000
}
SECTIONS
{
.text : { *(.text*) } > ram
}
notmain.c
extern void uart_init ( void );
extern void uart_putc ( unsigned char );
extern unsigned int switest ( void );
void hexstrings ( unsigned int d )
{
unsigned int rb;
unsigned int rc;
rb=32;
while(1)
{
rb-=4;
rc=(d>>rb)&0xF;
if(rc>9) rc+=0x37; else rc+=0x30;
uart_putc(rc);
if(rb==0) break;
}
uart_putc(0x20);
}
void hexstring ( unsigned int d )
{
hexstrings(d);
uart_putc(0x0D);
uart_putc(0x0A);
}
int notmain ( void )
{
uart_init();
hexstring(0x12345678);
hexstring(switest());
return(0);
}
上面是一个最小的SWI工作示例的相关部分。 请注意,这仅适用于arm模式下的svc / swi指令,而不适用于thumb或thumb2,如果要使通用模式适用于所有模式,我建议您不要打扰svc立即使用,而是在寄存器中传递某些内容。
此示例未启用中断,仅显示了如何进行svc / swi调用以及如何实现异常处理程序。 多年来,这种知识已在《手臂架构参考手册》中得到了很好的记录。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.