查看: 1046|回复: 0
收起左侧

嵌入式IoT[02]_从riscv底层原理分析gd32vf103的中断行为

[复制链接]

  离线 

  • TA的每日心情
    慵懒
    2021-7-23 17:16
  • 签到天数: 17 天

    [LV.4]

    发表于 2021-5-18 15:49:46 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 草帽王子 于 2021-5-18 15:49 编辑

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

    1.概述
    2.中断向量表初始化
    3.详细分析一下irq_entry
    4.关于gd32vf103中断编程模型的理解


    1.概述

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

    1.向量中断

    2.非向量中断

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

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

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


    2.中断向量表初始化

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

    对于向量中断来说
    1. /*
    2.      * Intialize ECLIC vector interrupt
    3.      * base address mtvt to vector_base
    4.      */
    5.     la t0, vector_base
    6.     csrw CSR_MTVT, t0
    复制代码
    这里的理解就向mtvt寄存器中存放vector_base,该处存放向量地址入口,每个向量中断发生,则根据偏移执行对应的函数。

    1.    .globl vector_base
    2.     .type vector_base, @object
    3. vector_base:
    4. #if defined(DOWNLOAD_MODE) && (DOWNLOAD_MODE != DOWNLOAD_MODE_FLASH)
    5.     j _start                                                /* 0: Reserved, Jump to _start when reset for ILM/FlashXIP mode.*/
    6.     .align LOG_REGBYTES                                     /*    Need to align 4 byte for RV32, 8 Byte for RV64 */
    7. #else
    8.     DECLARE_INT_HANDLER     default_intexc_handler          /* 0: Reserved, default handler for Flash download mode */
    9. #endif
    10.     DECLARE_INT_HANDLER     default_intexc_handler          /* 1: Reserved */
    11.     DECLARE_INT_HANDLER     default_intexc_handler          /* 2: Reserved */
    12.     DECLARE_INT_HANDLER     eclic_msip_handler              /* 3: Machine software interrupt */

    13.     DECLARE_INT_HANDLER     default_intexc_handler          /* 4: Reserved */
    14.     DECLARE_INT_HANDLER     default_intexc_handler          /* 5: Reserved */
    15.     .
    16.     .
    17.     .
    复制代码

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

    下面非向量中断的入口
    1. /*
    2.      * Set ECLIC non-vector entry to be controlled
    3.      * by mtvt2 CSR register.
    4.      * Intialize ECLIC non-vector interrupt
    5.      * base address mtvt2 to irq_entry.
    6.      */
    7.     la t0, irq_entry
    8.     csrw CSR_MTVT2, t0
    9.     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的中断底层的处理机制。
    1. .global irq_entry
    2. /* This label will be set to MTVT2 register */
    3. irq_entry:
    4.     /* Save the caller saving registers (context) */
    5.     SAVE_CONTEXT
    6.     /* Save the necessary CSR registers */
    7.     SAVE_CSR_CONTEXT

    8.     /* This special CSR read/write operation, which is actually
    9.      * claim the CLIC to find its pending highest ID, if the ID
    10.      * is not 0, then automatically enable the mstatus.MIE, and
    11.      * jump to its vector-entry-label, and update the link register
    12.      */
    13.     csrrw ra, CSR_JALMNXTI, ra

    14.     /* Critical section with interrupts disabled */
    15.     DISABLE_MIE

    16.     /* Restore the necessary CSR registers */
    17.     RESTORE_CSR_CONTEXT
    18.     /* Restore the caller saving registers (context) */
    19.     RESTORE_CONTEXT

    20.     /* Return to regular code */
    21.     mret
    复制代码

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

    1.保存当前现场
    2.进入中断处理函数
    3.恢复现场

    其中SAVE_CONTEXT确实是保存上下文现场的方式。
    1. .macro SAVE_CONTEXT
    2.     csrrw sp, CSR_MSCRATCHCSWL, sp
    3.     /* Allocate stack space for context saving */
    4. #ifndef __riscv_32e
    5.     addi sp, sp, -20*REGBYTES
    6. #else
    7.     addi sp, sp, -14*REGBYTES
    8. #endif /* __riscv_32e */

    9.     STORE x1, 0*REGBYTES(sp)
    10.     STORE x4, 1*REGBYTES(sp)
    11.     STORE x5, 2*REGBYTES(sp)
    12.     STORE x6, 3*REGBYTES(sp)
    13.     STORE x7, 4*REGBYTES(sp)
    14.     STORE x10, 5*REGBYTES(sp)
    15.     STORE x11, 6*REGBYTES(sp)
    16.     STORE x12, 7*REGBYTES(sp)
    17.     STORE x13, 8*REGBYTES(sp)
    18.     STORE x14, 9*REGBYTES(sp)
    19.     STORE x15, 10*REGBYTES(sp)
    20. #ifndef __riscv_32e
    21.     STORE x16, 14*REGBYTES(sp)
    22.     STORE x17, 15*REGBYTES(sp)
    23.     STORE x28, 16*REGBYTES(sp)
    24.     STORE x29, 17*REGBYTES(sp)
    25.     STORE x30, 18*REGBYTES(sp)
    26.     STORE x31, 19*REGBYTES(sp)
    27. #endif /* __riscv_32e */
    28. .endm
    复制代码

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

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

    所以在进行中断入栈的时候,E数据模型会压入10个寄存器。
    GD32VF 单片机芯片及应用-嵌入式IoT[02]_从riscv底层原理分析gd32vf103的中断行为risc-v单片机中文社区(1)


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

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

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

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

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

    GD32VF 单片机芯片及应用-嵌入式IoT[02]_从riscv底层原理分析gd32vf103的中断行为risc-v单片机中文社区(2)


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

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

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

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

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

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


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

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

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







    上一篇:嵌入式IoT[01]_在qemu上体验芯来RISC-V处理器运行鸿蒙LiteOS-M内核
    下一篇:嵌入式IoT[03]_riscv实现自定义指令并用qemu运行
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-4-25 05:25 , Processed in 0.713634 second(s), 48 queries .

    快速回复 返回顶部 返回列表