91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

opensbi下的riscv64裸機(jī)編程:中斷與異常

嵌入式IoT ? 來(lái)源:嵌入式IoT ? 作者:嵌入式IoT ? 2021-01-07 10:30 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

opensbi下的riscv64裸機(jī)編程2(中斷與異常)

1.本文說(shuō)明

2.riscv特權(quán)模式下的異常

2.1 CSPs

2.2 異常開關(guān)的寄存器

2.3 與中斷相關(guān)的指令

3.中斷測(cè)試

3.1 設(shè)置中斷向量表

3.2 開啟中斷設(shè)置

3.3 初始化timer

3.4 開啟中斷

3.5 中斷處理

4.測(cè)試及校驗(yàn)

5.總結(jié)

1.本文說(shuō)明

任何時(shí)候,中斷和異常的產(chǎn)生都是十分值得關(guān)注的,這些將破壞程序原有的執(zhí)行邏輯。按照芯片的設(shè)計(jì)來(lái)說(shuō),中斷和異常大致上可以分為三類異常(Exception)、陷入(Trap)、外部中斷(Interrupt)。

異常(Exception)

在一條指令執(zhí)行的過(guò)程中發(fā)生了錯(cuò)誤,可以通過(guò)異常處理函數(shù)進(jìn)行處理,最常見的異常包括無(wú)效的內(nèi)存地址訪問、非法指令異常、缺頁(yè)異常等等。當(dāng)發(fā)生這些異常后可以進(jìn)行處理。

陷入(Trap)

主動(dòng)的讓其進(jìn)入異常處理函數(shù),常見的是系統(tǒng)調(diào)用syscall。而在riscv上為ecall或者進(jìn)入斷點(diǎn)的ebreak。

外部中斷(Interrupt)

一般由外部事件觸發(fā),比如定時(shí)器中斷、GPIO中斷等。這些異常是不可預(yù)知的。

對(duì)于一般的中斷處理流程,進(jìn)入中斷后需要進(jìn)行上下文的保存與恢復(fù)。

2.riscv特權(quán)模式下的異常

涉及到中斷和異常,RISCV的特權(quán)模式是不能繞開的。在RISCV中,無(wú)論在任何模式發(fā)生的異常,硬件線程都會(huì)將控制權(quán)交給M-Mode的異常處理程序。然而對(duì)于類Unix的操作系統(tǒng)來(lái)說(shuō),異常都是由操作系統(tǒng)來(lái)處理。而操著系統(tǒng)運(yùn)行的模式是S-Mode,所以RISCV也可以選擇將異常重新導(dǎo)向到S-Mode,也支持異常委托機(jī)制(Machine Interrupt Delegaintion)將異常直接通過(guò)S-Mode進(jìn)行處理,這樣可以大大的增加操作系統(tǒng)的靈活性。

33788338-5074-11eb-8b86-12bb97331649.png

一般來(lái)說(shuō)M-Mode是必須實(shí)現(xiàn)的,S-Mode也一般會(huì)有,而U-Mode是選擇性擴(kuò)展的。目前的RISCV芯片中例如蜂鳥的E203與K210都只支持了RISCV架構(gòu)中的Machine Mode。

2.1 CSPs

實(shí)際上RISCV在實(shí)現(xiàn)系統(tǒng)指令集的時(shí)候,是支持多種模式的擴(kuò)展的,這一系列的指令集通過(guò)Control and Status Registers (CSRs)來(lái)進(jìn)行控制。

CSR地址是擴(kuò)展了12位,也就是可以設(shè)計(jì)最大4096個(gè)指令。

33cd0dae-5074-11eb-8b86-12bb97331649.png

通過(guò)下面的網(wǎng)站可以看到當(dāng)前CSRs的實(shí)現(xiàn)狀態(tài)。

http://www.five-embeddev.com/quickref/csrs.html

這里只針對(duì)S-Mode下的異常處理進(jìn)行分析,M-Mode下的異常處理類似。

Name Number Feature/Extensions Description
sepc 0x0141 supervisor Supervisor Exception Program Counter
scause 0x0142 supervisor Supervisor Exception Cause
stval 0x0143 supervisor Supervisor bad address or instruction.
stvec 0x0105 supervisor Supervisor Trap Vector Base Address
sstatus 0x0100 supervisor Supervisor Status

Supervisor Exception Program Counter (sepc)

