diff options
| author | xqyjlj <[email protected]> | 2023-10-25 20:31:25 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-10-25 20:31:25 +0800 |
| commit | 3283f54c7a0444b2e51ec79a4da57e7871528f05 (patch) | |
| tree | e4bcd748ad2362f16d0dea5c5da62922de466999 /src/idle.c | |
| parent | 91fc52df3635d5dda8285616420f08efa79cea04 (diff) | |
🎈 perf: perf rt_hw_interrupt_disable/enable (#8042)
Signed-off-by: Shell <[email protected]>
Co-authored-by: Shell <[email protected]>
Diffstat (limited to 'src/idle.c')
| -rw-r--r-- | src/idle.c | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/src/idle.c b/src/idle.c index dac65eb744..ca5064e346 100644 --- a/src/idle.c +++ b/src/idle.c @@ -16,6 +16,7 @@ * 2018-11-22 Jesven add per cpu idle task * combine the code of primary and secondary cpu * 2021-11-15 THEWON Remove duplicate work between idle and _thread_exit + * 2023-09-15 xqyjlj perf rt_hw_interrupt_disable/enable */ #include <rthw.h> @@ -42,7 +43,8 @@ #define _CPUS_NR RT_CPUS_NR static rt_list_t _rt_thread_defunct = RT_LIST_OBJECT_INIT(_rt_thread_defunct); - +static struct rt_mutex _defunct_mutex; +static rt_atomic_t _idle_inited = 0; static struct rt_thread idle_thread[_CPUS_NR]; rt_align(RT_ALIGN_SIZE) static rt_uint8_t idle_thread_stack[_CPUS_NR][IDLE_THREAD_STACK_SIZE]; @@ -78,12 +80,8 @@ static void (*idle_hook_list[RT_IDLE_HOOK_LIST_SIZE])(void); rt_err_t rt_thread_idle_sethook(void (*hook)(void)) { rt_size_t i; - rt_base_t level; rt_err_t ret = -RT_EFULL; - /* disable interrupt */ - level = rt_hw_interrupt_disable(); - for (i = 0; i < RT_IDLE_HOOK_LIST_SIZE; i++) { if (idle_hook_list[i] == RT_NULL) @@ -93,9 +91,6 @@ rt_err_t rt_thread_idle_sethook(void (*hook)(void)) break; } } - /* enable interrupt */ - rt_hw_interrupt_enable(level); - return ret; } @@ -110,12 +105,8 @@ rt_err_t rt_thread_idle_sethook(void (*hook)(void)) rt_err_t rt_thread_idle_delhook(void (*hook)(void)) { rt_size_t i; - rt_base_t level; rt_err_t ret = -RT_ENOSYS; - /* disable interrupt */ - level = rt_hw_interrupt_disable(); - for (i = 0; i < RT_IDLE_HOOK_LIST_SIZE; i++) { if (idle_hook_list[i] == hook) @@ -125,9 +116,6 @@ rt_err_t rt_thread_idle_delhook(void (*hook)(void)) break; } } - /* enable interrupt */ - rt_hw_interrupt_enable(level); - return ret; } @@ -142,7 +130,13 @@ rt_err_t rt_thread_idle_delhook(void (*hook)(void)) */ void rt_thread_defunct_enqueue(rt_thread_t thread) { + if (rt_atomic_load(&_idle_inited) == 0) + { + return; + } + rt_mutex_take(&_defunct_mutex, RT_WAITING_FOREVER); rt_list_insert_after(&_rt_thread_defunct, &thread->tlist); + rt_mutex_release(&_defunct_mutex); #ifdef RT_USING_SMP rt_sem_release(&system_sem); #endif @@ -158,8 +152,7 @@ rt_thread_t rt_thread_defunct_dequeue(void) rt_list_t *l = &_rt_thread_defunct; #ifdef RT_USING_SMP - /* disable interrupt */ - level = rt_hw_interrupt_disable(); + rt_mutex_take(&_defunct_mutex, RT_WAITING_FOREVER); if (l->next != l) { thread = rt_list_entry(l->next, @@ -167,7 +160,8 @@ rt_thread_t rt_thread_defunct_dequeue(void) tlist); rt_list_remove(&(thread->tlist)); } - rt_hw_interrupt_enable(level); + rt_mutex_release(&_defunct_mutex); + RT_UNUSED(level); #else if (l->next != l) { @@ -204,6 +198,11 @@ static void rt_defunct_execute(void) { break; } + + while (rt_atomic_load(&(thread->ref_count))) + { + rt_thread_delay(5); + } #ifdef RT_USING_MODULE module = (struct rt_dlmodule*)thread->parent.module_id; if (module) @@ -341,7 +340,7 @@ void rt_thread_idle_init(void) #ifdef RT_USING_SMP RT_ASSERT(RT_THREAD_PRIORITY_MAX > 2); - rt_sem_init(&system_sem, "defunct", 1, RT_IPC_FLAG_FIFO); + rt_sem_init(&system_sem, "defunct", 0, RT_IPC_FLAG_FIFO); /* create defunct thread */ rt_thread_init(&rt_system_thread, @@ -355,6 +354,8 @@ void rt_thread_idle_init(void) /* startup */ rt_thread_startup(&rt_system_thread); #endif + rt_mutex_init(&_defunct_mutex, "defunct_mutex", RT_IPC_FLAG_FIFO); + rt_atomic_store(&(_idle_inited), 1); } /** |
