硬汉嵌入式论坛

 找回密码
 立即注册
查看: 154|回复: 1
收起左侧

[技术讨论] nuclei gd32vf103向量中断示例代码疑问

[复制链接]

56

主题

131

回帖

299

积分

高级会员

积分
299
发表于 2024-5-9 10:03:29 | 显示全部楼层 |阅读模式
本帖最后由 lindahnu 于 2024-5-9 10:11 编辑

使用Nuclei Studio生成eclic中断示例代码,timer实现非向量中断和向量中断,其中eclic_msip_handler函数实现调用了 SAVE_IRQ_CSR_CONTEXT()和RESTORE_IRQ_CSR_CONTEXT();看实现代码发现,RESTORE_IRQ_CSR_CONTEXT()是关闭了全局中断,那下次中断还怎么响应呢?eclic_msip_handler就只执行了一次,在main函数里还判断了这个函数的执行次数int_check_cnt,不明白,求解答。
[C] 纯文本查看 复制代码
// timer interrupt handler
// non-vector mode interrupt
void eclic_mtip_handler(void)
{
  static uint32_t int_t_cnt = 0; 
  SysTimer_SetSWIRQ();
 SysTick_Reload(TIMER_TICKS);
}

[C] 纯文本查看 复制代码
__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();

}

[C] 纯文本查看 复制代码
#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();

[C] 纯文本查看 复制代码
#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);

[C] 纯文本查看 复制代码
int main(int argc, char** argv)
{
    ........

    setup_timer();
    returnCode = ECLIC_Register_IRQ(SysTimerSW_IRQn, ECLIC_VECTOR_INTERRUPT,
                         ECLIC_LEVEL_TRIGGER, swirq_intlevel, 0,  (void*)eclic_msip_handler);
    returnCode = ECLIC_Register_IRQ(SysTimer_IRQn, ECLIC_NON_VECTOR_INTERRUPT,
                         ECLIC_LEVEL_TRIGGER, timer_intlevel, 0,  (void*)eclic_mtip_handler);
    __enable_irq();
    while (int_check_cnt < RUN_LOOPS);
    __disable_irq();
     printf("ECLIC Demo finished sucessfully in %d loops\n", RUN_LOOPS);
    return 0;
}



回复

使用道具 举报

2

主题

17

回帖

23

积分

新手上路

积分
23
发表于 2024-5-9 22:18:57 | 显示全部楼层
riscv用mstatus寄存器的MIE位控制全局中断是否使能。发生中断时硬件自动将mstatus.MIE的值放到mstatus.MPIE然后MIE清0,退出中断时mstatus.MPIE的值会被恢复到mstatus.MIE,所以在中断中开关中断不会影响到中断退出后MIE的状态。并且由于硬件自动清除了MIE位,想嵌套中断时,要在保存完上下文后MIE置1,恢复上下文前MIE置0。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-20 19:03 , Processed in 0.144004 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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