简介:
在上一篇中我们使用了eclic 模块配置gpio 中断触发方式,并在中断函数内添加打印输出。eclic 的中断向量模式和非向量模式的说明如下。
对于向量模式和非向量模式的区别只要是中断入口函数的差异,向量模式直接根据中断向量表内的中断函数地址进行响应,非向量模式则是跳入到共享的入口地址然后在跳转到中断处理函数进行响应。
ECLIC 的每个中断源都可以独立配置为向量模式和非向量模式,通过如下寄存器来配置。
以下接口即配置为1 时为向量模式,配置为0 时为非向量模式,默认值为0 非向量模式,按照之前的说明,非向量模式会先进入统一的共享入口地址进行响应。该地址又mtvt2寄存器配置,对应共享入口函数为irq_entry
对应的共享入口irq_entry 接口函数实现如下:
去除上述代码中无效部分的宏下面包含的代码,对应的编译预处理后的代码如下:
上述汇编中涉及了一条特殊指令 csrrw ra, CSR_JALMNXTI, ra 该条指令是芯片自定义的csr 寄存器,对应的说明如下
我们继续分析irq_entry 函数的功能对应流程如下:
为了验证猜测,我们在irq_entry 函数中添加打印来判断是否是先执行了irq_entry 然后通过csrrw ra, CSR_JALMNXTI, ra 指令跳转到isr 入口地址进行执行。
触发中断发现跟预期的一致在,非中断模式下,先进入共享入口执行然后跳转到ISR服务中执行。
至此我们以经验证完非向量模式,基于此我们继续验证向量模式,首先修改代码配置GPIO输入中断为向量模式,添加如下配置。
修改后之前的entry_irq 函数中的打印函数不会打印了直接输出的中断入口函数的信息,跟预期的行为也是一致的。
GD32VF103 的中断向量模式和非向量模式就介绍到这。