RISC中关中断应该用原子操作,避免多任务环境造成错误
This commit is contained in:
@@ -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 os_port_save_disable_irq_in_isr(void){
|
||||||
os_uint_t level = RISCV_get_MSTATUS();
|
return RISCV_get_set_MSTATUS(0x1800);
|
||||||
RISCV_set_MSTATUS(0x1800);
|
|
||||||
return level;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void os_port_restore_irq_in_isr(os_uint_t level){
|
void os_port_restore_irq_in_isr(os_uint_t level){
|
||||||
|
|||||||
@@ -132,7 +132,9 @@ os_port_context_restore:
|
|||||||
lw a0, 0 * 4(sp)
|
lw a0, 0 * 4(sp)
|
||||||
csrw mepc, a0
|
csrw mepc, a0
|
||||||
|
|
||||||
lw a0, 2*4(sp) /* 恢复 MPIE */
|
li t0, 0x1800
|
||||||
|
csrs mstatus, t0
|
||||||
|
lw a0, 2*4(sp)
|
||||||
csrs mstatus, a0
|
csrs mstatus, a0
|
||||||
|
|
||||||
lw x1, 1 * 4(sp) /* 返回地址 */
|
lw x1, 1 * 4(sp) /* 返回地址 */
|
||||||
|
|||||||
@@ -20,6 +20,15 @@ uint32_t RISCV_get_MSTATUS(void)
|
|||||||
return (result);
|
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
|
* @fn RISCV_set_MSTATUS
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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 uint32_t RISCV_get_MSTATUS(void);
|
||||||
extern void RISCV_set_MSTATUS(uint32_t value);
|
extern void RISCV_set_MSTATUS(uint32_t value);
|
||||||
extern uint32_t RISCV_get_MISA(void);
|
extern uint32_t RISCV_get_MISA(void);
|
||||||
|
|||||||
Reference in New Issue
Block a user