本帖最后由 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;
}
|