2012-12-15 37 views
0

我正在嘗試創建處理鍵盤輸入的硬件中斷處理程序。問題是我的處理程序只有在Receiver Control Register的值爲1時纔會繼續運行。目前,我的代碼的值爲3,因此我的處理程序只是退出,因爲我只想處理硬件中斷。我無法在網上找到任何描述什麼是3級中斷的地方,以及我如何修復我的代碼,以便提供1級中斷。什麼是接收器控制寄存器的中斷級別

有人能告訴我什麼級別3或至少指向我的資源?謝謝

要添加到此。我也得到了256作爲我的原因寄存器的值。我認爲所有的代碼都是十六進制的,因此這將是一個代碼4.我能看到的是來自非法地址的加載。這是沒有道理的,因爲直到我敲擊鍵盤上的某個鍵時,中斷處理程序才被調用。繼承人代碼:

.data 0xffff0000 
RecvCtrlReg: .word 0 

.ktext 0x80000180 

    #move $k1, $at 

    #la $k0, frogger # save the address to frogger function for long call 

    mfc0 $k1, $13 
    beq $k1, 0, keyboard # If cause register is not zero, exit 

    li $v0, 10  # Do nothing and exit 
    syscall 

    keyboard:   # else check interupt level 

    lw $t7, RecvCtrlReg  
    beq $t7, 1, continue # if the Reciever Control Reg is 1, its a hardware interrupt, so continue 

    li $v0, 10  # else do nothing and exit 
    syscall 
    continue: 

    jalr $k0  # long call frogger function 

    mtc0 $0, $13  # set cause register to 0 

    mfc0 $k0, $12  # Fix status register 
    andi $k0, 0xfffd # clear EXL bit 
    ori $k0, 0x1  # Enable interrupts 
    mtc0 $k0, $12  # Store value back into status register 

    #move $at, $k1 

    eret 

回答

0

它不僅僅是Cause寄存器中斷位字段的單獨足以接受請求。通常,Cause寄存器的中斷字段也與Status寄存器的中斷字段進行位邏輯與運算。結果位與OR位在一起,並且值與Status寄存器的IE位(主器件使能用於中斷)的位相同會引起中斷。