0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

riscv中gd32vf103的中断行为分析

嵌入式IoT 来源:嵌入式IoT 作者:嵌入式IoT 2021-04-15 13:55 次阅读

riscv底层原理分析gd32vf103的中断行为

1.概述

2.中断向量表初始化

3.详细分析一下irq_entry

4.关于gd32vf103中断编程模型的理解

1.概述在处理riscv处理器中断的时候,需要弄清楚两个概念:

1.向量中断

2.非向量中断

对于向量中断,其中断发生后,pc指针会根据中断的类型跳转到基地址+中断号*4的地址处去执行中断处理程序,做过stm32的,应该比较清楚向量中断的大概样子。当然,riscv也是支持这种向量中断,这样每个地址处会安排一个特定的中断处理函数,当中断发生后,跳转到特定的函数去执行即可。

对于非向量中断,则表示中断发生后只有一个入口,需要在这一个中断中去判断具体中断号,这种行为可以在常见的mips处理器、sparc处理器中看到。

既然riscv支持这两种中断处理方式,正好gd32vf103的库函数也实现了这两种机制,那么就彻底的分析一下实现的策略。

2.中断向量表初始化任何代码在最初的汇编级别的初始化时,都会指定向量的基地址。当然riscv也不例外。

对于向量中断来说

/*

* Intialize ECLIC vector interrupt

* base address mtvt to vector_base

*/

la t0, vector_base

csrw CSR_MTVT, t0

这里的理解就向mtvt寄存器中存放vector_base,该处存放向量地址入口,每个向量中断发生,则根据偏移执行对应的函数。

.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 */

对于向量函数的处理,不用过多介绍。

下面非向量中断的入口

