separate the dynamic task destroy api
This commit is contained in:
@@ -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)的任务。
|
||||||
|
|
||||||
- **参数解释**
|
- **参数解释**
|
||||||
|
|
||||||
|
@@ -204,6 +204,20 @@ __API__ k_err_t tos_task_create_dyn(k_task_t **task,
|
|||||||
size_t stk_size,
|
size_t stk_size,
|
||||||
k_timeslice_t timeslice);
|
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
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -187,8 +187,20 @@ __STATIC__ k_err_t task_do_destroy(k_task_t *task)
|
|||||||
return K_ERR_NONE;
|
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 TOS_CFG_TASK_DYNAMIC_CREATE_EN > 0u
|
||||||
if (!knl_object_alloc_is_static(&task->knl_obj)) {
|
if (!knl_object_alloc_is_static(&task->knl_obj)) {
|
||||||
return K_ERR_OBJ_INVALID_ALLOC_TYPE;
|
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;
|
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;
|
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();
|
tos_knl_sched_lock();
|
||||||
|
|
||||||
err = task_do_destroy(task);
|
err = task_do_destroy(task);
|
||||||
@@ -302,29 +330,6 @@ __STATIC__ k_err_t task_destroy_dyn(k_task_t *task)
|
|||||||
|
|
||||||
#endif
|
#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)
|
__API__ void tos_task_yield(void)
|
||||||
{
|
{
|
||||||
TOS_CPU_CPSR_ALLOC();
|
TOS_CPU_CPSR_ALLOC();
|
||||||
|
@@ -77,6 +77,34 @@ TEST test_tos_task_destroy(void)
|
|||||||
PASS();
|
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)
|
TEST test_tos_task_delay(void)
|
||||||
{
|
{
|
||||||
int try = 0;
|
int try = 0;
|
||||||
@@ -260,6 +288,7 @@ SUITE(suit_task)
|
|||||||
{
|
{
|
||||||
RUN_TEST(test_tos_task_create);
|
RUN_TEST(test_tos_task_create);
|
||||||
RUN_TEST(test_tos_task_destroy);
|
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);
|
||||||
RUN_TEST(test_tos_task_delay_abort);
|
RUN_TEST(test_tos_task_delay_abort);
|
||||||
RUN_TEST(test_tos_task_suspend_resume);
|
RUN_TEST(test_tos_task_suspend_resume);
|
||||||
|
Reference in New Issue
Block a user