Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 | /* * Copyright (c) 2016 Intel Corporation * * SPDX-License-Identifier: Apache-2.0 */ #include <zephyr/ztest.h> #include "tests_thread_apis.h" static ZTEST_BMEM char tp1[8]; static ZTEST_DMEM int tp2 = 100; static ZTEST_BMEM struct k_sema *tp3; static ZTEST_BMEM int spawn_prio; static void thread_entry_params(void *p1, void *p2, void *p3) { /* checkpoint: check parameter 1, 2, 3 */ zassert_equal(p1, tp1); zassert_equal(POINTER_TO_INT(p2), tp2); zassert_equal(p3, tp3); } static void thread_entry_priority(void *p1, void *p2, void *p3) { /* checkpoint: check priority */ zassert_equal(k_thread_priority_get(k_current_get()), spawn_prio); } static void thread_entry_delay(void *p1, void *p2, void *p3) { tp2 = 100; } /* test cases */ /** * @ingroup kernel_thread_tests * @brief Check the parameters passed to thread entry function * * @details Create an user thread and pass 2 variables and a * semaphore to a thread entry function. Check for the correctness * of the parameters passed. * * @see k_thread_create() */ ZTEST_USER(threads_lifecycle, test_threads_spawn_params) { k_thread_create(&tdata, tstack, STACK_SIZE, thread_entry_params, tp1, INT_TO_POINTER(tp2), tp3, 0, K_USER, K_NO_WAIT); k_msleep(100); } /** * @ingroup kernel_thread_tests * @brief Spawn thread with higher priority * * @details Create an user thread with priority greater than * current thread and check its behavior. * * @see k_thread_create() */ ZTEST(threads_lifecycle, test_threads_spawn_priority) { /* spawn thread with higher priority */ spawn_prio = k_thread_priority_get(k_current_get()) - 1; k_thread_create(&tdata, tstack, STACK_SIZE, thread_entry_priority, NULL, NULL, NULL, spawn_prio, K_USER, K_NO_WAIT); k_msleep(100); } /** * @ingroup kernel_thread_tests * @brief Spawn thread with a delay * * @details Create a user thread with delay and check if the * thread entry function is executed only after the timeout occurs. * * @see k_thread_create() */ ZTEST_USER(threads_lifecycle, test_threads_spawn_delay) { /* spawn thread with higher priority */ tp2 = 10; k_thread_create(&tdata, tstack, STACK_SIZE, thread_entry_delay, NULL, NULL, NULL, 0, K_USER, K_MSEC(120)); /* 100 < 120 ensure spawn thread not start */ k_msleep(100); /* checkpoint: check spawn thread not execute */ zassert_true(tp2 == 10); /* checkpoint: check spawn thread executed */ k_msleep(100); zassert_true(tp2 == 100); } /** * @ingroup kernel_thread_tests * @brief Spawn thread with forever delay and highest priority * * @details Create an user thread with forever delay and yield * the current thread. Even though the current thread has yielded, * the thread will not be put in ready queue since it has forever delay, * the thread is explicitly started using k_thread_start() and checked * if thread has started executing. * * @see k_thread_create() */ ZTEST(threads_lifecycle, test_threads_spawn_forever) { /* spawn thread with highest priority. It will run immediately once * started. */ tp2 = 10; k_tid_t tid = k_thread_create(&tdata, tstack, STACK_SIZE, thread_entry_delay, NULL, NULL, NULL, K_HIGHEST_THREAD_PRIO, K_USER, K_FOREVER); k_yield(); /* checkpoint: check spawn thread not execute */ zassert_true(tp2 == 10); /* checkpoint: check spawn thread executed */ k_thread_start(tid); k_yield(); zassert_true(tp2 == 100); k_thread_abort(tid); } /** * @ingroup kernel_thread_tests * @brief Validate behavior of multiple calls to k_thread_start() * * @details Call k_thread_start() on an already terminated thread * * @see k_thread_start() */ ZTEST(threads_lifecycle, test_thread_start) { tp2 = 5; k_tid_t tid = k_thread_create(&tdata, tstack, STACK_SIZE, thread_entry_delay, NULL, NULL, NULL, K_HIGHEST_THREAD_PRIO, K_USER, K_FOREVER); k_thread_start(tid); k_yield(); zassert_true(tp2 == 100); /* checkpoint: k_thread_start() should not start the * terminated thread */ tp2 = 50; k_thread_start(tid); k_yield(); zassert_false(tp2 == 100); } static void user_start_thread(void *p1, void *p2, void *p3) { *(int *)p1 = 100; } ZTEST_USER(threads_lifecycle, test_thread_start_user) { tp2 = 5; k_tid_t tid = k_thread_create(&tdata, tstack, STACK_SIZE, user_start_thread, &tp2, NULL, NULL, 0, K_USER, K_FOREVER); k_thread_start(tid); k_msleep(100); zassert_true(tp2 == 100); k_thread_abort(tid); } |