chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

riscv中g(shù)d32vf103的中斷行為分析

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

掃碼添加小助手

加入工程師交流群

riscv底層原理分析gd32vf103的中斷行為

1.概述

2.中斷向量表初始化

3.詳細(xì)分析一下irq_entry

4.關(guān)于gd32vf103中斷編程模型的理解

1.概述在處理riscv處理器中斷的時(shí)候,需要弄清楚兩個(gè)概念:

1.向量中斷

2.非向量中斷

對(duì)于向量中斷,其中斷發(fā)生后,pc指針會(huì)根據(jù)中斷的類型跳轉(zhuǎn)到基地址+中斷號(hào)*4的地址處去執(zhí)行中斷處理程序,做過(guò)stm32的,應(yīng)該比較清楚向量中斷的大概樣子。當(dāng)然,riscv也是支持這種向量中斷,這樣每個(gè)地址處會(huì)安排一個(gè)特定的中斷處理函數(shù),當(dāng)中斷發(fā)生后,跳轉(zhuǎn)到特定的函數(shù)去執(zhí)行即可。

對(duì)于非向量中斷,則表示中斷發(fā)生后只有一個(gè)入口,需要在這一個(gè)中斷中去判斷具體中斷號(hào),這種行為可以在常見(jiàn)的mips處理器、sparc處理器中看到。

既然riscv支持這兩種中斷處理方式,正好gd32vf103的庫(kù)函數(shù)也實(shí)現(xiàn)了這兩種機(jī)制,那么就徹底的分析一下實(shí)現(xiàn)的策略。

2.中斷向量表初始化任何代碼在最初的匯編級(jí)別的初始化時(shí),都會(huì)指定向量的基地址。當(dāng)然riscv也不例外。

對(duì)于向量中斷來(lái)說(shuō)

/*

* Intialize ECLIC vector interrupt

* base address mtvt to vector_base

*/

la t0, vector_base

csrw CSR_MTVT, t0

這里的理解就向mtvt寄存器中存放vector_base,該處存放向量地址入口,每個(gè)向量中斷發(fā)生,則根據(jù)偏移執(zhí)行對(duì)應(yīng)的函數(shù)。

.globl vector_base

.type vector_base, @object

vector_base:

#if defined(DOWNLOAD_MODE) && (DOWNLOAD_MODE != DOWNLOAD_MODE_FLASH)

j _start /* 0: Reserved, Jump to _start when reset for ILM/FlashXIP mode.*/

.align LOG_REGBYTES /* Need to align 4 byte for RV32, 8 Byte for RV64 */

#else

DECLARE_INT_HANDLER default_intexc_handler /* 0: Reserved, default handler for Flash download mode */

#endif

DECLARE_INT_HANDLER default_intexc_handler /* 1: Reserved */

DECLARE_INT_HANDLER default_intexc_handler /* 2: Reserved */

DECLARE_INT_HANDLER eclic_msip_handler /* 3: Machine software interrupt */

DECLARE_INT_HANDLER default_intexc_handler /* 4: Reserved */

DECLARE_INT_HANDLER default_intexc_handler /* 5: Reserved */

。

對(duì)于向量函數(shù)的處理,不用過(guò)多介紹。

下面非向量中斷的入口

/*

* Set ECLIC non-vector entry to be controlled

* by mtvt2 CSR register.

* Intialize ECLIC non-vector interrupt

* base address mtvt2 to irq_entry.

*/

la t0, irq_entry

csrw CSR_MTVT2, t0

csrs CSR_MTVT2, 0x1

其中irq_entry表示了非向量的處理過(guò)程。csrs CSR_MTVT2, 0x1該指令的解析如下:

mtvt2[0] = 1 mtvt2[0]為0時(shí),中斷入口使用mtvec寄存器,mtvt2[0]為1時(shí),中斷入口為mtvt2[31:2]。

3.詳細(xì)分析一下irq_entry分析非向量中斷的行為,可以更好的理解riscv的中斷底層的處理機(jī)制。

.global irq_entry

/* This label will be set to MTVT2 register */

