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

This commit is contained in:
2026-05-23 00:59:24 +08:00
parent f957224afd
commit 21b3c925c2
4 changed files with 13 additions and 3 deletions
+5 -1
View File
@@ -5,6 +5,7 @@
#include "os_compiler.h" #include "os_compiler.h"
#include "os_systick.h" #include "os_systick.h"
#include "os_sched.h" #include "os_sched.h"
#include "os_isr.h"
#include "qkv3.h" #include "qkv3.h"
/* ------------------------------------------------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------------------------------------------------ */
@@ -16,7 +17,8 @@
/* ------------------------------------------------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------------------------------------------------ */
/* */ /* */
static uint32_t _SysTick_Config(os_tick_t ticks) OS_STATIC_FORCE_INLINE
uint32_t _SysTick_Config(os_tick_t ticks)
{ {
QKV3_PFIC->CFGR=0xFA050003; /* 关闭硬件压栈和嵌套 */ QKV3_PFIC->CFGR=0xFA050003; /* 关闭硬件压栈和嵌套 */
/* /*
@@ -187,6 +189,7 @@ void os_port_context_switch(void* from_sp, void* to_sp){
void SysTick_Handler(void) __attribute__((interrupt())); void SysTick_Handler(void) __attribute__((interrupt()));
void SysTick_Handler(void){ void SysTick_Handler(void){
os_isr_enter();
QKV3_SysTick->CTLR=0; QKV3_SysTick->CTLR=0;
QKV3_SysTick->CNTL0=0;QKV3_SysTick->CNTL1=0;QKV3_SysTick->CNTL2=0;QKV3_SysTick->CNTL3=0; QKV3_SysTick->CNTL0=0;QKV3_SysTick->CNTL1=0;QKV3_SysTick->CNTL2=0;QKV3_SysTick->CNTL3=0;
QKV3_SysTick->CNTH0=0;QKV3_SysTick->CNTH1=0;QKV3_SysTick->CNTH2=0;QKV3_SysTick->CNTH3=0; QKV3_SysTick->CNTH0=0;QKV3_SysTick->CNTH1=0;QKV3_SysTick->CNTH2=0;QKV3_SysTick->CNTH3=0;
@@ -194,5 +197,6 @@ void SysTick_Handler(void){
// 调用系统心跳处理 // 调用系统心跳处理
os_systick_tick(); os_systick_tick();
os_isr_leave();
} }
-2
View File
@@ -38,8 +38,6 @@
#define QKV3_SysTick ((QKV3_SysTick_Type *) 0xE000F000) #define QKV3_SysTick ((QKV3_SysTick_Type *) 0xE000F000)
/* ------------------------------------------------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------------------------------------------------ */
/* */ /* */
+2
View File
@@ -4,6 +4,7 @@
/* ==================================================================================================== */ /* ==================================================================================================== */
/* OPTIONS */ /* OPTIONS */
#cmakedefine OS_ALIGN_SIZE @OS_ALIGN_SIZE@
#cmakedefine OS_CFG_CPU_INT_NBITS @OS_CFG_CPU_INT_NBITS@ #cmakedefine OS_CFG_CPU_INT_NBITS @OS_CFG_CPU_INT_NBITS@
#cmakedefine OS_CFG_TICKS_PER_SECOND @OS_CFG_TICKS_PER_SECOND@ #cmakedefine OS_CFG_TICKS_PER_SECOND @OS_CFG_TICKS_PER_SECOND@
#cmakedefine OS_CFG_SYSCALL_PRIORITY @OS_CFG_SYSCALL_PRIORITY@ #cmakedefine OS_CFG_SYSCALL_PRIORITY @OS_CFG_SYSCALL_PRIORITY@
@@ -17,6 +18,7 @@
#cmakedefine OS_CFG_DEVICE_MAX @OS_CFG_DEVICE_MAX@ #cmakedefine OS_CFG_DEVICE_MAX @OS_CFG_DEVICE_MAX@
/* ==================================================================================================== */ /* ==================================================================================================== */
/* DEFAULT */ /* DEFAULT */
+6
View File
@@ -5,11 +5,17 @@
/* -------------------------------------------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------------------------------------------- */
/* */ /* */
OS_ALIGNED(OS_ALIGN_SIZE)
os_list_t os_timewheel__R[TWR_SIZE]; os_list_t os_timewheel__R[TWR_SIZE];
OS_ALIGNED(OS_ALIGN_SIZE)
os_list_t os_timewheel__N0[TWN_SIZE]; os_list_t os_timewheel__N0[TWN_SIZE];
OS_ALIGNED(OS_ALIGN_SIZE)
os_list_t os_timewheel__N1[TWN_SIZE]; os_list_t os_timewheel__N1[TWN_SIZE];
OS_ALIGNED(OS_ALIGN_SIZE)
os_list_t os_timewheel__N2[TWN_SIZE]; os_list_t os_timewheel__N2[TWN_SIZE];
OS_ALIGNED(OS_ALIGN_SIZE)
os_list_t os_timewheel__N3[TWN_SIZE]; os_list_t os_timewheel__N3[TWN_SIZE];
volatile os_tick_t os_timewheel__tick; volatile os_tick_t os_timewheel__tick;