RISCV内核中断优先级/Priority
一、讲解
中断优先级分为抢占优先级和响应优先级。配置参数越小,则说明其优先级别越高。
- 抢占:是指可以打断其他中断函数的属性。出现该属性时会出现中断嵌套;
- 响应:是指抢占优先级相同情况下,则优先执行响应优先级高的中断;
二、举例
序号 | 中断名称 | 抢占优先级 |
1 | TMR1 | 1 |
2 | TMR2 | 2 |
3 | UART0 | 3 |
4 | UART1 | 4 |
如上表,TMR2抢占优先级低于TMR1。如果在执行TMR2中断服务函数时,则TMR1中断可以打断TMR2中断。同理,TMR2可以打断正在执行的UART0/UART1中断。
三、操作
①中断嵌套
启动文件startup.s默认有开启,建议不要手动关闭。
/* 打开嵌套中断、硬件压栈功能 */
li t0, 0x3
csrw 0x804, t0
②配置嵌套
/*******************************************************************************
* @fn PFIC_SetPriority
*
* @brief Set Interrupt Priority
*
* @param IRQn - Interrupt Numbers
* @param priority - bit7: pre-emption priority
* bit6-bit4: subpriority
*/
RV_STATIC_INLINE void PFIC_SetPriority(IRQn_Type IRQn, uint8_t priority)
{
PFIC->IPRIOR[(uint32_t)(IRQn)] = priority;
}
中断优先级配置接口函数:PFIC_SetPriority(IRQn_Type IRQn, uint8_t priority)
参数1是配置需要操作的中断函数。
参数2是配置抢占和响应优先级。根据注释,只有高4位具有意义,低4位无意义。其中高4位的最高位代表抢占优先级,高4位的次3位代表响应优先级。配置为0则代表优先级最高。
例如配置UART0/UART1的抢占优先级最高,且UART0的响应优先级高于UART1:
PFIC_SetPriority(UART0_IRQn, 0x00);
PFIC_SetPriority(UART1_IRQn, 0x10);
这样配置,则UART0/UART1可以打断TMR1/TMR2中断。
补充: