From 30832d6e0ffb9480be893382c1fbc0c23dd44153 Mon Sep 17 00:00:00 2001 From: mculover666 <2412828003@qq.com> Date: Tue, 31 May 2022 19:42:25 +0800 Subject: [PATCH] separate the dynamic task destroy api --- doc/05.SDK_Manual.md | 4 +-- kernel/core/include/tos_task.h | 14 +++++++++ kernel/core/tos_task.c | 55 ++++++++++++++++++---------------- test/suit_task.c | 29 ++++++++++++++++++ 4 files changed, 75 insertions(+), 27 deletions(-) diff --git a/doc/05.SDK_Manual.md b/doc/05.SDK_Manual.md index 4007c6c2..437d03e8 100644 --- a/doc/05.SDK_Manual.md +++ b/doc/05.SDK_Manual.md @@ -233,7 +233,7 @@ k_err_t tos_task_destroy(k_task_t *task) - **功能描述** - 销毁任务。 + 销毁静态创建的任务。 - **参数解释** @@ -255,7 +255,7 @@ k_err_t tos_task_destroy_dyn(k_task_t *task) - **功能描述** - static函数,非对外接口,销毁动态创建(tos_task_create_dyn)的任务,默认由tos_task_destroy()函数调用。 + 销毁动态创建(tos_task_create_dyn)的任务。 - **参数解释** diff --git a/kernel/core/include/tos_task.h b/kernel/core/include/tos_task.h index db7b48e0..3ef2b42f 100644 --- a/kernel/core/include/tos_task.h +++ b/kernel/core/include/tos_task.h @@ -204,6 +204,20 @@ __API__ k_err_t tos_task_create_dyn(k_task_t **task, size_t stk_size, k_timeslice_t timeslice); +/** + * @brief Destroy a dynamic allocated task. + * delete a dynamic allocated task. + * + * @attention None + * + * @param[in] task pointer to the handler of the task to be deleted. + * + * @return errcode + * @retval #K_ERR_TASK_DESTROY_IDLE attempt to destroy idle task. + * @retval #K_ERR_NONE return successfully. + */ +__API__ k_err_t tos_task_destroy_dyn(k_task_t *task); + #endif /** diff --git a/kernel/core/tos_task.c b/kernel/core/tos_task.c index a19652c6..8f8e0019 100644 --- a/kernel/core/tos_task.c +++ b/kernel/core/tos_task.c @@ -187,8 +187,20 @@ __STATIC__ k_err_t task_do_destroy(k_task_t *task) return K_ERR_NONE; } -__STATIC__ k_err_t task_destroy_static(k_task_t *task) +__API__ k_err_t tos_task_destroy(k_task_t *task) { + TOS_IN_IRQ_CHECK(); + + if (unlikely(!task)) { + task = k_curr_task; + } + + TOS_OBJ_VERIFY(task, KNL_OBJ_TYPE_TASK); + + if (knl_is_self(task) && knl_is_sched_locked()) { + return K_ERR_SCHED_LOCKED; + } + #if TOS_CFG_TASK_DYNAMIC_CREATE_EN > 0u if (!knl_object_alloc_is_static(&task->knl_obj)) { return K_ERR_OBJ_INVALID_ALLOC_TYPE; @@ -275,10 +287,26 @@ __API__ k_err_t tos_task_create_dyn(k_task_t **task, return K_ERR_NONE; } -__STATIC__ k_err_t task_destroy_dyn(k_task_t *task) +__API__ k_err_t tos_task_destroy_dyn(k_task_t *task) { k_err_t err; + TOS_IN_IRQ_CHECK(); + + if (unlikely(!task)) { + task = k_curr_task; + } + + TOS_OBJ_VERIFY(task, KNL_OBJ_TYPE_TASK); + + if (knl_is_self(task) && knl_is_sched_locked()) { + return K_ERR_SCHED_LOCKED; + } + + if (!knl_object_alloc_is_dynamic(&task->knl_obj)) { + return K_ERR_OBJ_INVALID_ALLOC_TYPE; + } + tos_knl_sched_lock(); err = task_do_destroy(task); @@ -302,29 +330,6 @@ __STATIC__ k_err_t task_destroy_dyn(k_task_t *task) #endif -__API__ k_err_t tos_task_destroy(k_task_t *task) -{ - TOS_IN_IRQ_CHECK(); - - if (unlikely(!task)) { - task = k_curr_task; - } - - TOS_OBJ_VERIFY(task, KNL_OBJ_TYPE_TASK); - - if (knl_is_self(task) && knl_is_sched_locked()) { - return K_ERR_SCHED_LOCKED; - } - -#if TOS_CFG_TASK_DYNAMIC_CREATE_EN > 0u - if (knl_object_alloc_is_dynamic(&task->knl_obj)) { - return task_destroy_dyn(task); - } -#endif - - return task_destroy_static(task); -} - __API__ void tos_task_yield(void) { TOS_CPU_CPSR_ALLOC(); diff --git a/test/suit_task.c b/test/suit_task.c index c6f41c85..6bef720f 100644 --- a/test/suit_task.c +++ b/test/suit_task.c @@ -77,6 +77,34 @@ TEST test_tos_task_destroy(void) PASS(); } +TEST test_tos_task_create_destroy_dyn(void) +{ + k_err_t err; + k_task_t *task; + k_mmheap_info_t mm_info_before, mm_info_after; + + err = tos_mmheap_check(&mm_info_before); + ASSERT_EQ(err, K_ERR_NONE); + + err = tos_task_create_dyn(&task, "test_dyn_task", test_task_entry, + K_NULL, TEST_TASK_PRIO_00, TEST_TASK_STACK_SIZE_00, 0); + ASSERT_EQ(err, K_ERR_NONE); + + err = tos_task_destroy(task); + ASSERT_EQ(err, K_ERR_OBJ_INVALID_ALLOC_TYPE); + + err = tos_mmheap_check(&mm_info_after); + ASSERT_EQ(err, K_ERR_NONE); + + err = tos_task_destroy_dyn(task); + ASSERT_EQ(err, K_ERR_NONE); + + err = tos_mmheap_check(&mm_info_after); + ASSERT_EQ(err, K_ERR_NONE); + + PASS(); +} + TEST test_tos_task_delay(void) { int try = 0; @@ -260,6 +288,7 @@ SUITE(suit_task) { RUN_TEST(test_tos_task_create); RUN_TEST(test_tos_task_destroy); + RUN_TEST(test_tos_task_create_destroy_dyn); RUN_TEST(test_tos_task_delay); RUN_TEST(test_tos_task_delay_abort); RUN_TEST(test_tos_task_suspend_resume);