簡體   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