打印

nuclei gd32vf103向量中断示例代码疑问

[复制链接]
908|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lindahnu|  楼主 | 2024-5-6 15:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用Nuclei Studio生成eclic中断示例代码,timer实现非向量中断和向量中断,其中eclic_msip_handler函数实现调用了 SAVE_IRQ_CSR_CONTEXT()和RESTORE_IRQ_CSR_CONTEXT();看实现代码发现,RESTORE_IRQ_CSR_CONTEXT()是关闭了全局中断,那下次中断还怎么响应呢?eclic_msip_handler就只执行了一次,在main函数里还判断了这个函数的执行次数,不明白,求解答。
__INTERRUPT void eclic_msip_handler(void)
{
    static uint32_t int_sw_cnt = 0;   /* software interrupt counter */

// save CSR context
    SAVE_IRQ_CSR_CONTEXT();

    SysTimer_ClearSWIRQ();
...
    int_check_cnt ++;
    // restore CSR context
  RESTORE_IRQ_CSR_CONTEXT();

}

int main(int argc, char** argv)
{
    ................
    while (int_check_cnt < RUN_LOOPS);
    __disable_irq();
     printf("ECLIC Demo finished sucessfully in %d loops\n", RUN_LOOPS);
    return 0;
}

#define SAVE_IRQ_CSR_CONTEXT()                    \
rv_csr_t __mcause = __RV_CSR_READ(CSR_MCAUSE);\
rv_csr_t __mepc = __RV_CSR_READ(CSR_MEPC); \
rv_csr_t __msubm = __RV_CSR_READ(CSR_MSUBM);\
__enable_irq();

#define RESTORE_IRQ_CSR_CONTEXT()      \
__disable_irq(); \
__RV_CSR_WRITE(CSR_MSUBM, __msubm);
__RV_CSR_WRITE(CSR_MEPC, __mepc);
__RV_CSR_WRITE(CSR_MCAUSE, __mcause);



使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

28

帖子

0

粉丝