diff --git a/kernel/core/include/tos_task.h b/kernel/core/include/tos_task.h index 3ef2b42f..23417d0a 100644 --- a/kernel/core/include/tos_task.h +++ b/kernel/core/include/tos_task.h @@ -154,7 +154,7 @@ struct k_task_st { * @retval #K_ERR_NONE return successfully. */ __API__ k_err_t tos_task_create(k_task_t *task, - char *name, + const char *name, k_task_entry_t entry, void *arg, k_prio_t prio, @@ -197,7 +197,7 @@ __API__ k_err_t tos_task_destroy(k_task_t *task); * @retval #K_ERR_NONE return successfully. */ __API__ k_err_t tos_task_create_dyn(k_task_t **task, - char *name, + const char *name, k_task_entry_t entry, void *arg, k_prio_t prio, @@ -316,6 +316,15 @@ __API__ void tos_task_yield(void); */ __API__ k_task_t *tos_task_curr_task_get(void); +/** + * @brief Find task by task name. + * Find task by task name. + * + * @param name the name of the task. + * + * @return the matched task handler + */ +__API__ k_task_t *tos_task_find(const char *name); #if TOS_CFG_TASK_STACK_DRAUGHT_DEPTH_DETACT_EN > 0u diff --git a/kernel/core/tos_task.c b/kernel/core/tos_task.c index 8f8e0019..cb2fe9c4 100644 --- a/kernel/core/tos_task.c +++ b/kernel/core/tos_task.c @@ -80,7 +80,7 @@ __STATIC__ void task_mutex_release(k_task_t *task) #endif __API__ k_err_t tos_task_create(k_task_t *task, - char *name, + const char *name, k_task_entry_t entry, void *arg, k_prio_t prio, @@ -234,7 +234,7 @@ __KNL__ void task_free_all(void) } __API__ k_err_t tos_task_create_dyn(k_task_t **task, - char *name, + const char *name, k_task_entry_t entry, void *arg, k_prio_t prio, @@ -547,6 +547,28 @@ __API__ k_task_t *tos_task_curr_task_get(void) return curr_task; } +__API__ k_task_t *tos_task_find(const char *name) +{ + TOS_CPU_CPSR_ALLOC(); + k_task_t *task; + + if (!strlen(name)) { + return K_NULL; + } + + TOS_CPU_INT_DISABLE(); + + TOS_LIST_FOR_EACH_ENTRY(task, k_task_t, stat_list, &k_stat_list) { + if (strncmp(task->name, name, K_TASK_NAME_LEN_MAX) == 0) { + TOS_CPU_INT_ENABLE(); + return task; + } + } + + TOS_CPU_INT_ENABLE(); + return K_NULL; +} + __API__ void tos_task_walkthru(k_task_walker_t walker) { TOS_CPU_CPSR_ALLOC(); diff --git a/test/suit_task.c b/test/suit_task.c index 6bef720f..2ba293bd 100644 --- a/test/suit_task.c +++ b/test/suit_task.c @@ -30,7 +30,7 @@ static void test_task_entry(void *arg) } } -TEST test_tos_task_create(void) +TEST test_tos_task_create(void) { k_err_t err; @@ -82,26 +82,24 @@ 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); - + ASSERT_EQ(mm_info_before.free, mm_info_after.free); + PASS(); } @@ -284,6 +282,32 @@ TEST test_tos_task_yeild(void) PASS(); } +TEST test_tos_task_find(void) +{ + k_err_t err; + k_task_t *task; + + err = tos_task_create(&test_task_00, "test_task", test_task_entry, + NULL, TEST_TASK_PRIO_00, + test_task_stack_00, sizeof(test_task_stack_00), + 0); + ASSERT_EQ(err, K_ERR_NONE); + + task = tos_task_find(NULL); + ASSERT_EQ(task, NULL); + + task = tos_task_find("not exist"); + ASSERT_EQ(task, NULL); + + task = tos_task_find("test_task"); + ASSERT_EQ(task, &test_task_00); + + err = tos_task_destroy(&test_task_00); + ASSERT_EQ(err, K_ERR_NONE); + + PASS(); +} + SUITE(suit_task) { RUN_TEST(test_tos_task_create); @@ -294,5 +318,6 @@ SUITE(suit_task) RUN_TEST(test_tos_task_suspend_resume); RUN_TEST(test_tos_task_prio_change); RUN_TEST(test_tos_task_yeild); + RUN_TEST(test_tos_task_find); }