summaryrefslogtreecommitdiff
path: root/src/idle.c
diff options
context:
space:
mode:
authorxqyjlj <[email protected]>2023-10-25 20:31:25 +0800
committerGitHub <[email protected]>2023-10-25 20:31:25 +0800
commit3283f54c7a0444b2e51ec79a4da57e7871528f05 (patch)
treee4bcd748ad2362f16d0dea5c5da62922de466999 /src/idle.c
parent91fc52df3635d5dda8285616420f08efa79cea04 (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.c39
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);
}
/**