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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【RISC-V】Trap和Exception

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

文章目錄

  • 控制流 (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發(fā)生時(shí),Hart自動(dòng)執(zhí)行流)
    • Bottom Half(軟件需要做的事情)
    • 退出 trap:編程調(diào)用 MRET 指令

控制流 (Control Flow)和Trap

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

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

八個(gè)控制狀態(tài)寄存器(CSR)是機(jī)器模式下異常處理的必要部分:

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

mtvec (Machine Trap-Vector Base-Address)

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


mepc (Machine Exception Program Counter)

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

mcause (Machine Cause)

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

mstatus (Machine Status)

  • MIE: 分別用于打開(1)或者關(guān)閉(0) M/S/U模式下的全局中斷。當(dāng)trap發(fā)生時(shí),hart會(huì)自動(dòng)將MIE設(shè)置為0。
  • MPIE: 當(dāng)trap發(fā)生時(shí)用于保存trap發(fā)生之前的MIE值。
  • MPP: 當(dāng)trap發(fā)生時(shí)用于保存trap發(fā)生之前的權(quán)限級(jí)別值。M/S/U三種模式用兩個(gè)bit表示。

中斷與異常含義

RISC-V Trap處理流程

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

Top Half(Trap發(fā)生時(shí),Hart自動(dòng)執(zhí)行流)

  • 先把 mstatus 的MIE值復(fù)制到MPIE中,清除 mstatus 中的MIE標(biāo)志位,效果是中斷被禁止。(這就是硬件上不支持中斷嵌套,但可以手動(dòng)將中斷再次打開實(shí)現(xiàn)中斷嵌套)
  • 設(shè)置 mepc,同時(shí)PC被設(shè)置為 mtvec。(需要注意的是,對(duì)于 exception, mepc 指向?qū)е庐惓5闹噶?#xff1b;對(duì)于 interrupt,它指向被中斷的指令的下一條指令。)
  • 根據(jù) trap 的種類設(shè)置 mcausem,并根據(jù)需要為 mtval 設(shè)置附加信息。
  • 將 trap發(fā)生之前的權(quán)限模式保存在 mstatus 的 MPP 域中,再把 hart 權(quán)限模式更改為M(也就是說無論在任何 Level 下觸發(fā) trap, hart首先切換到 Machine 模式)

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

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

退出 trap:編程調(diào)用 MRET 指令

  • 針對(duì)不同權(quán)限級(jí)別下有各自退出trap的返回指令xRET (x=M/S/U)
  • 以在M模式下指令mret指令為例,會(huì)執(zhí)行開中斷(mstatus.MIE = mstatus.MPIE; mstatus.MPIE = 1),然后返回進(jìn)入trap之前的指令,如果是中斷的話返回進(jìn)入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 /*-----------------------------------------------------------*/

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。