irq_entry:

/* Save the caller saving registers (context) */

SAVE_CONTEXT

/* Save the necessary CSR registers */

SAVE_CSR_CONTEXT

/* This special CSR read/write operation, which is actually

* claim the CLIC to find its pending highest ID, if the ID

* is not 0, then automatically enable the mstatus.MIE, and

* jump to its vector-entry-label, and update the link register

*/

csrrw ra, CSR_JALMNXTI, ra

/* Critical section with interrupts disabled */

DISABLE_MIE

/* Restore the necessary CSR registers */

RESTORE_CSR_CONTEXT

/* Restore the caller saving registers (context) */

RESTORE_CONTEXT

/* Return to regular code */

mret

從中斷處理的原理上來(lái)講,中斷處理分三部分:

1.保存當(dāng)前現(xiàn)場(chǎng)

2.進(jìn)入中斷處理函數(shù)

3.恢復(fù)現(xiàn)場(chǎng)

其中SAVE_CONTEXT確實(shí)是保存上下文現(xiàn)場(chǎng)的方式。

.macro SAVE_CONTEXT

csrrw sp, CSR_MSCRATCHCSWL, sp

/* Allocate stack space for context saving */

#ifndef __riscv_32e

addi sp, sp, -20*REGBYTES

#else

addi sp, sp, -14*REGBYTES

#endif /* __riscv_32e */

STORE x1, 0*REGBYTES(sp)

STORE x4, 1*REGBYTES(sp)

STORE x5, 2*REGBYTES(sp)

STORE x6, 3*REGBYTES(sp)

STORE x7, 4*REGBYTES(sp)

STORE x10, 5*REGBYTES(sp)

STORE x11, 6*REGBYTES(sp)

STORE x12, 7*REGBYTES(sp)

STORE x13, 8*REGBYTES(sp)

STORE x14, 9*REGBYTES(sp)

STORE x15, 10*REGBYTES(sp)

#ifndef __riscv_32e

STORE x16, 14*REGBYTES(sp)

STORE x17, 15*REGBYTES(sp)

STORE x28, 16*REGBYTES(sp)

STORE x29, 17*REGBYTES(sp)

STORE x30, 18*REGBYTES(sp)

STORE x31, 19*REGBYTES(sp)

#endif /* __riscv_32e */

.endm

按照riscv的數(shù)據(jù)模型,又分為I數(shù)據(jù)模型和E數(shù)據(jù)模型,這部分在riscv的MISA寄存器中有描述。簡(jiǎn)而言之,E數(shù)據(jù)模型會(huì)比I數(shù)據(jù)模型少一半的寄存器,E數(shù)據(jù)模型是專門(mén)針對(duì)嵌入式應(yīng)用場(chǎng)景的,更少的寄存器意味著更快速的壓棧和出棧,實(shí)時(shí)性相應(yīng)會(huì)更加優(yōu)秀。

I數(shù)據(jù)模型一共有32個(gè)寄存器,而E數(shù)據(jù)模型是16個(gè)寄存器。

所以在進(jìn)行中斷入棧的時(shí)候,E數(shù)據(jù)模型會(huì)壓入10個(gè)寄存器。

1e2c2764-9d0e-11eb-8b86-12bb97331649.png

caller代表中斷上層函數(shù)可以使用的寄存器,所以

x1,x5,x6,x7,x10,x11,x12,x13,x14,x15

這10個(gè)寄存器會(huì)保存,上述程序多保存了x4。

下面理解一下中斷的處理,通過(guò)csrrw ra, CSR_JALMNXTI, ra該指令進(jìn)行分析。

不難發(fā)現(xiàn),這個(gè)是個(gè)芯來(lái)自定義擴(kuò)展指令,CSR_JALMNXTI寄存器通過(guò)gdb解析可以看到如下的數(shù)據(jù)

213dce62-9d0e-11eb-8b86-12bb97331649.png

其中0x7ed則是該寄存器的地址。

那么一條指令是如何實(shí)現(xiàn)中斷的處理的呢?

