RISC中关中断应该用原子操作,避免多任务环境造成错误

This commit is contained in:
2026-05-22 21:24:45 +08:00
parent ab11821c0c
commit f957224afd
4 changed files with 14 additions and 4 deletions
+1 -3
View File
@@ -124,9 +124,7 @@ void os_port_restore_irq(os_uint_t level){
}
os_uint_t os_port_save_disable_irq_in_isr(void){
os_uint_t level = RISCV_get_MSTATUS();
RISCV_set_MSTATUS(0x1800);
return level;
return RISCV_get_set_MSTATUS(0x1800);
}
void os_port_restore_irq_in_isr(os_uint_t level){
+3 -1
View File
@@ -132,7 +132,9 @@ os_port_context_restore:
lw a0, 0 * 4(sp)
csrw mepc, a0
lw a0, 2*4(sp) /* MPIE */
li t0, 0x1800
csrs mstatus, t0
lw a0, 2*4(sp)
csrs mstatus, a0
lw x1, 1 * 4(sp) /* */
+9
View File
@@ -20,6 +20,15 @@ uint32_t RISCV_get_MSTATUS(void)
return (result);
}
uint32_t RISCV_get_set_MSTATUS(uint32_t value){
uint32_t result;
__ASM volatile("csrrw %0, mstatus, %1"
: "=r"(result)
:"r"(value)
:"memory");
return (result);
}
/*********************************************************************
* @fn RISCV_set_MSTATUS
*
+1
View File
@@ -216,6 +216,7 @@ int32_t RISCV_AMOXOR_W(volatile int32_t *addr, int32_t value)
/* ------------------------------------------------------------------------------------------------------------------ */
/* */
extern uint32_t RISCV_get_set_MSTATUS(uint32_t value);
extern uint32_t RISCV_get_MSTATUS(void);
extern void RISCV_set_MSTATUS(uint32_t value);
extern uint32_t RISCV_get_MISA(void);