diff --git a/os/rt/include/chschd.h b/os/rt/include/chschd.h --- a/os/rt/include/chschd.h +++ b/os/rt/include/chschd.h @@ -176,6 +176,23 @@ struct ch_thread { * @brief References to this thread. */ trefs_t refs; +#endif +#if (CH_CFG_USE_THREADHIERARCHY == TRUE) || defined(__DOXYGEN__) + /** + * @brief Pointer to the parent thread. + * @note NULL only for the main thread. + */ + thread_t *parent; + /** + * @brief Pointer to the first child thread. + * @note NULL if there are no child threads. + */ + thread_t *children; + /** + * @brief Pointer to the next sibling thread. + * @brief NULL if there are no more child threads. + */ + thread_t *sibling; #endif /** * @brief Number of ticks remaining to this thread. diff --git a/os/rt/include/chthreads.h b/os/rt/include/chthreads.h --- a/os/rt/include/chthreads.h +++ b/os/rt/include/chthreads.h @@ -79,6 +79,12 @@ typedef struct { * @brief Thread argument. */ void *arg; +#if (CH_CFG_USE_THREADHIERARCHY) == TRUE || defined(__DOXYGEN__) + /** + * @brief Pointer to the parent thread. + */ + thread_t *parent; +#endif } thread_descriptor_t; /*===========================================================================*/ @@ -220,7 +226,11 @@ typedef struct { #ifdef __cplusplus extern "C" { #endif +#if CH_CFG_USE_THREADHIERARCHY == TRUE + thread_t *_thread_init(thread_t *tp, thread_t* parent, const char *name, tprio_t prio); +#else thread_t *_thread_init(thread_t *tp, const char *name, tprio_t prio); +#endif #if CH_DBG_FILL_THREADS == TRUE void _thread_memfill(uint8_t *startp, uint8_t *endp, uint8_t v); #endif @@ -228,8 +238,13 @@ extern "C" { thread_t *chThdCreateSuspended(const thread_descriptor_t *tdp); thread_t *chThdCreateI(const thread_descriptor_t *tdp); thread_t *chThdCreate(const thread_descriptor_t *tdp); +#if CH_CFG_USE_THREADHIERARCHY == TRUE + thread_t *chThdCreateStatic(void *wsp, size_t size, + tprio_t prio, tfunc_t pf, void *arg, thread_t *parent); +#else thread_t *chThdCreateStatic(void *wsp, size_t size, tprio_t prio, tfunc_t pf, void *arg); +#endif thread_t *chThdStart(thread_t *tp); #if CH_CFG_USE_REGISTRY == TRUE thread_t *chThdAddRef(thread_t *tp); diff --git a/os/rt/src/chsys.c b/os/rt/src/chsys.c --- a/os/rt/src/chsys.c +++ b/os/rt/src/chsys.c @@ -126,14 +126,26 @@ void chSysInit(void) { #if CH_CFG_NO_IDLE_THREAD == FALSE /* Now this instructions flow becomes the main thread.*/ #if CH_CFG_USE_REGISTRY == TRUE +#if CH_CFG_USE_THREADHIERARCHY == TRUE + currp = _thread_init(&ch.mainthread, NULL, (const char *)&ch_debug, NORMALPRIO); +#else currp = _thread_init(&ch.mainthread, (const char *)&ch_debug, NORMALPRIO); +#endif +#else +#if CH_CFG_USE_THREADHIERARCHY == TRUE + currp = _thread_init(&ch.mainthread, NULL, "main", NORMALPRIO); #else currp = _thread_init(&ch.mainthread, "main", NORMALPRIO); #endif +#endif #else /* Now this instructions flow becomes the idle thread.*/ +#if CH_CFG_USE_THREADHIERARCHY == TRUE + currp = _thread_init(&ch.mainthread, NULL, "idle", IDLEPRIO); +#else currp = _thread_init(&ch.mainthread, "idle", IDLEPRIO); #endif +#endif #if CH_DBG_ENABLE_STACK_CHECK == TRUE { @@ -172,6 +184,9 @@ void chSysInit(void) { THD_WORKING_AREA_END(ch_idle_thread_wa), IDLEPRIO, _idle_thread, +#if CH_CFG_USE_THREADHIERARCHY == TRUE + NULL, +#endif NULL }; diff --git a/os/rt/src/chthreads.c b/os/rt/src/chthreads.c --- a/os/rt/src/chthreads.c +++ b/os/rt/src/chthreads.c @@ -70,22 +70,67 @@ /* Module local functions. */ /*===========================================================================*/ +#if CH_CFG_USE_THREADHIERARCHY == TRUE || defined(__DOXYGEN__) +/** + * @brief Insert a thread to the list of children of another thread. + * @details If @p CH_CFG_THREADHIERARCHY_ORDERED is @p TRUE, children are ordered by their priorities (high to low). + * Children with identical priority are ordered by 'age' (youngest first). + * + * @param[in] parent Pointer to the parent thread (must not be NULL). + * @param[in] child Pointer to the child thread (must not be NULL). + */ +inline void _thread_addChild(thread_t *parent, thread_t *child) { +#if CH_CFG_THREADHIERARCHY_ORDERED == TRUE + thread_t *sibling = parent->children; + child->parent = parent; +#if CH_CFG_USE_MUTEXES == TRUE + if (sibling == NULL || sibling->realprio <= child->realprio) { +#else + if (sibling == NULL || sibling->prio <= child->prio) { +#endif + child->sibling = sibling; + parent->children = child; + } else { +#if CH_CFG_USE_MUTEXES == TRUE + while (sibling->sibling != NULL && sibling->sibling->realprio > child->realprio) { +#else + while (sibling->sibling != NULL && sibling->sibling->prio > child->prio) { +#endif + sibling = sibling->sibling; + } + child->sibling = sibling->sibling; + sibling->sibling = child; + } +#else + child->parent = parent; + child->sibling = parent->children; + parent->children = child; +#endif + return; +} +#endif + /*===========================================================================*/ /* Module exported functions. */ /*===========================================================================*/ +#if CH_CFG_USE_THREADHIERARCHY == TRUE || defined(__DOXYGEN__) /** * @brief Initializes a thread structure. * @note This is an internal functions, do not use it in application code. * * @param[in] tp pointer to the thread + * @param[in] parent pointer to the parent thread * @param[in] name thread name * @param[in] prio the priority level for the new thread * @return The same thread pointer passed as parameter. * * @notapi */ +thread_t *_thread_init(thread_t *tp, thread_t *parent, const char *name, tprio_t prio) { +#else thread_t *_thread_init(thread_t *tp, const char *name, tprio_t prio) { +#endif tp->prio = prio; tp->state = CH_STATE_WTSTART; @@ -110,6 +155,17 @@ thread_t *_thread_init(thread_t *tp, const char *name, tprio_t prio) { #else (void)name; #endif +#if CH_CFG_USE_THREADHIERARCHY == TRUE + if (parent != NULL) { + _thread_addChild(parent, tp); + } else { + tp->parent = parent; + tp->sibling = NULL; + } + tp->children = NULL; +#else + (void)parent; +#endif #if CH_CFG_USE_WAITEXIT == TRUE list_init(&tp->waiting); #endif @@ -190,7 +246,11 @@ thread_t *chThdCreateSuspendedI(const thread_descriptor_t *tdp) { PORT_SETUP_CONTEXT(tp, tdp->wbase, tp, tdp->funcp, tdp->arg); /* The driver object is initialized but not started.*/ +#if CH_CFG_USE_THREADHIERARCHY == TRUE + return _thread_init(tp, tdp->parent, tdp->name, tdp->prio); +#else return _thread_init(tp, tdp->name, tdp->prio); +#endif } /** @@ -300,6 +360,7 @@ thread_t *chThdCreate(const thread_descriptor_t *tdp) { return tp; } +#if CH_CFG_USE_THREADHIERARCHY == TRUE || defined(__DOXYGEN__) /** * @brief Creates a new thread into a static memory area. * @post The created thread has a reference counter set to one, it is @@ -315,13 +376,20 @@ thread_t *chThdCreate(const thread_descriptor_t *tdp) { * @param[in] pf the thread function * @param[in] arg an argument passed to the thread function. It can be * @p NULL. + * @param[in] parent pointer to a parent thread. Parameter only available if + * @p CH_CFG_USE_THREADHIERARCHY is @p TRUE. It can be + * @p NULL. * @return The pointer to the @p thread_t structure allocated for * the thread into the working space area. * * @api */ +thread_t *chThdCreateStatic(void *wsp, size_t size, + tprio_t prio, tfunc_t pf, void *arg, thread_t *parent) { +#else thread_t *chThdCreateStatic(void *wsp, size_t size, tprio_t prio, tfunc_t pf, void *arg) { +#endif thread_t *tp; chDbgCheck((wsp != NULL) && @@ -358,7 +426,11 @@ thread_t *chThdCreateStatic(void *wsp, size_t size, /* Setting up the port-dependent part of the working area.*/ PORT_SETUP_CONTEXT(tp, wsp, tp, pf, arg); +#if CH_CFG_USE_THREADHIERARCHY == TRUE + tp = _thread_init(tp, parent, "noname", prio); +#else tp = _thread_init(tp, "noname", prio); +#endif /* Starting the thread immediately.*/ chSchWakeupS(tp, MSG_OK); @@ -529,6 +601,30 @@ void chThdExitS(msg_t msg) { #endif #endif +#if CH_CFG_USE_THREADHIERARCHY == TRUE + thread_t *child; + /* Remove from parent's list of children. */ + if (tp->parent != NULL) { + if (tp->parent->children == tp) { + tp->parent->children = tp->sibling; + } else { + child = tp->parent->children; + while (child->sibling != tp) { + child = child->sibling; + } + child->sibling = tp->sibling; + } + tp->parent = NULL; + } + tp->sibling = NULL; + /* Move any child threads to the main thread. */ + while (tp->children != NULL) { + child = tp->children; + tp->children = child->sibling; + _thread_addChild(&ch.mainthread, child); + } +#endif + /* Going into final state.*/ chSchGoSleepS(CH_STATE_FINAL); @@ -610,6 +706,43 @@ tprio_t chThdSetPriority(tprio_t newprio) { #else oldprio = currp->prio; currp->prio = newprio; +#endif +#if (CH_CFG_USE_THREADHIERARCHY == TRUE) && (CH_CFG_THREADHIERARCHY_ORDERED == TRUE) + /* Reorder sibling list. */ + if (currp->parent != NULL && newprio != oldprio) { + thread_t *sibling, *oldsibling; + if (newprio > oldprio) { + oldsibling = currp->sibling; + _thread_addChild(currp->parent, currp); + sibling = currp->sibling; + if (sibling != NULL) { + while (sibling->sibling != currp) { + sibling = sibling->sibling; + } + sibling->sibling = oldsibling; + } + } else /*if (newprio < oldprio)*/ { + sibling = currp->parent->children; + if (sibling == currp) { + currp->parent->children = currp->sibling; + _thread_addChild(currp->parent, currp); + } else { + while (sibling->sibling != currp) { + sibling = sibling->sibling; + } + sibling->sibling = currp->sibling; +#if CH_CFG_USE_MUTEXES == TRUE + while (sibling->sibling != NULL && sibling->sibling->realprio > currp->realprio) { +#else + while (sibling->sibling != NULL && sibling->sibling->prio > currp->prio) { +#endif + sibling = sibling->sibling; + } + currp->sibling = sibling->sibling; + sibling->sibling = currp; + } + } + } #endif chSchRescheduleS(); chSysUnlock(); diff --git a/test/rt/source/test/rt_test_root.c b/test/rt/source/test/rt_test_root.c --- a/test/rt/source/test/rt_test_root.c +++ b/test/rt/source/test/rt_test_root.c @@ -106,6 +106,14 @@ void * ROMCONST wa[5] = {test_buffer + (WA_SIZE * 0), test_buffer + (WA_SIZE * 3), test_buffer + (WA_SIZE * 4)}; +thread_t *test_create_thread(void *wsp, size_t size, tprio_t prio, tfunc_t pf, void *arg) { +#if CH_CFG_USE_THREADHIERARCHY == TRUE + return chThdCreateStatic(wsp, size, prio, pf, arg, chThdGetSelfX()); +#else + return chThdCreateStatic(wsp, size, prio, pf, arg); +#endif +} + /* * Sets a termination request in all the test-spawned threads. */ diff --git a/test/rt/source/test/rt_test_root.h b/test/rt/source/test/rt_test_root.h --- a/test/rt/source/test/rt_test_root.h +++ b/test/rt/source/test/rt_test_root.h @@ -88,6 +88,7 @@ extern thread_t *threads[MAX_THREADS]; extern void * ROMCONST wa[5]; void test_print_port_info(void); +thread_t *test_create_thread(void *wsp, size_t size, tprio_t prio, tfunc_t pf, void *arg); void test_terminate_threads(void); void test_wait_threads(void); systime_t test_wait_tick(void); diff --git a/test/rt/source/test/rt_test_sequence_001.c b/test/rt/source/test/rt_test_sequence_001.c --- a/test/rt/source/test/rt_test_sequence_001.c +++ b/test/rt/source/test/rt_test_sequence_001.c @@ -193,6 +193,12 @@ static void rt_test_001_003_execute(void) { test_print("--- CH_CFG_USE_REGISTRY: "); test_printn(CH_CFG_USE_REGISTRY); test_println(""); + test_print("--- CH_CFG_USE_THREADHIERARCHY: "); + test_printn(CH_CFG_USE_THREADHIERARCHY); + test_println(""); + test_print("--- CH_CFG_THREADHIERARCHY_ORDERED: "); + test_printn(CH_CFG_THREADHIERARCHY_ORDERED); + test_println(""); test_print("--- CH_CFG_USE_WAITEXIT: "); test_printn(CH_CFG_USE_WAITEXIT); test_println(""); @@ -207,7 +213,7 @@ static void rt_test_001_003_execute(void) { test_println(""); test_print("--- CH_CFG_USE_MUTEXES_RECURSIVE: "); test_printn(CH_CFG_USE_MUTEXES_RECURSIVE); - test_println(""); + test_println(""); test_print("--- CH_CFG_USE_CONDVARS: "); test_printn(CH_CFG_USE_CONDVARS); test_println(""); diff --git a/test/rt/source/test/rt_test_sequence_003.c b/test/rt/source/test/rt_test_sequence_003.c --- a/test/rt/source/test/rt_test_sequence_003.c +++ b/test/rt/source/test/rt_test_sequence_003.c @@ -46,6 +46,20 @@ static THD_FUNCTION(thread, p) { test_emit_token(*(char *)p); } +#if (CH_CFG_USE_THREADHIERARCHY) +static THD_FUNCTION(hierarchythread, p) { + + do { + if (*(tprio_t *)p != chThdGetPriorityX()) { + chThdSetPriority(*(tprio_t *)p); + } + chThdSleepMilliseconds(10); + } while (!chThdShouldTerminateX()); + + chThdExit(MSG_OK); +} +#endif + /**************************************************************************** * Test cases. ****************************************************************************/ @@ -166,11 +180,11 @@ static void rt_test_003_002_execute(void) { sequence is tested.*/ test_set_step(1); { - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX()-5, thread, "E"); - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriorityX()-4, thread, "D"); - threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriorityX()-3, thread, "C"); - threads[3] = chThdCreateStatic(wa[3], WA_SIZE, chThdGetPriorityX()-2, thread, "B"); - threads[4] = chThdCreateStatic(wa[4], WA_SIZE, chThdGetPriorityX()-1, thread, "A"); + threads[0] = test_create_thread(wa[0], WA_SIZE, chThdGetPriorityX()-5, thread, "E"); + threads[1] = test_create_thread(wa[1], WA_SIZE, chThdGetPriorityX()-4, thread, "D"); + threads[2] = test_create_thread(wa[2], WA_SIZE, chThdGetPriorityX()-3, thread, "C"); + threads[3] = test_create_thread(wa[3], WA_SIZE, chThdGetPriorityX()-2, thread, "B"); + threads[4] = test_create_thread(wa[4], WA_SIZE, chThdGetPriorityX()-1, thread, "A"); test_wait_threads(); test_assert_sequence("ABCDE", "invalid sequence"); } @@ -179,11 +193,11 @@ static void rt_test_003_002_execute(void) { sequence is tested.*/ test_set_step(2); { - threads[4] = chThdCreateStatic(wa[4], WA_SIZE, chThdGetPriorityX()-1, thread, "A"); - threads[3] = chThdCreateStatic(wa[3], WA_SIZE, chThdGetPriorityX()-2, thread, "B"); - threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriorityX()-3, thread, "C"); - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriorityX()-4, thread, "D"); - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX()-5, thread, "E"); + threads[4] = test_create_thread(wa[4], WA_SIZE, chThdGetPriorityX()-1, thread, "A"); + threads[3] = test_create_thread(wa[3], WA_SIZE, chThdGetPriorityX()-2, thread, "B"); + threads[2] = test_create_thread(wa[2], WA_SIZE, chThdGetPriorityX()-3, thread, "C"); + threads[1] = test_create_thread(wa[1], WA_SIZE, chThdGetPriorityX()-4, thread, "D"); + threads[0] = test_create_thread(wa[0], WA_SIZE, chThdGetPriorityX()-5, thread, "E"); test_wait_threads(); test_assert_sequence("ABCDE", "invalid sequence"); } @@ -192,11 +206,11 @@ static void rt_test_003_002_execute(void) { sequence is tested.*/ test_set_step(3); { - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriorityX()-4, thread, "D"); - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX()-5, thread, "E"); - threads[4] = chThdCreateStatic(wa[4], WA_SIZE, chThdGetPriorityX()-1, thread, "A"); - threads[3] = chThdCreateStatic(wa[3], WA_SIZE, chThdGetPriorityX()-2, thread, "B"); - threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriorityX()-3, thread, "C"); + threads[1] = test_create_thread(wa[1], WA_SIZE, chThdGetPriorityX()-4, thread, "D"); + threads[0] = test_create_thread(wa[0], WA_SIZE, chThdGetPriorityX()-5, thread, "E"); + threads[4] = test_create_thread(wa[4], WA_SIZE, chThdGetPriorityX()-1, thread, "A"); + threads[3] = test_create_thread(wa[3], WA_SIZE, chThdGetPriorityX()-2, thread, "B"); + threads[2] = test_create_thread(wa[2], WA_SIZE, chThdGetPriorityX()-3, thread, "C"); test_wait_threads(); test_assert_sequence("ABCDE", "invalid sequence"); } @@ -325,6 +339,405 @@ static const testcase_t rt_test_003_004 = { }; #endif /* CH_CFG_USE_MUTEXES */ +#if (CH_CFG_USE_THREADHIERARCHY) || defined(__DOXYGEN__) +/** + * @page rt_test_003_005 [3.5] Thread hierarach with (un)ordered lists. + * + *

Description

+ * Todo + * + *

Conditions

+ * This test is only executed if the following preprocessor condition + * evaluates to true: + * - CH_CFG_USE_THREADHIERARCHY + * This test comprises additional tests if the following preprocessor + * condition evaluates to true: + * - CH_CFG_THREADHIERARCHY_ORDERED + * . + * + *

Test Steps

+ * Todo + * . + */ + +static void rt_test_003_005_execute(void) { + + /* [3.5.1] Creating 1 parent and 4 child threads with increasing priority, + * hierarchy information is tested */ + test_set_step(1); + { + tprio_t prios[MAX_THREADS]; + thread_t *threads_cpy[MAX_THREADS]; + thread_t *parents[MAX_THREADS]; + thread_t *siblings[MAX_THREADS]; + prios[0] = chThdGetPriorityX()-1; + prios[1] = chThdGetPriorityX()-5; + prios[2] = chThdGetPriorityX()-4; + prios[3] = chThdGetPriorityX()-3; + prios[4] = chThdGetPriorityX()-2; + threads[0] = chThdCreateStatic(wa[0], WA_SIZE, prios[0], hierarchythread, &prios[0], chThdGetSelfX()); + threads[1] = chThdCreateStatic(wa[1], WA_SIZE, prios[1], hierarchythread, &prios[1], threads[0]); + threads[2] = chThdCreateStatic(wa[2], WA_SIZE, prios[2], hierarchythread, &prios[2], threads[0]); + threads[3] = chThdCreateStatic(wa[3], WA_SIZE, prios[3], hierarchythread, &prios[3], threads[0]); + threads[4] = chThdCreateStatic(wa[4], WA_SIZE, prios[4], hierarchythread, &prios[4], threads[0]); + threads_cpy[0] = threads[0]; + threads_cpy[1] = threads[1]; + threads_cpy[2] = threads[2]; + threads_cpy[3] = threads[3]; + threads_cpy[4] = threads[4]; + parents[0] = threads[0]->parent; + parents[1] = threads[1]->parent; + parents[2] = threads[2]->parent; + parents[3] = threads[3]->parent; + parents[4] = threads[4]->parent; + siblings[0] = threads[0]->children; + siblings[1] = threads[1]->sibling; + siblings[2] = threads[2]->sibling; + siblings[3] = threads[3]->sibling; + siblings[4] = threads[4]->sibling; + chThdTerminate(threads[0]); + chThdTerminate(threads[1]); + chThdTerminate(threads[2]); + chThdTerminate(threads[3]); + chThdTerminate(threads[4]); + test_wait_threads(); + test_assert(parents[0] == chThdGetSelfX() && + parents[1] == threads_cpy[0] && + parents[2] == threads_cpy[0] && + parents[3] == threads_cpy[0] && + parents[4] == threads_cpy[0] && + siblings[0] == threads_cpy[4] && + siblings[1] == NULL && + siblings[2] == threads_cpy[1] && + siblings[3] == threads_cpy[2] && + siblings[4] == threads_cpy[3], "invalid children list"); + } + + /* [3.5.2] Creating 1 parent and 4 child threads with decreasing priority, + * hierarchy information is tested.*/ + test_set_step(2); + { + tprio_t prios[MAX_THREADS]; + thread_t *threads_cpy[MAX_THREADS]; + thread_t *parents[MAX_THREADS]; + thread_t *siblings[MAX_THREADS]; + prios[0] = chThdGetPriorityX()-1; + prios[1] = chThdGetPriorityX()-2; + prios[2] = chThdGetPriorityX()-3; + prios[3] = chThdGetPriorityX()-4; + prios[4] = chThdGetPriorityX()-5; + threads[0] = chThdCreateStatic(wa[0], WA_SIZE, prios[0], hierarchythread, &prios[0], chThdGetSelfX()); + threads[1] = chThdCreateStatic(wa[1], WA_SIZE, prios[1], hierarchythread, &prios[1], threads[0]); + threads[2] = chThdCreateStatic(wa[2], WA_SIZE, prios[2], hierarchythread, &prios[2], threads[0]); + threads[3] = chThdCreateStatic(wa[3], WA_SIZE, prios[3], hierarchythread, &prios[3], threads[0]); + threads[4] = chThdCreateStatic(wa[4], WA_SIZE, prios[4], hierarchythread, &prios[4], threads[0]); + threads_cpy[0] = threads[0]; + threads_cpy[1] = threads[1]; + threads_cpy[2] = threads[2]; + threads_cpy[3] = threads[3]; + threads_cpy[4] = threads[4]; + parents[0] = threads[0]->parent; + parents[1] = threads[1]->parent; + parents[2] = threads[2]->parent; + parents[3] = threads[3]->parent; + parents[4] = threads[4]->parent; + siblings[0] = threads[0]->children; + siblings[1] = threads[1]->sibling; + siblings[2] = threads[2]->sibling; + siblings[3] = threads[3]->sibling; + siblings[4] = threads[4]->sibling; + test_terminate_threads(); + test_wait_threads(); +#if CH_CFG_THREADHIERARCHY_ORDERED == TRUE + test_assert(parents[0] == chThdGetSelfX() && + parents[1] == threads_cpy[0] && + parents[2] == threads_cpy[0] && + parents[3] == threads_cpy[0] && + parents[4] == threads_cpy[0] && + siblings[0] == threads_cpy[1] && + siblings[1] == threads_cpy[2] && + siblings[2] == threads_cpy[3] && + siblings[3] == threads_cpy[4] && + siblings[4] == NULL, "invalid children list"); +#else + test_assert(parents[0] == chThdGetSelfX() && + parents[1] == threads_cpy[0] && + parents[2] == threads_cpy[0] && + parents[3] == threads_cpy[0] && + parents[4] == threads_cpy[0] && + siblings[0] == threads_cpy[4] && + siblings[4] == threads_cpy[3] && + siblings[3] == threads_cpy[2] && + siblings[2] == threads_cpy[1] && + siblings[1] == NULL, "invalid children list"); +#endif + } + + /* [3.5.3] Creating 1 parent and 4 child threads with identical priority, + * hierarchy information is tested.*/ + test_set_step(3); + { + tprio_t prios[MAX_THREADS]; + thread_t *threads_cpy[MAX_THREADS]; + thread_t *parents[MAX_THREADS]; + thread_t *siblings[MAX_THREADS]; + prios[0] = chThdGetPriorityX()-1; + prios[1] = chThdGetPriorityX()-2; + prios[2] = chThdGetPriorityX()-2; + prios[3] = chThdGetPriorityX()-2; + prios[4] = chThdGetPriorityX()-2; + threads[0] = chThdCreateStatic(wa[0], WA_SIZE, prios[0], hierarchythread, &prios[0], chThdGetSelfX()); + threads[1] = chThdCreateStatic(wa[1], WA_SIZE, prios[1], hierarchythread, &prios[1], threads[0]); + threads[2] = chThdCreateStatic(wa[2], WA_SIZE, prios[2], hierarchythread, &prios[2], threads[0]); + threads[3] = chThdCreateStatic(wa[3], WA_SIZE, prios[3], hierarchythread, &prios[3], threads[0]); + threads[4] = chThdCreateStatic(wa[4], WA_SIZE, prios[4], hierarchythread, &prios[4], threads[0]); + threads_cpy[0] = threads[0]; + threads_cpy[1] = threads[1]; + threads_cpy[2] = threads[2]; + threads_cpy[3] = threads[3]; + threads_cpy[4] = threads[4]; + parents[0] = threads[0]->parent; + parents[1] = threads[1]->parent; + parents[2] = threads[2]->parent; + parents[3] = threads[3]->parent; + parents[4] = threads[4]->parent; + siblings[0] = threads[0]->children; + siblings[1] = threads[1]->sibling; + siblings[2] = threads[2]->sibling; + siblings[3] = threads[3]->sibling; + siblings[4] = threads[4]->sibling; + test_terminate_threads(); + test_wait_threads(); + test_assert(parents[0] == chThdGetSelfX() && + parents[1] == threads_cpy[0] && + parents[2] == threads_cpy[0] && + parents[3] == threads_cpy[0] && + parents[4] == threads_cpy[0] && + siblings[0] == threads_cpy[4] && + siblings[1] == NULL && + siblings[2] == threads_cpy[1] && + siblings[3] == threads_cpy[2] && + siblings[4] == threads_cpy[3] , "invalid children list"); + } + + /* [3.5.4] Creating 1 parent and 4 child threads with increasing priority + * which are terminated in a controlled manner, hierarchy information is + * tested.*/ + test_set_step(4); + { + tprio_t prios[MAX_THREADS]; + thread_t *threads_cpy[MAX_THREADS]; + thread_t *parents[MAX_THREADS]; + thread_t *siblings[MAX_THREADS]; + prios[0] = chThdGetPriorityX()-1; + prios[1] = chThdGetPriorityX()-5; + prios[2] = chThdGetPriorityX()-4; + prios[3] = chThdGetPriorityX()-3; + prios[4] = chThdGetPriorityX()-2; + threads[0] = chThdCreateStatic(wa[0], WA_SIZE, prios[0], hierarchythread, &prios[0], chThdGetSelfX()); + threads[1] = chThdCreateStatic(wa[1], WA_SIZE, prios[1], hierarchythread, &prios[1], threads[0]); + threads[2] = chThdCreateStatic(wa[2], WA_SIZE, prios[2], hierarchythread, &prios[2], threads[0]); + threads[3] = chThdCreateStatic(wa[3], WA_SIZE, prios[3], hierarchythread, &prios[3], threads[0]); + threads[4] = chThdCreateStatic(wa[4], WA_SIZE, prios[4], hierarchythread, &prios[4], threads[0]); + threads_cpy[0] = threads[0]; + threads_cpy[1] = threads[1]; + threads_cpy[2] = threads[2]; + threads_cpy[3] = threads[3]; + threads_cpy[4] = threads[4]; + chThdTerminate(threads[1]); + chThdTerminate(threads[4]); + chThdWait(threads[1]); + chThdWait(threads[4]); + parents[0] = threads[0]->parent; + parents[1] = threads[1]->parent; + parents[2] = threads[2]->parent; + parents[3] = threads[3]->parent; + parents[4] = threads[4]->parent; + siblings[0] = threads[0]->children; + siblings[1] = threads[1]->sibling; + siblings[2] = threads[2]->sibling; + siblings[3] = threads[3]->sibling; + siblings[4] = threads[4]->sibling; + test_terminate_threads(); + test_wait_threads(); + test_assert(parents[0] == chThdGetSelfX() && + parents[2] == threads_cpy[0] && + parents[3] == threads_cpy[0] && + siblings[0] == threads_cpy[3] && + siblings[2] == NULL && + siblings[3] == threads_cpy[2], "invalid children list"); + } + + /* [3.5.5] Creating 1 parent and 4 child threads and then terminating the + * parent, hierarchy information is tested.*/ + test_set_step(5); + { + tprio_t prios[MAX_THREADS]; + thread_t *threads_cpy[MAX_THREADS]; + thread_t *parents[MAX_THREADS]; + uint8_t thdmask = 0; + prios[0] = chThdGetPriorityX()-1; + prios[1] = chThdGetPriorityX()-1; + prios[2] = chThdGetPriorityX()-1; + prios[3] = chThdGetPriorityX()-1; + prios[4] = chThdGetPriorityX()-1; + threads[0] = chThdCreateStatic(wa[0], WA_SIZE, prios[0], hierarchythread, &prios[0], chThdGetSelfX()); + threads[1] = chThdCreateStatic(wa[1], WA_SIZE, prios[1], hierarchythread, &prios[1], threads[0]); + threads[2] = chThdCreateStatic(wa[2], WA_SIZE, prios[2], hierarchythread, &prios[2], threads[0]); + threads[3] = chThdCreateStatic(wa[3], WA_SIZE, prios[3], hierarchythread, &prios[3], threads[0]); + threads[4] = chThdCreateStatic(wa[4], WA_SIZE, prios[4], hierarchythread, &prios[4], threads[0]); + threads_cpy[0] = threads[0]; + threads_cpy[1] = threads[1]; + threads_cpy[2] = threads[2]; + threads_cpy[3] = threads[3]; + threads_cpy[4] = threads[4]; + chThdTerminate(threads[0]); + chThdWait(threads[0]); + parents[0] = threads_cpy[0]->parent; + parents[1] = threads_cpy[1]->parent; + parents[2] = threads_cpy[2]->parent; + parents[3] = threads_cpy[3]->parent; + parents[4] = threads_cpy[4]->parent; + for (thread_t* sibling = ch.mainthread.children; sibling != NULL; sibling = sibling->sibling) { + thdmask |= (sibling == threads[0]) ? 1 << 0 : 0; + thdmask |= (sibling == threads[1]) ? 1 << 1 : 0; + thdmask |= (sibling == threads[2]) ? 1 << 2 : 0; + thdmask |= (sibling == threads[3]) ? 1 << 3 : 0; + thdmask |= (sibling == threads[4]) ? 1 << 4 : 0; + } + test_terminate_threads(); + test_wait_threads(); + test_assert(parents[1] == &ch.mainthread && + parents[2] == &ch.mainthread && + parents[3] == &ch.mainthread && + parents[4] == &ch.mainthread && + thdmask == ((1 << 1) | (1 << 2) | (1 << 3) | (1 << 4)), "child thread recovery failed"); + } + + /* [3.5.6] Creating 1 parent and 4 child threads with increasing priority + * and then increasing the priority of a low-priority child, hierarchy + * information is tested.*/ + test_set_step(6); + { + tprio_t prios[MAX_THREADS]; + thread_t *threads_cpy[MAX_THREADS]; + tprio_t testprios[2]; + thread_t *siblings[MAX_THREADS]; + prios[0] = chThdGetPriorityX()-1; + prios[1] = chThdGetPriorityX()-5; + prios[2] = chThdGetPriorityX()-4; + prios[3] = chThdGetPriorityX()-3; + prios[4] = chThdGetPriorityX()-2; + threads[0] = chThdCreateStatic(wa[0], WA_SIZE, prios[0], hierarchythread, &prios[0], chThdGetSelfX()); + threads[1] = chThdCreateStatic(wa[1], WA_SIZE, prios[1], hierarchythread, &prios[1], threads[0]); + threads[2] = chThdCreateStatic(wa[2], WA_SIZE, prios[2], hierarchythread, &prios[2], threads[0]); + threads[3] = chThdCreateStatic(wa[3], WA_SIZE, prios[3], hierarchythread, &prios[3], threads[0]); + threads[4] = chThdCreateStatic(wa[4], WA_SIZE, prios[4], hierarchythread, &prios[4], threads[0]); + threads_cpy[0] = threads[0]; + threads_cpy[1] = threads[1]; + threads_cpy[2] = threads[2]; + threads_cpy[3] = threads[3]; + threads_cpy[4] = threads[4]; + chThdSleepMilliseconds(10); + testprios[0] = threads[1]->prio; + prios[1] = prios[4]; + chThdSleepMilliseconds(10); + testprios[1] = threads[1]->prio; + siblings[0] = threads[0]->children; + siblings[1] = threads[1]->sibling; + siblings[2] = threads[2]->sibling; + siblings[3] = threads[3]->sibling; + siblings[4] = threads[4]->sibling; + test_terminate_threads(); + test_wait_threads(); +#if CH_CFG_THREADHIERARCHY_ORDERED == TRUE + test_assert(testprios[0] == chThdGetPriorityX()-5 && + testprios[1] == prios[4] && + siblings[0] == threads_cpy[1] && + siblings[1] == threads_cpy[4] && + siblings[2] == NULL && + siblings[3] == threads_cpy[2] && + siblings[4] == threads_cpy[3], "invalid children list"); +#else + test_assert(testprios[0] == chThdGetPriorityX()-5 && + testprios[1] == prios[4] && + siblings[0] == threads_cpy[4] && + siblings[1] == NULL && + siblings[2] == threads_cpy[1] && + siblings[3] == threads_cpy[2] && + siblings[4] == threads_cpy[3], "invalid children list"); +#endif + } + + /* [3.5.7] Creating 1 parent and 4 child threads with increasing priority + * and the decreasing the priority of a high-priority child, hierarchy + * information is tested.*/ + test_set_step(7); + { + tprio_t prios[MAX_THREADS]; + thread_t *threads_cpy[MAX_THREADS]; + tprio_t testprios[2]; + thread_t *siblings[MAX_THREADS]; + prios[0] = chThdGetPriorityX()-1; + prios[1] = chThdGetPriorityX()-5; + prios[2] = chThdGetPriorityX()-4; + prios[3] = chThdGetPriorityX()-3; + prios[4] = chThdGetPriorityX()-2; + threads[0] = chThdCreateStatic(wa[0], WA_SIZE, prios[0], hierarchythread, &prios[0], chThdGetSelfX()); + threads[1] = chThdCreateStatic(wa[1], WA_SIZE, prios[1], hierarchythread, &prios[1], threads[0]); + threads[2] = chThdCreateStatic(wa[2], WA_SIZE, prios[2], hierarchythread, &prios[2], threads[0]); + threads[3] = chThdCreateStatic(wa[3], WA_SIZE, prios[3], hierarchythread, &prios[3], threads[0]); + threads[4] = chThdCreateStatic(wa[4], WA_SIZE, prios[4], hierarchythread, &prios[4], threads[0]); + threads_cpy[0] = threads[0]; + threads_cpy[1] = threads[1]; + threads_cpy[2] = threads[2]; + threads_cpy[3] = threads[3]; + threads_cpy[4] = threads[4]; + chThdSleepMilliseconds(10); + testprios[0] = threads[4]->prio; + prios[4] = prios[1]; + chThdSleepMilliseconds(10); + testprios[1] = threads[4]->prio; + siblings[0] = threads[0]->children; + siblings[1] = threads[1]->sibling; + siblings[2] = threads[2]->sibling; + siblings[3] = threads[3]->sibling; + siblings[4] = threads[4]->sibling; + test_terminate_threads(); + test_wait_threads(); +#if CH_CFG_THREADHIERARCHY_ORDERED == TRUE + test_assert(testprios[0] == chThdGetPriorityX()-2 && + testprios[1] == prios[1] && + siblings[0] == threads_cpy[3] && + siblings[1] == NULL && + siblings[2] == threads_cpy[4] && + siblings[3] == threads_cpy[2] && + siblings[4] == threads_cpy[1], "invalid children list"); +#else + test_assert(testprios[0] == chThdGetPriorityX()-2 && + testprios[1] == prios[1] && + siblings[0] == threads_cpy[4] && + siblings[1] == NULL && + siblings[2] == threads_cpy[1] && + siblings[3] == threads_cpy[2] && + siblings[4] == threads_cpy[3], "invalid children list"); +#endif + } +} + + +static const testcase_t rt_test_003_005 = { +#if CH_CFG_THREADHIERARCHY_ORDERED == TRUE + "Thread hierarchy with ordered lists", +#else + "Thread hierarchy with unordered lists", +#endif + NULL, + NULL, + rt_test_003_005_execute +}; +#endif /* CH_CFG_USE_THREADHIERARCHY */ + /**************************************************************************** * Exported data. ****************************************************************************/ @@ -338,6 +751,9 @@ const testcase_t * const rt_test_sequence_003_array[] = { &rt_test_003_003, #if (CH_CFG_USE_MUTEXES) || defined(__DOXYGEN__) &rt_test_003_004, +#endif +#if (CH_CFG_USE_THREADHIERARCHY) || defined(__DOXYGEN__) + &rt_test_003_005, #endif NULL }; diff --git a/test/rt/source/test/rt_test_sequence_004.c b/test/rt/source/test/rt_test_sequence_004.c --- a/test/rt/source/test/rt_test_sequence_004.c +++ b/test/rt/source/test/rt_test_sequence_004.c @@ -83,7 +83,7 @@ static void rt_test_004_001_execute(void) { and the state of the reference are tested.*/ test_set_step(1); { - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX()-1, thread1, "A"); + threads[0] = test_create_thread(wa[0], WA_SIZE, chThdGetPriorityX()-1, thread1, "A"); chSysLock(); msg = chThdSuspendTimeoutS(&tr1, TIME_INFINITE); chSysUnlock(); diff --git a/test/rt/source/test/rt_test_sequence_005.c b/test/rt/source/test/rt_test_sequence_005.c --- a/test/rt/source/test/rt_test_sequence_005.c +++ b/test/rt/source/test/rt_test_sequence_005.c @@ -178,11 +178,11 @@ static void rt_test_005_002_execute(void) { initialized to zero.*/ test_set_step(1); { - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX()+5, thread1, "A"); - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriorityX()+1, thread1, "B"); - threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriorityX()+3, thread1, "C"); - threads[3] = chThdCreateStatic(wa[3], WA_SIZE, chThdGetPriorityX()+4, thread1, "D"); - threads[4] = chThdCreateStatic(wa[4], WA_SIZE, chThdGetPriorityX()+2, thread1, "E"); + threads[0] = test_create_thread(wa[0], WA_SIZE, chThdGetPriorityX()+5, thread1, "A"); + threads[1] = test_create_thread(wa[1], WA_SIZE, chThdGetPriorityX()+1, thread1, "B"); + threads[2] = test_create_thread(wa[2], WA_SIZE, chThdGetPriorityX()+3, thread1, "C"); + threads[3] = test_create_thread(wa[3], WA_SIZE, chThdGetPriorityX()+4, thread1, "D"); + threads[4] = test_create_thread(wa[4], WA_SIZE, chThdGetPriorityX()+2, thread1, "E"); } /* [5.2.2] The semaphore is signaled 5 times. The thread activation @@ -248,7 +248,7 @@ static void rt_test_005_003_execute(void) { /* [5.3.2] Testing non-timeout condition.*/ test_set_step(2); { - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX() - 1, + threads[0] = test_create_thread(wa[0], WA_SIZE, chThdGetPriorityX() - 1, thread2, 0); msg = chSemWaitTimeout(&sem1, TIME_MS2I(500)); test_wait_threads(); @@ -305,7 +305,7 @@ static void rt_test_005_004_execute(void) { /* [5.4.1] A thread is created, it goes to wait on the semaphore.*/ test_set_step(1); { - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX()+1, thread1, "A"); + threads[0] = test_create_thread(wa[0], WA_SIZE, chThdGetPriorityX()+1, thread1, "A"); } /* [5.4.2] The semaphore counter is increased by two, it is then @@ -366,7 +366,7 @@ static void rt_test_005_005_execute(void) { non-atomical wait and signal operations on a semaphore.*/ test_set_step(1); { - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX()+1, thread3, 0); + threads[0] = test_create_thread(wa[0], WA_SIZE, chThdGetPriorityX()+1, thread3, 0); } /* [5.5.2] The function chSemSignalWait() is invoked by specifying @@ -448,7 +448,7 @@ static void rt_test_005_006_execute(void) { /* [5.6.3] Starting a signaler thread at a lower priority.*/ test_set_step(3); { - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, + threads[0] = test_create_thread(wa[0], WA_SIZE, chThdGetPriorityX()-1, thread4, &bsem); } diff --git a/test/rt/source/test/rt_test_sequence_006.c b/test/rt/source/test/rt_test_sequence_006.c --- a/test/rt/source/test/rt_test_sequence_006.c +++ b/test/rt/source/test/rt_test_sequence_006.c @@ -276,11 +276,11 @@ static void rt_test_006_001_execute(void) { priority order.*/ test_set_step(3); { - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, prio+1, thread1, "E"); - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, prio+2, thread1, "D"); - threads[2] = chThdCreateStatic(wa[2], WA_SIZE, prio+3, thread1, "C"); - threads[3] = chThdCreateStatic(wa[3], WA_SIZE, prio+4, thread1, "B"); - threads[4] = chThdCreateStatic(wa[4], WA_SIZE, prio+5, thread1, "A"); + threads[0] = test_create_thread(wa[0], WA_SIZE, prio+1, thread1, "E"); + threads[1] = test_create_thread(wa[1], WA_SIZE, prio+2, thread1, "D"); + threads[2] = test_create_thread(wa[2], WA_SIZE, prio+3, thread1, "C"); + threads[3] = test_create_thread(wa[3], WA_SIZE, prio+4, thread1, "B"); + threads[4] = test_create_thread(wa[4], WA_SIZE, prio+5, thread1, "A"); } /* [6.1.4] Unlocking the mutex, the threads will wakeup in priority @@ -347,9 +347,9 @@ static void rt_test_006_002_execute(void) { complete in priority order.*/ test_set_step(2); { - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX()-1, thread2H, 0); - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriorityX()-2, thread2M, 0); - threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriorityX()-3, thread2L, 0); + threads[0] = test_create_thread(wa[0], WA_SIZE, chThdGetPriorityX()-1, thread2H, 0); + threads[1] = test_create_thread(wa[1], WA_SIZE, chThdGetPriorityX()-2, thread2M, 0); + threads[2] = test_create_thread(wa[2], WA_SIZE, chThdGetPriorityX()-3, thread2L, 0); test_wait_threads(); test_assert_sequence("ABC", "invalid sequence"); } @@ -418,11 +418,11 @@ static void rt_test_006_003_execute(void) { complete in priority order.*/ test_set_step(2); { - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX()-5, thread3LL, 0); - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriorityX()-4, thread3L, 0); - threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriorityX()-3, thread3M, 0); - threads[3] = chThdCreateStatic(wa[3], WA_SIZE, chThdGetPriorityX()-2, thread3H, 0); - threads[4] = chThdCreateStatic(wa[4], WA_SIZE, chThdGetPriorityX()-1, thread3HH, 0); + threads[0] = test_create_thread(wa[0], WA_SIZE, chThdGetPriorityX()-5, thread3LL, 0); + threads[1] = test_create_thread(wa[1], WA_SIZE, chThdGetPriorityX()-4, thread3L, 0); + threads[2] = test_create_thread(wa[2], WA_SIZE, chThdGetPriorityX()-3, thread3M, 0); + threads[3] = test_create_thread(wa[3], WA_SIZE, chThdGetPriorityX()-2, thread3H, 0); + threads[4] = test_create_thread(wa[4], WA_SIZE, chThdGetPriorityX()-1, thread3HH, 0); test_wait_threads(); test_assert_sequence("ABCDE", "invalid sequence"); } @@ -501,8 +501,8 @@ static void rt_test_006_004_execute(void) { /* [6.4.2] Spawning threads A and B at priorities P(A) and P(B).*/ test_set_step(2); { - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, pa, thread4A, "A"); - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, pb, thread4B, "B"); + threads[0] = test_create_thread(wa[0], WA_SIZE, pa, thread4A, "A"); + threads[1] = test_create_thread(wa[1], WA_SIZE, pb, thread4B, "B"); } /* [6.4.3] Locking the mutex M1 before thread A has a chance to lock @@ -839,11 +839,11 @@ static void rt_test_006_007_execute(void) { test_set_step(1); { tprio_t prio = chThdGetPriorityX(); - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, prio+1, thread6, "E"); - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, prio+2, thread6, "D"); - threads[2] = chThdCreateStatic(wa[2], WA_SIZE, prio+3, thread6, "C"); - threads[3] = chThdCreateStatic(wa[3], WA_SIZE, prio+4, thread6, "B"); - threads[4] = chThdCreateStatic(wa[4], WA_SIZE, prio+5, thread6, "A"); + threads[0] = test_create_thread(wa[0], WA_SIZE, prio+1, thread6, "E"); + threads[1] = test_create_thread(wa[1], WA_SIZE, prio+2, thread6, "D"); + threads[2] = test_create_thread(wa[2], WA_SIZE, prio+3, thread6, "C"); + threads[3] = test_create_thread(wa[3], WA_SIZE, prio+4, thread6, "B"); + threads[4] = test_create_thread(wa[4], WA_SIZE, prio+5, thread6, "A"); } /* [6.7.2] Atomically signaling the condition variable five times @@ -908,11 +908,11 @@ static void rt_test_006_008_execute(void) { test_set_step(1); { tprio_t prio = chThdGetPriorityX(); - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, prio+1, thread6, "E"); - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, prio+2, thread6, "D"); - threads[2] = chThdCreateStatic(wa[2], WA_SIZE, prio+3, thread6, "C"); - threads[3] = chThdCreateStatic(wa[3], WA_SIZE, prio+4, thread6, "B"); - threads[4] = chThdCreateStatic(wa[4], WA_SIZE, prio+5, thread6, "A"); + threads[0] = test_create_thread(wa[0], WA_SIZE, prio+1, thread6, "E"); + threads[1] = test_create_thread(wa[1], WA_SIZE, prio+2, thread6, "D"); + threads[2] = test_create_thread(wa[2], WA_SIZE, prio+3, thread6, "C"); + threads[3] = test_create_thread(wa[3], WA_SIZE, prio+4, thread6, "B"); + threads[4] = test_create_thread(wa[4], WA_SIZE, prio+5, thread6, "A"); } /* [6.8.2] Broarcasting on the condition variable then waiting for @@ -986,21 +986,21 @@ static void rt_test_006_009_execute(void) { M1 and goes to wait on C1.*/ test_set_step(2); { - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, prio+1, thread8, "A"); + threads[0] = test_create_thread(wa[0], WA_SIZE, prio+1, thread8, "A"); } /* [6.9.3] Thread C is created at priority P(+2), it enqueues on M1 and boosts TA priority at P(+2).*/ test_set_step(3); { - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, prio+2, thread6, "C"); + threads[1] = test_create_thread(wa[1], WA_SIZE, prio+2, thread6, "C"); } /* [6.9.4] Thread B is created at priority P(+3), it enqueues on M2 and boosts TA priority at P(+3).*/ test_set_step(4); { - threads[2] = chThdCreateStatic(wa[2], WA_SIZE, prio+3, thread9, "B"); + threads[2] = test_create_thread(wa[2], WA_SIZE, prio+3, thread9, "B"); } /* [6.9.5] Signaling C1: TA wakes up, unlocks M1 and priority goes to diff --git a/test/rt/source/test/rt_test_sequence_007.c b/test/rt/source/test/rt_test_sequence_007.c --- a/test/rt/source/test/rt_test_sequence_007.c +++ b/test/rt/source/test/rt_test_sequence_007.c @@ -79,7 +79,7 @@ static void rt_test_007_001_execute(void) { /* [7.1.1] Starting the messenger thread.*/ test_set_step(1); { - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX() + 1, + threads[0] = test_create_thread(wa[0], WA_SIZE, chThdGetPriorityX() + 1, msg_thread1, chThdGetSelfX()); } diff --git a/test/rt/source/test/rt_test_sequence_008.c b/test/rt/source/test/rt_test_sequence_008.c --- a/test/rt/source/test/rt_test_sequence_008.c +++ b/test/rt/source/test/rt_test_sequence_008.c @@ -226,7 +226,7 @@ static void rt_test_008_003_execute(void) { test_set_step(3); { target_time = chTimeAddX(test_wait_tick(), TIME_MS2I(50)); - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX() - 1, + threads[0] = test_create_thread(wa[0], WA_SIZE, chThdGetPriorityX() - 1, evt_thread3, chThdGetSelfX()); } @@ -300,7 +300,7 @@ static void rt_test_008_004_execute(void) { test_set_step(3); { target_time = chTimeAddX(test_wait_tick(), TIME_MS2I(50)); - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX() - 1, + threads[0] = test_create_thread(wa[0], WA_SIZE, chThdGetPriorityX() - 1, evt_thread3, chThdGetSelfX()); } @@ -381,7 +381,7 @@ static void rt_test_008_005_execute(void) { test_set_step(4); { target_time = chTimeAddX(test_wait_tick(), TIME_MS2I(50)); - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX() - 1, + threads[0] = test_create_thread(wa[0], WA_SIZE, chThdGetPriorityX() - 1, evt_thread3, chThdGetSelfX()); } @@ -514,7 +514,7 @@ static void rt_test_008_007_execute(void) { test_set_step(2); { target_time = chTimeAddX(test_wait_tick(), TIME_MS2I(50)); - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX() - 1, + threads[0] = test_create_thread(wa[0], WA_SIZE, chThdGetPriorityX() - 1, evt_thread7, "A"); } diff --git a/test/rt/source/test/rt_test_sequence_010.c b/test/rt/source/test/rt_test_sequence_010.c --- a/test/rt/source/test/rt_test_sequence_010.c +++ b/test/rt/source/test/rt_test_sequence_010.c @@ -169,7 +169,7 @@ static void rt_test_010_001_execute(void) { the current thread.*/ test_set_step(1); { - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX()-1, bmk_thread1, NULL); + threads[0] = test_create_thread(wa[0], WA_SIZE, chThdGetPriorityX()-1, bmk_thread1, NULL); } /* [10.1.2] The number of messages exchanged is counted in a one @@ -230,7 +230,7 @@ static void rt_test_010_002_execute(void) { than the current thread.*/ test_set_step(1); { - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX()+1, bmk_thread1, NULL); + threads[0] = test_create_thread(wa[0], WA_SIZE, chThdGetPriorityX()+1, bmk_thread1, NULL); } /* [10.2.2] The number of messages exchanged is counted in a one @@ -294,17 +294,17 @@ static void rt_test_010_003_execute(void) { than the current thread.*/ test_set_step(1); { - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX()+1, bmk_thread1, NULL); + threads[0] = test_create_thread(wa[0], WA_SIZE, chThdGetPriorityX()+1, bmk_thread1, NULL); } /* [10.3.2] Four threads are started at a lower priority than the current thread.*/ test_set_step(2); { - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriorityX()-2, bmk_thread3, NULL); - threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriorityX()-3, bmk_thread3, NULL); - threads[3] = chThdCreateStatic(wa[3], WA_SIZE, chThdGetPriorityX()-4, bmk_thread3, NULL); - threads[4] = chThdCreateStatic(wa[4], WA_SIZE, chThdGetPriorityX()-5, bmk_thread3, NULL); + threads[1] = test_create_thread(wa[1], WA_SIZE, chThdGetPriorityX()-2, bmk_thread3, NULL); + threads[2] = test_create_thread(wa[2], WA_SIZE, chThdGetPriorityX()-3, bmk_thread3, NULL); + threads[3] = test_create_thread(wa[3], WA_SIZE, chThdGetPriorityX()-4, bmk_thread3, NULL); + threads[4] = test_create_thread(wa[4], WA_SIZE, chThdGetPriorityX()-5, bmk_thread3, NULL); } /* [10.3.3] The number of messages exchanged is counted in a one @@ -360,7 +360,7 @@ static void rt_test_010_004_execute(void) { /* [10.4.1] Starting the target thread at an higher priority level.*/ test_set_step(1); { - tp = threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX()+1, + tp = threads[0] = test_create_thread(wa[0], WA_SIZE, chThdGetPriorityX()+1, bmk_thread4, NULL); } @@ -444,7 +444,7 @@ static void rt_test_010_005_execute(void) { start = test_wait_tick(); end = chTimeAddX(start, TIME_MS2I(1000)); do { - chThdWait(chThdCreateStatic(wa[0], WA_SIZE, prio, bmk_thread3, NULL)); + chThdWait(test_create_thread(wa[0], WA_SIZE, prio, bmk_thread3, NULL)); n++; #if defined(SIMULATOR) _sim_check_for_interrupts(); @@ -502,9 +502,9 @@ static void rt_test_010_006_execute(void) { end = chTimeAddX(start, TIME_MS2I(1000)); do { #if CH_CFG_USE_REGISTRY - chThdRelease(chThdCreateStatic(wa[0], WA_SIZE, prio, bmk_thread3, NULL)); + chThdRelease(test_create_thread(wa[0], WA_SIZE, prio, bmk_thread3, NULL)); #else - chThdCreateStatic(wa[0], WA_SIZE, prio, bmk_thread3, NULL); + test_create_thread(wa[0], WA_SIZE, prio, bmk_thread3, NULL); #endif n++; #if defined(SIMULATOR) @@ -566,11 +566,11 @@ static void rt_test_010_007_execute(void) { immediately enqueue on a semaphore.*/ test_set_step(1); { - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX()+5, bmk_thread7, NULL); - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriorityX()+4, bmk_thread7, NULL); - threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriorityX()+3, bmk_thread7, NULL); - threads[3] = chThdCreateStatic(wa[3], WA_SIZE, chThdGetPriorityX()+2, bmk_thread7, NULL); - threads[4] = chThdCreateStatic(wa[4], WA_SIZE, chThdGetPriorityX()+1, bmk_thread7, NULL); + threads[0] = test_create_thread(wa[0], WA_SIZE, chThdGetPriorityX()+5, bmk_thread7, NULL); + threads[1] = test_create_thread(wa[1], WA_SIZE, chThdGetPriorityX()+4, bmk_thread7, NULL); + threads[2] = test_create_thread(wa[2], WA_SIZE, chThdGetPriorityX()+3, bmk_thread7, NULL); + threads[3] = test_create_thread(wa[3], WA_SIZE, chThdGetPriorityX()+2, bmk_thread7, NULL); + threads[4] = test_create_thread(wa[4], WA_SIZE, chThdGetPriorityX()+1, bmk_thread7, NULL); } /* [10.7.2] The semaphore is reset waking up the five threads. The @@ -645,12 +645,12 @@ static void rt_test_010_008_execute(void) { test_set_step(1); { n = 0; - test_wait_tick();threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX()-1, bmk_thread8, (void *)&n); + test_wait_tick();threads[0] = test_create_thread(wa[0], WA_SIZE, chThdGetPriorityX()-1, bmk_thread8, (void *)&n); - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriorityX()-1, bmk_thread8, (void *)&n); - threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriorityX()-1, bmk_thread8, (void *)&n); - threads[3] = chThdCreateStatic(wa[3], WA_SIZE, chThdGetPriorityX()-1, bmk_thread8, (void *)&n); - threads[4] = chThdCreateStatic(wa[4], WA_SIZE, chThdGetPriorityX()-1, bmk_thread8, (void *)&n); + threads[1] = test_create_thread(wa[1], WA_SIZE, chThdGetPriorityX()-1, bmk_thread8, (void *)&n); + threads[2] = test_create_thread(wa[2], WA_SIZE, chThdGetPriorityX()-1, bmk_thread8, (void *)&n); + threads[3] = test_create_thread(wa[3], WA_SIZE, chThdGetPriorityX()-1, bmk_thread8, (void *)&n); + threads[4] = test_create_thread(wa[4], WA_SIZE, chThdGetPriorityX()-1, bmk_thread8, (void *)&n); } /* [10.8.2] Waiting one second then terminating the 5 threads.*/