當(dāng)中斷發(fā)生時(shí),存放需要跳轉(zhuǎn)的PC值。這里需要利用stvec提供中斷向量表的基地址。

341d7fc8-5074-11eb-8b86-12bb97331649.png

該寄存器的值是在32位下是4字節(jié)對(duì)齊的。

Supervisor Cause Register (scause)

該寄存器表示中斷發(fā)生的原因。下面的表格中表述了中斷的發(fā)生原因:

Interrupt Exception Code Description
1 0 Reserved
1 1 Supervisor software interrupt
1 2–4 Reserved
1 5 Supervisor timer interrupt
1 6–8 Reserved
1 9 Supervisor external interrupt
1 10–15 Reserved
1 ≥16 Designated for platform use
0 0 Instruction address misaligned
0 1 Instruction access fault
0 2 Illegal instruction
0 3 Breakpoint
0 4 Load address misaligned
0 5 Load access fault
0 6 Store/AMO address misaligned
0 7 Store/AMO access fault
0 8 Environment call from U-mode
0 9 Environment call from S-mode
0 10–11 Reserved
0 12 Instruction page fault
0 13 Load page fault
0 14 Reserved
0 15 Store/AMO page fault
0 16–23 Reserved
0 24–31 Designated for custom use
0 32–47 Reserved
0 48–63 Designated for custom use
0 ≥64 Reserved

Supervisor Trap Value (stval) Register

由于scause不足以表示異常發(fā)生的所有信息,比如發(fā)生了缺頁(yè)異常,就會(huì)將stavl設(shè)置成需要訪問但是不在內(nèi)存中的地址。以便于操作系統(tǒng)將這個(gè)地址加載進(jìn)來(lái)。

Supervisor Trap Vector Base Address Register (stvec)

設(shè)置中斷處理的基地址,同時(shí)設(shè)置模式

345c5ce8-5074-11eb-8b86-12bb97331649.png

對(duì)于基地址的模式有如下兩種:

Value Name Description
0 Direct All exceptions set pc to BASE.
1 Vectored Asynchronous interrupts set pc to BASE+4×cause.
≥2 Reserved

Direct:顧名思義,當(dāng)異常發(fā)生的時(shí)候,每次都會(huì)跳轉(zhuǎn)到這個(gè)地址,然后通過(guò)這個(gè)地址的中斷處理程序去判斷哪種中斷。

Vectored:在這種模式下,會(huì)跳轉(zhuǎn)到BASE + 4 * cause 進(jìn)行處理流程。每種異常的cause都不一樣。

Supervisor Status Register (sstatus)

控制中斷的狀態(tài)等等,也可以控制全局中斷的時(shí)能等等。

351940c4-5074-11eb-8b86-12bb97331649.png

SIE域表示全局中斷使能。當(dāng)該MIE域值為1時(shí),表示所有中斷的全局開關(guān)打開,當(dāng)MIE域的值為0時(shí)候,表示全局關(guān)閉所有中斷。

SPIE用于保存進(jìn)入異常之前MIE域的值。

2.2 異常開關(guān)的寄存器

對(duì)于S-Mode中斷的Enable與Pending,還需要關(guān)注兩個(gè)寄存器。sie與sip。

Supervisor Interrupt Enable(sie)

353dac16-5074-11eb-8b86-12bb97331649.png

Supervisor Interrupt Pending(sip)

358046fc-5074-11eb-8b86-12bb97331649.png

可以看到有三種類型的中斷,由芯片廠家進(jìn)行自定義設(shè)計(jì)。

Supervisor software interrupt

Supervisor timer interrupt

Supervisor external interrupt

2.3 與中斷相關(guān)的指令

CSR Read Write(csrrw)

csrrw dst, csr, src:將指定的CSR寄存器寫入dst,同時(shí)將src的值寫入CSR。

CSR Read(csrr)

csrr dst,csr:讀一個(gè)CSR寄存器到dst。

CSR Clear(csrc)

csrc(i) csr, rs1:將指定的位清零。

CSR Set(csrs)

csrs(i) csr, rs1:將指定的位置一。

3.中斷測(cè)試

由于在qemu上,中斷的產(chǎn)生可以通過(guò)定時(shí)器來(lái)發(fā)生,所以需要理解riscv上對(duì)timer的使用。timer又需要通過(guò)sbi的接口進(jìn)行訪問。

相關(guān)的代碼文件可以參考:

https://github.com/bigmagic123/riscv64_opensbi_baremetal/tree/master/03_interrupt

