日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【RISC-V】Trap和Exception

發布時間:2024/3/12 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【RISC-V】Trap和Exception 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 控制流 (Control Flow)和Trap
  • RISC-V Trap處理中涉及的寄存器
    • mtvec (Machine Trap-Vector Base-Address)
    • mepc (Machine Exception Program Counter)
    • mcause (Machine Cause)
    • mstatus (Machine Status)
    • 中斷與異常含義
  • RISC-V Trap處理流程
    • Top Half(Trap發生時,Hart自動執行流)
    • Bottom Half(軟件需要做的事情)
    • 退出 trap:編程調用 MRET 指令

控制流 (Control Flow)和Trap

  • 控制流(Control Flow)
    • branch(條件分支指令), jump (無條件跳轉指令),由程序正常自主控制的流程
  • 異??刂屏?(Exceptional Control Flow,簡稱 ECP, 又稱Trap)
    • 不在程序的控制范圍之內
    • exception
    • interrupt

RISC-V Trap處理中涉及的寄存器

八個控制狀態寄存器(CSR)是機器模式下異常處理的必要部分:

  • mtvec(Machine Trap Vector)它保存發生異常時處理器需要跳轉到的地址。
  • mepc(Machine Exception PC)它指向發生異常的指令。
  • mcause(Machine Exception Cause)它指示發生異常的種類。
  • mie(Machine Interrupt Enable)它指出處理器目前能處理和必須忽略的中斷。
  • mip(Machine Interrupt Pending)它列出目前正準備處理的中斷。
  • mtval(Machine Trap Value)它保存了陷入(trap)的附加信息:地址例外中出錯
  • 的地址、發生非法指令例外的指令本身,對于其他異常,它的值為 0。
  • mscratch(Machine Scratch)它暫時存放一個字大小的數據。
  • mstatus(Machine Status)它保存全局中斷使能,以及許多其他的狀態,如圖

mtvec (Machine Trap-Vector Base-Address)

  • BASE: trap入口函數的及地址,必須保證四字節對其
  • MODE: 進一步用于控制入口函數的地址配置方式
    • Direct: 所有的exception和interrupt發生后pc都跳轉到BASE指定的地址處。其實就是一個中斷處理函數。
    • Vectored: exception處理方式同Direct;但interrupt的入口地址以數組方式排列。其實就是多向量指向不同的中斷處理函數。


mepc (Machine Exception Program Counter)

  • 當trap發生時,pc會被替換為mtvec設定的地址,同時hart會設置mepc為當前指令或者下一條指令的地址(如果是異常則設置當前指令,如果是中斷則設置下一條指令的地址),當我們需要退出trap時可以調用特殊的mret指令,該指令會將mepc中的值恢復到pc中(實現返回的效果)。
  • 在處理trap的程序中我們可以修改mepc的值達到改變mret返回地址的目的。

mcause (Machine Cause)

  • 當trap發生時,hart會設置該寄存器通知我們trap發生的原因。
  • 最高位Interrupt為1時標識了當前trap為interrupt,否則是exception。通過此標識能快速分辨發生了中斷還是異常。
  • 剩余的Exception Code用于標識具體的interrupt或者exception的種類。
  • WLRL(Write/Read Only Legal Values)

mstatus (Machine Status)

  • MIE: 分別用于打開(1)或者關閉(0) M/S/U模式下的全局中斷。當trap發生時,hart會自動將MIE設置為0。
  • MPIE: 當trap發生時用于保存trap發生之前的MIE值。
  • MPP: 當trap發生時用于保存trap發生之前的權限級別值。M/S/U三種模式用兩個bit表示。

中斷與異常含義

RISC-V Trap處理流程

Trap初始化(設置入口地址等)-> Trap的Top Half(硬件處理過程)-> Trap的Bottom Half(軟件邏輯部分)-> 從Trap返回

Top Half(Trap發生時,Hart自動執行流)

  • 先把 mstatus 的MIE值復制到MPIE中,清除 mstatus 中的MIE標志位,效果是中斷被禁止。(這就是硬件上不支持中斷嵌套,但可以手動將中斷再次打開實現中斷嵌套)
  • 設置 mepc,同時PC被設置為 mtvec。(需要注意的是,對于 exception, mepc 指向導致異常的指令;對于 interrupt,它指向被中斷的指令的下一條指令。)
  • 根據 trap 的種類設置 mcausem,并根據需要為 mtval 設置附加信息。
  • 將 trap發生之前的權限模式保存在 mstatus 的 MPP 域中,再把 hart 權限模式更改為M(也就是說無論在任何 Level 下觸發 trap, hart首先切換到 Machine 模式)

Bottom Half(軟件需要做的事情)

  • 保存(save) 當前控制流的上下文信息,是指保存x1~x31寄存器的值。(利用 mscratch)
  • 調用C語言的trap handler
  • 中斷C程序執行完畢之后從trap handler函數返回,mepc的值可能需要調整。
  • 恢復 (restore)上下文的信息。
  • 執行 MRET指令返回到trap之前的狀態。

退出 trap:編程調用 MRET 指令

  • 針對不同權限級別下有各自退出trap的返回指令xRET (x=M/S/U)
  • 以在M模式下指令mret指令為例,會執行開中斷(mstatus.MIE = mstatus.MPIE; mstatus.MPIE = 1),然后返回進入trap之前的指令,如果是中斷的話返回進入trap之前的下一條指令。(pc = mepc)

portASM.S /*-----------------------------------------------------------*/.section .text.freertos_risc_v_trap_handler .align 8 freertos_risc_v_trap_handler:portcontextSAVE_CONTEXT_INTERNALcsrr a0, mcausecsrr a1, mepcbge a0, x0, synchronous_exceptionasynchronous_interrupt:store_x a1, 0( sp ) /* Asynchronous interrupt so save unmodified exception return address. */load_x sp, xISRStackTop /* Switch to ISR stack. */j handle_interruptsynchronous_exception:addi a1, a1, 4 /* Synchronous so update exception return address to the instruction after the instruction that generated the exeption. */store_x a1, 0( sp ) /* Save updated exception return address. */load_x sp, xISRStackTop /* Switch to ISR stack. */j handle_exceptionhandle_interrupt: #if( portasmHAS_MTIME != 0 )test_if_mtimer: /* If there is a CLINT then the mtimer is used to generate the tick interrupt. */addi t0, x0, 1slli t0, t0, __riscv_xlen - 1 /* LSB is already set, shift into MSB. Shift 31 on 32-bit or 63 on 64-bit cores. */addi t1, t0, 7 /* 0x8000[]0007 == machine timer interrupt. */bne a0, t1, application_interrupt_handlerportUPDATE_MTIMER_COMPARE_REGISTERcall xTaskIncrementTickbeqz a0, processed_source /* Don't switch context if incrementing tick didn't unblock a task. */call vTaskSwitchContextj processed_source#endif /* portasmHAS_MTIME */application_interrupt_handler:call freertos_risc_v_application_interrupt_handlerj processed_sourcehandle_exception:/* a0 contains mcause. */li t0, 11 /* 11 == environment call. */bne a0, t0, application_exception_handler /* Not an M environment call, so some other exception. */call vTaskSwitchContextj processed_sourceapplication_exception_handler:call freertos_risc_v_application_exception_handlerj processed_source /* No other exceptions handled yet. */processed_source:portcontextRESTORE_CONTEXT /*-----------------------------------------------------------*/

總結

以上是生活随笔為你收集整理的【RISC-V】Trap和Exception的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。