實(shí)際上該指令首先會(huì)判斷當(dāng)前eclic中是否有掛起未處理的中斷,如果沒(méi)有,那這條指令向下執(zhí)行,并不會(huì)處理任何事情,一旦存在,那么會(huì)跳轉(zhuǎn)到eclic的中斷向量的入口,這里便是關(guān)鍵的地方了。

另外需要注意的是,默認(rèn)進(jìn)入中斷時(shí),保存現(xiàn)場(chǎng)時(shí),此處是關(guān)閉中斷的,當(dāng)執(zhí)行這條語(yǔ)句,中斷便會(huì)開(kāi)啟,然后判斷是否還有中斷未響應(yīng),這樣可以達(dá)到中斷咬尾的效果。

并且當(dāng)中斷處理函數(shù)執(zhí)行完成后,又會(huì)回到該指令執(zhí)行一次,判斷是否還需要處理中斷。這一切的行為都是由硬件完成,大大提高中斷處理的效率。

現(xiàn)場(chǎng)恢復(fù)則是中斷處理的逆過(guò)程,這里不贅述。

4.關(guān)于gd32vf103中斷編程模型的理解對(duì)于cortex-m3等處理器來(lái)說(shuō),riscv的底層模型似乎更加復(fù)雜一些,但是實(shí)際上弄清楚riscv中斷處理模型,eclic中斷處理機(jī)制,以及向量中斷,非向量中斷和一條中斷處理指令csrrw ra, CSR_JALMNXTI, ra后,也不會(huì)覺(jué)得十分的難以理解。

玩gd32vf103,其riscv底層匯編級(jí)別的中斷處理一般都不會(huì)太多需要修改的,理解就可以。需要使用好的是eclic配置,還有相關(guān)的gpio的中斷引腳的配置即可。將中斷線、eclic配置完成,具體中斷處理函數(shù)中實(shí)現(xiàn)自己的業(yè)務(wù)邏輯即可,不需要有許多學(xué)習(xí)成本。

原文標(biāo)題:從riscv底層原理分析gd32vf103的中斷行為

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

責(zé)任編輯:haq

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

    關(guān)注

    5208

    文章

    20620

    瀏覽量

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

    關(guān)注

    49

    文章

    2939

    瀏覽量

    53512
  • GD32VF103
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    1074

