繁体   English   中英

如何在ARM Cortex A9中使用SWI启用IRQ中断?

[英]How to use the SWI in ARM Cortex A9 for enabling the IRQ interrupt?

我正在尝试为中断程序从头开始编写自己的代码。 我正在使用zynq7000 ,它由两个ARM cortex A9处理器组成。

我将使用SDK使用C语言编写的程序以及FSBL和PlanAhead中生成的位文件加载到闪存中。 当我的程序开始运行时,处理器进入用户模式。 在用户模式下, IRQFIQ被禁用。 我正在尝试使用SWI指令进入超级用户模式以启用IRQFIQ中断。 当我调试时,它表明在我调用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM