diff options
| author | heyuanjie87 <[email protected]> | 2024-08-30 16:30:55 +0800 |
|---|---|---|
| committer | Rbb666 <[email protected]> | 2024-10-21 13:05:08 +0800 |
| commit | 1045bcb9df3a946188490b7e18835be3209d9715 (patch) | |
| tree | b4312f80c015fc19cae6ff582214236232ddf703 | |
| parent | 2351981e838d4c663d5940faafc6292bbd9f9e2b (diff) | |
给使用独立的defunct线程添加限制条件
| -rw-r--r-- | include/rtthread.h | 1 | ||||
| -rw-r--r-- | src/defunct.c | 13 | ||||
| -rw-r--r-- | src/idle.c | 4 |
3 files changed, 15 insertions, 3 deletions
diff --git a/include/rtthread.h b/include/rtthread.h index 671f80d8e0..311516bd8b 100644 --- a/include/rtthread.h +++ b/include/rtthread.h @@ -644,6 +644,7 @@ rt_ssize_t rt_mq_recv_prio(rt_mq_t mq, void rt_thread_defunct_init(void); void rt_thread_defunct_enqueue(rt_thread_t thread); rt_thread_t rt_thread_defunct_dequeue(void); +void rt_defunct_execute(void); /* * spinlock diff --git a/src/defunct.c b/src/defunct.c index 7fae3a876c..ce696f8325 100644 --- a/src/defunct.c +++ b/src/defunct.c @@ -19,7 +19,9 @@ static rt_list_t _rt_thread_defunct = RT_LIST_OBJECT_INIT(_rt_thread_defunct); static struct rt_spinlock _defunct_spinlock; static struct rt_thread rt_system_thread; rt_align(RT_ALIGN_SIZE) static rt_uint8_t rt_system_stack[SYSTEM_THREAD_STACK_SIZE]; +#if defined(RT_USING_SMP) || defined(RT_USING_SMART) static struct rt_semaphore system_sem; +#endif /** * @brief Enqueue a thread to defunct queue. @@ -34,8 +36,9 @@ void rt_thread_defunct_enqueue(rt_thread_t thread) level = rt_spin_lock_irqsave(&_defunct_spinlock); rt_list_insert_after(&_rt_thread_defunct, &RT_THREAD_LIST_NODE(thread)); rt_spin_unlock_irqrestore(&_defunct_spinlock, level); - +#if defined(RT_USING_SMP) || defined(RT_USING_SMART) rt_sem_release(&system_sem); +#endif } /** @@ -48,7 +51,7 @@ rt_thread_t rt_thread_defunct_dequeue(void) rt_list_t *l = &_rt_thread_defunct; level = rt_spin_lock_irqsave(&_defunct_spinlock); - if (l->next != l) + if (!rt_list_isempty(l)) { thread = RT_THREAD_LIST_NODE_ENTRY(l->next); rt_list_remove(&RT_THREAD_LIST_NODE(thread)); @@ -61,7 +64,7 @@ rt_thread_t rt_thread_defunct_dequeue(void) /** * @brief This function will perform system background job when system idle. */ -static void rt_defunct_execute(void) +void rt_defunct_execute(void) { /* Loop until there is no dead thread. So one call to rt_defunct_execute * will do all the cleanups. */ @@ -133,6 +136,7 @@ static void rt_defunct_execute(void) } } +#if defined(RT_USING_SMP) || defined(RT_USING_SMART) static void rt_thread_system_entry(void *parameter) { RT_UNUSED(parameter); @@ -148,6 +152,7 @@ static void rt_thread_system_entry(void *parameter) rt_defunct_execute(); } } +#endif void rt_thread_defunct_init(void) { @@ -155,6 +160,7 @@ void rt_thread_defunct_init(void) rt_spin_lock_init(&_defunct_spinlock); +#if defined(RT_USING_SMP) || defined(RT_USING_SMART) rt_sem_init(&system_sem, "defunct", 0, RT_IPC_FLAG_FIFO); /* create defunct thread */ @@ -168,4 +174,5 @@ void rt_thread_defunct_init(void) 32); /* startup */ rt_thread_startup(&rt_system_thread); +#endif } diff --git a/src/idle.c b/src/idle.c index 9a805737eb..5773b92548 100644 --- a/src/idle.c +++ b/src/idle.c @@ -152,6 +152,10 @@ static void idle_thread_entry(void *parameter) } #endif /* RT_USING_IDLE_HOOK */ +#if !defined(RT_USING_SMP) && !defined(RT_USING_SMART) + rt_defunct_execute(); +#endif + #ifdef RT_USING_PM void rt_system_power_manager(void); rt_system_power_manager(); |