原文標(biāo)題:從riscv底層原理分析gd32vf103的中斷行為

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    gd32vf103r-start和gd32vf103c-start區(qū)別是什么?

    gd32vf103r-start和gd32vf103c-start區(qū)別,我將c-start板的led代碼下進(jìn)r-start板里,led沒(méi)有亮,這是什么原因。我是直接操作IO口,因此和led口的宏定義應(yīng)該無(wú)關(guān)。
    發(fā)表于 11-11 06:49

    GD32VF103 沒(méi)有Backup RAM 和 Data Flash這樣的區(qū)域嘛?

    剛開(kāi)始接觸risc-v單片機(jī),感覺(jué)GD32VF103還不錯(cuò),還買(mǎi)了rv-star開(kāi)發(fā)板打算學(xué)習(xí)一下。我在datasheet上看到了DataFlash沒(méi)有,但沒(méi)看到backup Ram(reset后RAM里的數(shù)據(jù)不丟失)的區(qū)域定義, 問(wèn)一下,沒(méi)有backup Ram這樣的區(qū)域嘛?
    發(fā)表于 11-07 06:58

    GD32VF103設(shè)備電子簽名讀出來(lái)不對(duì)是怎么回事?

    GD32VF103 設(shè)備電子簽名 讀出來(lái)不對(duì)?
    發(fā)表于 11-07 06:44

    如何使用JLINK連接上GD32VF103VBT6?

    如何使用JLINK連接上GD32VF103VBT6,求大神們指點(diǎn)下,GDLINK的速度實(shí)在慘不忍睹!
    發(fā)表于 11-07 06:43

    使用VScode的PIO開(kāi)發(fā)GD32VF103,但是串口無(wú)法打印浮點(diǎn)數(shù)怎么解決?

    我最近在使用VScode的PIO開(kāi)發(fā)GD32V,使用的是longan的模板,但是我將串口輸出重定義到printf函數(shù),發(fā)現(xiàn)無(wú)法使用%f輸出浮點(diǎn)數(shù),想問(wèn)問(wèn)應(yīng)該怎么配置,我看到的一種說(shuō)法是在
    發(fā)表于 11-06 06:49

    GD RV-START開(kāi)發(fā)板點(diǎn)燈程序下載時(shí)openocd出錯(cuò)

    廢話不多說(shuō)。最近在線培訓(xùn)買(mǎi)的板子,GD32VF103VB,按照教程 https://www.riscv
    發(fā)表于 11-05 12:40

    SES+JLink+最小系統(tǒng)板開(kāi)發(fā)實(shí)踐之Benchmark

    =2.4584 GD32VF103相較于STM32F1性能提升為20%左右 Coremark:STM32F3=245/72 =3.4027 GD32VF103相較于STM32F3性能差距為10%左右
    發(fā)表于 11-05 10:58

    Linux搭建平臺(tái)

    =gd32vf103 BOARD=gd32vf103v_rvstar cleanmake SOC=gd32vf103 BOARD=gd32vf103v_rvstar 依賴有: sudo
    發(fā)表于 11-05 09:00

    GD32VF103串口讀取PM2.5傳感器

    (); // 參考上一篇 【分享】 GD32VF103串口收發(fā)實(shí)驗(yàn)(中斷方式) ,將其中的中斷處理部分去除int plantower(){uint8_t buffer[32];// 初始化接收緩存int
    發(fā)表于 11-05 08:34

    在qemu上體驗(yàn)芯來(lái)RISC-V處理器運(yùn)行鴻蒙LiteOS-M內(nèi)核

    ,qemu目前不能使用實(shí)體按鍵,所以需要屏蔽。 kernel_liteos_m/targets/riscv_nuclei_gd32vf103_soc_gcc/Src/main.c 屏蔽掉這里就可以了
    發(fā)表于 10-31 09:04

    riscv底層原理分析gd32vf103中斷行為

    riscv底層原理分析gd32vf103中斷行為 1.概述 2.中斷向量表初始化 3.詳細(xì)分析
    發(fā)表于 10-31 08:04

    RVMCU課堂「12」: 手把手教你玩轉(zhuǎn)RVSTAR—外部中斷

    有多個(gè)外部中斷源,具體包含哪些外部中斷,可以在GD32VF103用戶手冊(cè)的第六章:中斷/事件控制器(EXTI)查看。 本次實(shí)驗(yàn)使用用戶按鍵
    發(fā)表于 10-31 07:39

    淺析riscv的plic與eclic

    科技設(shè)計(jì)的一種中斷處理方式。 eclic目前也是眾多芯來(lái)科技core采用的中斷控制器,也包括gd32vf103系列的芯片。 3號(hào)中斷是內(nèi)核TIMER單元生成的軟件
    發(fā)表于 10-31 07:23

    RVMCU課堂「20」: 手把手教你玩轉(zhuǎn)RVSTAR—實(shí)時(shí)時(shí)鐘RTC篇

    ,當(dāng)系統(tǒng)復(fù)位或者從待機(jī)模式喚醒時(shí),RTC的設(shè)置和時(shí)間也都保持不變。本期內(nèi)容將通過(guò)一個(gè)顯示當(dāng)前時(shí)間的例程帶領(lǐng)大家初步了解GD32VF103的RTC外設(shè)的使用方法。 系統(tǒng)環(huán)境 Windows
    發(fā)表于 10-29 08:10

    RVMCU課堂「24」: 手把手教你玩轉(zhuǎn)RVSTAR—PMU應(yīng)用篇

    的相互沖突獲得最佳折衷。如圖3-1.電源域概覽所示,GD32VF103系列設(shè)備有三個(gè)電源域,包括VDD/VDDA域,1.2V域和備份域。VDD域由電源VDD直接供電。在VDD/VDDA域中嵌入了一個(gè)
    發(fā)表于 10-28 08:10