已經(jīng)實(shí)現(xiàn)了timer中斷的產(chǎn)生過(guò)程。

3.1 設(shè)置中斷向量表

本程序需要設(shè)置中斷向量表,前面提到過(guò),中斷向量的跳轉(zhuǎn)有兩種模式:Direct與Vectored。Direct可以直接轉(zhuǎn)到固定的pc地址,然后由統(tǒng)一的入口進(jìn)行處理,這種比較容易實(shí)現(xiàn),所以設(shè)置為這種模式。

.globaltable_val_set table_val_set: lat0,trap_entry csrwstvec,t0 jrra

直接將trap_entry函數(shù)的入口寫到stvec的寄存器中。由于函數(shù)地址4字節(jié)對(duì)其,所以設(shè)置后模式為Direct。

3.2 開啟中斷設(shè)置

要開啟時(shí)鐘中斷,這樣才能產(chǎn)生時(shí)鐘,而根據(jù)手冊(cè),開啟時(shí)鐘中斷實(shí)際上是設(shè)置Supervisor Interrupt Enable(sie),也就是設(shè)置SIE的寄存器開啟。

353dac16-5074-11eb-8b86-12bb97331649.png

所以只需要設(shè)置即可。

voidenable_timer_interrupt(void) { w_sie(r_sie()|SIE_STIE); }

3.3 初始化timer

對(duì)于timer的填充,其實(shí)就是設(shè)置中斷的值。當(dāng)timer達(dá)到設(shè)定的值后會(huì)產(chǎn)生中斷。

voidset_timer(uint64stime_value) { SBI_TIMER(stime_value); } //getcurrenttime uint64get_cycle() { returnr_time(); } voidclock_set_next_event() { set_timer(get_cycle()+TIMEBASE); }

函數(shù)填充了下一個(gè)tick的值。

3.4 開啟中斷

中斷的開啟通過(guò)sstatus全局的狀態(tài)寄存器設(shè)置。

351940c4-5074-11eb-8b86-12bb97331649.png

通過(guò)設(shè)置SIE位就可以達(dá)到使能或者關(guān)閉中斷的作用。

voidinterrupt_enable(void) { w_sstatus(r_sstatus()|SSTATUS_SIE); }

3.5 中斷處理

中斷處理需要保存當(dāng)前的上下文寄存器(寄存器壓棧操作),然后跳轉(zhuǎn)到中斷處理函數(shù)去處理具體的中斷。當(dāng)處理完成之后返回現(xiàn)場(chǎng)(寄存器出棧)。

這里先不做這么復(fù)雜的工作,中斷產(chǎn)生后直接跳轉(zhuǎn)到中斷處理函數(shù)中,只執(zhí)行一次。

.globaltrap_entry trap_entry: csrra0,scause csrrca1,stval,zero csrra2,sepc mva3,s0 /*scause,stval,sepc,sp*/ callhandle_trap

其中a0為第一個(gè)參數(shù),保存中斷發(fā)生的原因。

a1是中斷發(fā)生的具體信息。

a2表示了中斷異常返回值。

然后進(jìn)入hande_trap。

uintptr_thandle_trap(uintptr_tscause,uintptr_tstval,uintptr_tsepc,uintptr_tsp) { tfp_printf("handle_trap%08lx:%08lx:%08lx:%08lx ",scause,stval,sepc,sp); while(1); return0; }

4.測(cè)試及校驗(yàn)

因?yàn)楣こ涛募脑黾?,所以使用了Makefile進(jìn)行工程的構(gòu)建工作。

%.o:%.c%.s $(CC)$(CFLAGS)-c$

Makefile的語(yǔ)法規(guī)則基本

TARGET…:DEPENDENCIES… COMMAND

這里也不過(guò)多的涉及了。

輸入make后,在fw_bin目錄下執(zhí)行run.sh腳本即可。

最后可以看到中斷的原因

最高位是8,相應(yīng)的中斷描述為Supervisor timer interrupt。

5.總結(jié)

riscv的異常和中斷的處理模式在M-Mode或者S-Mode下都可以設(shè)計(jì),具體要看芯片的設(shè)計(jì)方式,如果設(shè)計(jì)在M-Mode,對(duì)于操作系統(tǒng)來(lái)說(shuō),可以通過(guò)轉(zhuǎn)發(fā)或者代理給S-Mode的操作系統(tǒng),如果S-Mode存在中斷處理,那么處于S-Mode的系統(tǒng)可以直接處理,這樣比較簡(jiǎn)潔。

