diff --git a/tests/kernel/profiling/profiling_api/src/main.c b/tests/kernel/profiling/profiling_api/src/main.c index 180393d6f2c..d3aa818b912 100644 --- a/tests/kernel/profiling/profiling_api/src/main.c +++ b/tests/kernel/profiling/profiling_api/src/main.c @@ -15,14 +15,6 @@ static struct k_work work[NUM_OF_WORK]; static struct k_sem sync_sema; -#define STACKSIZE 512 -K_THREAD_STACK_DEFINE(test_stack, STACKSIZE); -__kernel struct k_thread test_thread; - -static int tcount; -static bool thread_flag; -static bool stack_flag; - /**TESTPOINT: stack analyze*/ static void tdata_dump_callback(const struct k_thread *thread, void *user_data) { @@ -81,79 +73,13 @@ void test_call_stacks_analyze_workq(void) } } -static void thread_entry(void *p1, void *p2, void *p3) -{ - k_sleep(SLEEP_MS); -} - -static void thread_callback(const struct k_thread *thread, void *user_data) -{ - char *str = (char *)user_data; - - if (thread == &test_thread) { - TC_PRINT("%s: Newly added thread found\n", str); - TC_PRINT("%s: tid: %p, prio: %d\n", - str, thread, thread->base.prio); - thread_flag = true; - } - - if ((char *)thread->stack_info.start == - K_THREAD_STACK_BUFFER(test_stack)) { - TC_PRINT("%s: Newly added thread stack found\n", str); - TC_PRINT("%s: stack:%p, size:%u\n", str, - (char *)thread->stack_info.start, - thread->stack_info.size); - stack_flag = true; - } - - tcount++; -} - -static void test_k_thread_foreach(void) -{ - int count; - - /* Call k_thread_foreach() and check - * thread_callback is getting called. - */ - k_thread_foreach(thread_callback, TEST_STRING); - - /* Check thread_count non-zero, thread_flag - * and stack_flag are not set. - */ - zassert_true(tcount && !thread_flag && !stack_flag, - "thread_callback() not getting called"); - /* Save the initial thread count */ - count = tcount; - - /* Create new thread which should add a new entry to the thread list */ - k_tid_t tid = k_thread_create(&test_thread, test_stack, - STACKSIZE, (k_thread_entry_t)thread_entry, NULL, - NULL, NULL, K_PRIO_PREEMPT(0), 0, 0); - k_sleep(1); - - /* Call k_thread_foreach() and check - * thread_callback is getting called for - * the newly added thread. - */ - tcount = 0; - k_thread_foreach(thread_callback, TEST_STRING); - - /* Check thread_count > temp, thread_flag and stack_flag are set */ - zassert_true((tcount > count) && thread_flag && stack_flag, - "thread_callback() not getting called"); - k_thread_abort(tid); -} - /*TODO: add test case to capture the usage of interrupt call stack*/ - void test_main(void) { ztest_test_suite(profiling_api, ztest_unit_test(test_call_stacks_analyze_main), ztest_unit_test(test_call_stacks_analyze_idle), - ztest_unit_test(test_call_stacks_analyze_workq), - ztest_unit_test(test_k_thread_foreach)); + ztest_unit_test(test_call_stacks_analyze_workq)); ztest_run_test_suite(profiling_api); } diff --git a/tests/kernel/threads/thread_apis/prj.conf b/tests/kernel/threads/thread_apis/prj.conf index 75319968f14..5cf0fbdbe60 100644 --- a/tests/kernel/threads/thread_apis/prj.conf +++ b/tests/kernel/threads/thread_apis/prj.conf @@ -1,4 +1,5 @@ CONFIG_ZTEST=y CONFIG_THREAD_MONITOR=y -CONFIG_HEAP_MEM_POOL_SIZE=256 CONFIG_THREAD_CUSTOM_DATA=y +CONFIG_THREAD_STACK_INFO=y +CONFIG_HEAP_MEM_POOL_SIZE=256 diff --git a/tests/kernel/threads/thread_apis/src/main.c b/tests/kernel/threads/thread_apis/src/main.c index fe1b4a9973f..000a13c73eb 100644 --- a/tests/kernel/threads/thread_apis/src/main.c +++ b/tests/kernel/threads/thread_apis/src/main.c @@ -28,6 +28,7 @@ extern void test_abort_handler(void); extern void test_essential_thread_operation(void); extern void test_threads_priority_set(void); extern void test_delayed_thread_abort(void); +extern void test_k_thread_foreach(void); __kernel struct k_thread tdata; #define STACK_SIZE (256 + CONFIG_TEST_EXTRA_STACKSIZE) @@ -135,7 +136,8 @@ void test_main(void) ztest_unit_test(test_systhreads_main), ztest_unit_test(test_systhreads_idle), ztest_unit_test(test_customdata_get_set_coop), - ztest_user_unit_test(test_customdata_get_set_preempt) + ztest_user_unit_test(test_customdata_get_set_preempt), + ztest_unit_test(test_k_thread_foreach) ); ztest_run_test_suite(threads_lifecycle); diff --git a/tests/kernel/threads/thread_apis/src/test_kthread_for_each.c b/tests/kernel/threads/thread_apis/src/test_kthread_for_each.c new file mode 100644 index 00000000000..d7cfa8a5d8e --- /dev/null +++ b/tests/kernel/threads/thread_apis/src/test_kthread_for_each.c @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2018 Intel Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include + +#define SLEEP_MS 100 +#define TEST_STRING "TEST" + +#define STACKSIZE (256 + CONFIG_TEST_EXTRA_STACKSIZE) +K_THREAD_STACK_EXTERN(tstack); +extern struct k_thread tdata; + +static int tcount; +static bool thread_flag; +static bool stack_flag; + +static void thread_entry(void *p1, void *p2, void *p3) +{ + k_sleep(SLEEP_MS); +} + +static void thread_callback(const struct k_thread *thread, void *user_data) +{ + char *str = (char *)user_data; + + if (thread == &tdata) { + TC_PRINT("%s: Newly added thread found\n", str); + TC_PRINT("%s: tid: %p, prio: %d\n", + str, thread, thread->base.prio); + thread_flag = true; + } + + if ((char *)thread->stack_info.start == + K_THREAD_STACK_BUFFER(tstack)) { + TC_PRINT("%s: Newly added thread stack found\n", str); + TC_PRINT("%s: stack:%p, size:%u\n", str, + (char *)thread->stack_info.start, + thread->stack_info.size); + stack_flag = true; + } + + tcount++; +} + +/** + * @ingroup kernel_thread_tests + * @brief Test k_thread_foreach API + * + * @details Call k_thread_foreach() at the beginning of the test and + * call it again after creating a thread, See k_thread_foreach() + * iterates over the newly created thread and calls the user passed + * callback function. + * + * @see k_thread_foreach() + */ +void test_k_thread_foreach(void) +{ + int count; + + k_thread_foreach(thread_callback, TEST_STRING); + + /* Check thread_count non-zero, thread_flag + * and stack_flag are not set. + */ + zassert_true(tcount && !thread_flag && !stack_flag, + "thread_callback() not getting called"); + /* Save the initial thread count */ + count = tcount; + + /* Create new thread which should add a new entry to the thread list */ + k_tid_t tid = k_thread_create(&tdata, tstack, + STACKSIZE, (k_thread_entry_t)thread_entry, NULL, + NULL, NULL, K_PRIO_PREEMPT(0), 0, 0); + k_sleep(1); + + /* Call k_thread_foreach() and check + * thread_callback is getting called for + * the newly added thread. + */ + tcount = 0; + k_thread_foreach(thread_callback, TEST_STRING); + + /* Check thread_count > temp, thread_flag and stack_flag are set */ + zassert_true((tcount > count) && thread_flag && stack_flag, + "thread_callback() not getting called"); + k_thread_abort(tid); +} +