V307中断抢占问题

使用RT-thread,中断结构如下:


void app_timer_isr(void)

{

    GET_INT_SP();

    /* enter interrupt */

    rt_interrupt_enter();


    APP_TIM->INTFR = 0;

    NVIC_SetPendingIRQ(TIM7_IRQn);


    /* leave interrupt */

    rt_interrupt_leave();

    FREE_INT_SP();

}


两个中断优先级分别为6和3。

当中断6被优先级3抢占时,堆栈指针变化如下:


ISR.png

高优先级的ISR3 堆栈指针和APP的SP相同,这正常吗,会不会造成系统运行错误?


是会有问题的,所以在使用RTOS时,最好不要使用中断嵌套。


如果是这个解释的话,这用法也就太狗血了。RTOS是提高任务实时性的,中断用来实时响应特殊事件,二选一的话RTOS显然就没意义了。


RISC-V和ARM CORTEX结构不同,RISC-V官方不支持中断嵌套的。

CORTEX具有MSP和PSP两个栈,而RISC-V只有一个栈SP。

最好不使用中断嵌套,而不是不能使用中断。


您好,如果APP堆栈空间够大的话,一般不会有问题的。一般不建议用中断嵌套,若想用中断嵌套,可将中断函数入口改成统一入口,具体可参考CH582 FreeRTOS例程的配置方式,如下图。

CH582 EVT:https://www.wch.cn/downloads/CH583EVT_ZIP.html 

image.png



CH58x FreeRTOS例程在启动文件里面关闭中断嵌套。

CH32V307的启动文件开启中断嵌套。我的理解,对于RTOS来说,双堆栈并非必须,arm上面早期的RTOS也只用了MSP,无非是任务堆栈要考虑叠加中断堆栈用量。 RISC-V中断除了堆栈外还有其它隐性操作吗?为什么会出现禁止中断嵌套这种用法,原因是什么?


您好,并没有禁用中断嵌套,由于每个任务栈都需要考虑中断栈大小,导致代码出现错误的概率大大增加,所以推荐尽量不使用中断嵌套,而不是禁用中断嵌套。CH582中断嵌套在启动文件中默认关闭,在每次进入中断时,在第一级中断中更改sp为中断栈指针后,才会打开中断嵌套。

image.png



只有登录才能回复,可以选择微信账号登录