責(zé)任編輯:xj

原文標(biāo)題:opensbi下的riscv64裸機(jī)編程2(中斷與異常)

文章出處:【微信公眾號(hào):嵌入式IoT】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3689

    瀏覽量

    95250
  • 裸機(jī)
    +關(guān)注

    關(guān)注

    0

    文章

    40

    瀏覽量

    6697
  • RISC-V
    +關(guān)注

    關(guān)注

    46

    文章

    2570

    瀏覽量

    48822

原文標(biāo)題:opensbi下的riscv64裸機(jī)編程2(中斷與異常)

文章出處:【微信號(hào):Embeded_IoT,微信公眾號(hào):嵌入式IoT】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    求助,關(guān)于K230啟動(dòng)流程疑問求解

    ) (riscv64-unknown-linux-gnu-gcc (Xuantie-900 linux-5.10.4 glibc gcc Toolchain V2.6.0 B-20220715) 10.2.0
    發(fā)表于 07-11 06:42

    【Milk-V Duo S 開發(fā)板免費(fèi)體驗(yàn)】2 - 安裝編譯環(huán)境并測(cè)試Hello world!

    ARM64 2. RISCV64 Which would you like: 我使用的是 RISCV 系統(tǒng),則選擇 2。 這個(gè)腳本會(huì)克隆GitHub - milkv-duo/host-tools,不過(guò)只有
    發(fā)表于 07-07 21:18

    【Milk-V Duo S 開發(fā)板免費(fèi)體驗(yàn)】應(yīng)用開發(fā)環(huán)境搭建

    選擇 2。 由于 DuoS 支持 RISCV 和 ARM 兩種架構(gòu),還需要按提示繼續(xù)選擇: Select Arch: 1. ARM64 2. RISCV64 Which would you like
    發(fā)表于 07-01 21:22

    【M-K1HSE開發(fā)板免費(fèi)體驗(yàn)】超高性能與顏值RISCV64位8核視美泰M-K1HSE開發(fā)板

    【超高性能與顏值RISCV64位8核視美泰M-K1HSE開發(fā)板】 https://www.bilibili.com/video/BV1dQKZzsERi/?share_source
    發(fā)表于 06-26 23:14

    請(qǐng)問Openvino是否支持 Risc-V (riscv64) 架構(gòu)?

    在spacemit k1型板(bpi-f3)上編譯OpenVINO?,但失敗。 使用 riscv64 構(gòu)建OpenVINO?并崩潰。
    發(fā)表于 06-24 07:26

    在starvision2上移植FreeRTOS,objdump后發(fā)現(xiàn)static變量的地址是0,怎么解決?

    truncated to fit: R_RISCV_HI20 against `TaskBnum.5' (這個(gè)main.c是我從一個(gè)移植教程里面偷來(lái)的) 我查了一,說(shuō)可能是
    發(fā)表于 03-10 07:21

    基于OpenSBI的linux nommu實(shí)現(xiàn)

    Linux內(nèi)核6.10提供了對(duì)沒有mmu的riscv處理器工作在S模式的內(nèi)核的支持,本文介紹基于OpenSBI的linuxnommu的實(shí)現(xiàn),供大家參考。1、OpenSBI介紹SBI
    的頭像 發(fā)表于 02-08 13:43 ?668次閱讀
    基于<b class='flag-5'>OpenSBI</b>的linux nommu實(shí)現(xiàn)

    如何快速入門HAL庫(kù)編程 HAL庫(kù)與裸機(jī)編程的比較

    如何快速入門HAL庫(kù)編程 要快速入門HAL庫(kù)編程,可以遵循以下步驟: 了解基礎(chǔ)知識(shí) : 掌握C語(yǔ)言編程基礎(chǔ),包括變量、數(shù)據(jù)類型、函數(shù)、指針等。 了解嵌入式系統(tǒng)的基本概念,如微控制器、中斷
    的頭像 發(fā)表于 12-02 11:39 ?1135次閱讀

    【「RISC-V體系結(jié)構(gòu)編程與實(shí)踐」閱讀體驗(yàn)】-- SBI及NEMU環(huán)境

    。 我覺得這也是本書的一個(gè)亮點(diǎn),從最底層最簡(jiǎn)單的裸機(jī)開始,一步步對(duì)其擴(kuò)展和完善,而不是直接從OpenSBI開始,這樣更容易理解底層的一些細(xì)節(jié)。 NEMU環(huán)境介紹及搭建 RISCV-V的實(shí)驗(yàn)環(huán)境搭建
    發(fā)表于 11-26 09:37

    用GNU構(gòu)建裸機(jī)系統(tǒng)

    基于AT91SAM7S平臺(tái),介紹裸機(jī)開發(fā),以閃燈為藍(lán)本,涉及匯編、鏈接、C/C++、中斷等。   無(wú)處不在的ARM處理器家族得到了GNU C/C++工具鏈的良好支持。雖然許多在線和印刷資源關(guān)注
    發(fā)表于 10-16 17:34 ?0次下載

    ARM處理器的異常中斷響應(yīng)過(guò)程

    ARM處理器的異常中斷響應(yīng)是嵌入式系統(tǒng)設(shè)計(jì)中一個(gè)至關(guān)重要的環(huán)節(jié),它確保了系統(tǒng)在面對(duì)內(nèi)部或外部事件時(shí)能夠穩(wěn)定、可靠地運(yùn)行。
    的頭像 發(fā)表于 09-10 11:18 ?2009次閱讀

    freertos和裸機(jī)有什么區(qū)別

    FreeRTOS 和裸機(jī)編程是兩種不同的嵌入式系統(tǒng)開發(fā)方法,它們?cè)谠O(shè)計(jì)理念、資源使用、功能實(shí)現(xiàn)等方面有著顯著的差異。 1. 基本概念 1.1 FreeRTOS FreeRTOS 是一個(gè)小型的、可裁剪
    的頭像 發(fā)表于 09-02 14:13 ?3006次閱讀

    TI C64x+ DSP內(nèi)核異常處理機(jī)制的應(yīng)用

    電子發(fā)燒友網(wǎng)站提供《TI C64x+ DSP內(nèi)核異常處理機(jī)制的應(yīng)用.pdf》資料免費(fèi)下載
    發(fā)表于 08-28 11:54 ?0次下載
    TI C<b class='flag-5'>64</b>x+ DSP內(nèi)核<b class='flag-5'>異常</b>處理機(jī)制的應(yīng)用

    嵌入式C編程常用的異常錯(cuò)誤處理

    。 3. 中斷服務(wù)程序 (Interrupt Service Routines, ISR) 在嵌入式系統(tǒng)中,中斷是處理異常情況的常用方法。ISR用于處理硬件中斷,并確保系統(tǒng)在
    發(fā)表于 08-06 14:32

    plc突然斷電會(huì)導(dǎo)致什么異常

    PLC(Programmable Logic Controller,可編程邏輯控制器)是一種廣泛應(yīng)用于工業(yè)自動(dòng)化領(lǐng)域的控制器。當(dāng)PLC突然斷電時(shí),可能會(huì)導(dǎo)致一些異常情況,這些異常情況可能
    的頭像 發(fā)表于 07-25 10:11 ?2780次閱讀
    主站蜘蛛池模板: 99综合色| 六月丁香色婷婷 | 天天做天天摸天天爽天天爱 | 在线观看国产精美视频 | 青草青青视频 | 久久夜色精品国产噜噜 | 综综综综合网 | 色婷婷综合和线在线 | 真爽~张开腿~让我插 | 五月丁香六月综合缴清无码 | www在线视频观看 | 久久久精品久久久久久久久久久 | 91p0rn永久备用地址二 | 华人永久免费视频 | 大尺度视频在线观看 | 婷婷6月| 午夜大片免费完整在线看 | 欧美黑人性受xxxx喷水 | 熊出没之环球大冒险旧版免费观看 | 在线黄视频 | 欧美黄色大片免费观看 | 免费黄色大片在线观看 | bt天堂电影 | 又粗又长又爽又长黄免费视频 | 最近免费hd | 欧美高清激情毛片 | 亚洲成a人v在线观看 | 一级a级国产不卡毛片 | 男人天堂网在线播放 | 91大神在线精品网址 | 色无欲天天天影视综合网 | 99热久久国产精品 | 四虎国产精品高清在线观看 | 一本大道香蕉大vr在线吗视频 | 最新国产在线播放 | 久久国产香蕉一区精品 | 国产人人艹 | 大黄一级片 | 人人干日日操 | 日日添天天做天天爱 | 六月天色婷婷 |