/*

* 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表示了非向量的处理过程。csrs CSR_MTVT2, 0x1该指令的解析如下:

mtvt2[0] = 1 mtvt2[0]为0时,中断入口使用mtvec寄存器,mtvt2[0]为1时,中断入口为mtvt2[31:2]。

3.详细分析一下irq_entry分析非向量中断的行为,可以更好的理解riscv的中断底层的处理机制。

.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

从中断处理的原理上来讲,中断处理分三部分:

1.保存当前现场

2.进入中断处理函数

3.恢复现场

其中SAVE_CONTEXT确实是保存上下文现场的方式。

.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的数据模型,又分为I数据模型和E数据模型,这部分在riscv的MISA寄存器中有描述。简而言之,E数据模型会比I数据模型少一半的寄存器,E数据模型是专门针对嵌入式应用场景的,更少的寄存器意味着更快速的压栈和出栈,实时性相应会更加优秀。

I数据模型一共有32个寄存器,而E数据模型是16个寄存器。

所以在进行中断入栈的时候,E数据模型会压入10个寄存器。

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

caller代表中断上层函数可以使用的寄存器,所以

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

这10个寄存器会保存,上述程序多保存了x4。

下面理解一下中断的处理,通过csrrw ra, CSR_JALMNXTI, ra该指令进行分析。

不难发现,这个是个芯来自定义扩展指令,CSR_JALMNXTI寄存器通过gdb解析可以看到如下的数据

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

其中0x7ed则是该寄存器的地址。

那么一条指令是如何实现中断的处理的呢?

实际上该指令首先会判断当前eclic中是否有挂起未处理的中断,如果没有,那这条指令向下执行,并不会处理任何事情,一旦存在,那么会跳转到eclic的中断向量的入口,这里便是关键的地方了。

另外需要注意的是,默认进入中断时,保存现场时,此处是关闭中断的,当执行这条语句,中断便会开启,然后判断是否还有中断未响应,这样可以达到中断咬尾的效果。

并且当中断处理函数执行完成后,又会回到该指令执行一次,判断是否还需要处理中断。这一切的行为都是由硬件完成,大大提高中断处理的效率。

现场恢复则是中断处理的逆过程,这里不赘述。

4.关于gd32vf103中断编程模型的理解对于cortex-m3等处理器来说,riscv的底层模型似乎更加复杂一些,但是实际上弄清楚riscv中断处理模型,eclic中断处理机制,以及向量中断,非向量中断和一条中断处理指令csrrw ra, CSR_JALMNXTI, ra后,也不会觉得十分的难以理解。

玩gd32vf103,其riscv底层汇编级别的中断处理一般都不会太多需要修改的,理解就可以。需要使用好的是eclic配置,还有相关的gpio的中断引脚的配置即可。将中断线、eclic配置完成,具体中断处理函数中实现自己的业务逻辑即可,不需要有许多学习成本。

原文标题:从riscv底层原理分析gd32vf103的中断行为

文章出处:【微信公众号:嵌入式IoT】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5065

    文章

    18998

    浏览量

    302652
  • RISC-V
    +关注

    关注

    44

    文章

    2222

    浏览量

    45985
  • GD32VF103
    +关注

    关注

    0

    文章

    5

    浏览量

    812

原文标题:从riscv底层原理分析gd32vf103的中断行为

文章出处:【微信号:Embeded_IoT,微信公众号:嵌入式IoT】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    RISC-V内核的32位通用微控制器 GD32VF103芯片简介

    1. 芯片简介 GD32VF103系列MCU是基于RISC-V内核的32位通用微控制器,具备均衡的处理效能和系统资源,适用于工业控制、消费电子、新兴IoT等嵌入式市场应用。 内核:芯来
    发表于 10-23 06:46

    GD32F103 Keil和IAR pack包

    电子发烧友网站提供《GD32F103 Keil和IAR pack包.rar》资料免费下载
    发表于 10-15 17:25 5次下载

    GD32 MCU 移植教程】7、从 GD32F10x 移植到 GD32E103

    本应用笔记旨在帮助您快速将基于 GD32F10x 2.0 版本及以上固件库开发的应用程序从GD32F10x 系列微控制器移植到 GD32E103 系列微控制器。GD32E103
    的头像 发表于 09-05 09:40 403次阅读
    【<b class='flag-5'>GD</b>32 MCU 移植教程】7、从 <b class='flag-5'>GD</b>32F10x 移植到 <b class='flag-5'>GD32E103</b>

    GD32F103xxArm®Cortex®-M3 32位MCU芯片手册

    电子发烧友网站提供《GD32F103xxArm®Cortex®-M3 32位MCU芯片手册.pdf》资料免费下载
    发表于 05-22 14:13 4次下载

    日本或对谷歌采取反垄断行

    日本或对谷歌采取反垄断行动 据外媒报道日本计划就搜索广告的垄断行为对谷歌采取反垄断行动。据悉日本公平交易委员会此前就一直在调查谷歌向雅虎提供的关键词定向搜索广告技术;以推动谷歌改革其商业行为
    的头像 发表于 04-17 16:35 326次阅读

    Venmo反垄断案被否,苹果无反垄断行为判定

    文件指出,原告未能证明具体的反垄断行为以及为何未将Zelle等竞争者纳入起诉范围。同时,文件形容这起诉讼为“推测性的”,并列举出法院认定的若干问题。
    的头像 发表于 03-28 10:15 347次阅读

    GD32 MCU是如何进入中断函数的

    用过GD32 MCU的小伙伴们都知道,程序是顺序执行的,但当有中断来的时候程序会跳转到中断函数,执行完中断函数后程序又继续回到原来的位置继续执行,那么你们知道MCU是如何找到
    的头像 发表于 01-30 09:45 972次阅读
    <b class='flag-5'>GD</b>32 MCU是如何进入<b class='flag-5'>中断</b>函数的

    求助,关于nuclei studio调试GD32VF103的疑问

    使用自带的工程模版时发现链接ld文件是把代码放在flash里,但是jlink debug配置startup里 “RAM application” 选项被勾选, 并且取消勾选“Initial Reset and Halt” 选项。 这个是为什么呢?
    发表于 01-24 07:27

    GD32如何配置中断优先级分组以及中断优先级

    使用GD32 MCU的过程,大家可能会有以下疑问:中断优先级如何配置和使用?
    的头像 发表于 01-10 10:30 2912次阅读
    <b class='flag-5'>GD</b>32如何配置<b class='flag-5'>中断</b>优先级分组以及<b class='flag-5'>中断</b>优先级

    gd32vf103根据例子配置了systick和adc中断,但是adc中断无法抢占systick是为什么?

    根据例子配置了systick和adc中断,但是adc中断无法抢占systick 配置为向量和非相量都没有实现
    发表于 01-10 07:43

    GD32VF103怎么输出系统时钟SYS_CLK,时钟是通过哪个引脚输出的?

    我想测试一下芯片时钟的精确性,需要将系统时钟输出,请问GD32VF103的时钟是通过哪个引脚输出的?以下是配置输出时钟为系统时钟,但不知道这个时钟是通过MCU的哪个引脚输出的?
    发表于 01-10 07:28

    DDR200T开发板FPGA模块和gd32vf103之间是通过什么传输数据的?

    目前想要通过DDR200T开发板做一个基于FPGA的卷积神经网络软硬协同加速器 DDR200T开发板FPGA模块用的是xc7a200t和gd32vf103(mcu)之间是通过什么传输数据的? 是通过AXI总线进行传输的么?有没有大佬有DDR200t开发板这两个模块的交互
    发表于 01-10 06:28

    gd32f103rct6引脚功能

    GD32F103RCT6是一款由GigaDevice推出的针对嵌入式应用的32位ARM Cortex-M3微控制器。它是一款性价比高、功能丰富的微控制器,集成了强大的处理能力和丰富的外设接口,适用于
    的头像 发表于 12-18 18:11 2486次阅读

    GD32F103移植STM32F103代码

    使用相同FLASH和管脚数量相同的芯片,例如GDF103C8T6移植STM32F103C8T6程序。虽然两个款芯片的寄存器地址以及架构基本相同。但是需要注意的是GD32F10x主频是108兆,但是STM32F10x主频是72兆。
    的头像 发表于 12-15 13:37 1571次阅读
    在<b class='flag-5'>GD32F103</b>移植STM32F<b class='flag-5'>103</b>代码

    gd32f103可以完全替代stm32f103

    GD32F103是中国厂商GigaDevice推出的一款低成本、高性能的微控制器产品线。STM32F103是意法半导体(STMicroelectronics)的旗舰产品之一,享有良好的声誉和广泛
    的头像 发表于 12-07 11:26 4926次阅读