diff options
| -rw-r--r-- | os/rt/include/chdynamic.h | 4 | ||||
| -rw-r--r-- | os/rt/include/chevents.h | 8 | ||||
| -rw-r--r-- | os/rt/include/chthreads.h | 14 | ||||
| -rw-r--r-- | os/rt/src/chdynamic.c | 129 | ||||
| -rw-r--r-- | os/rt/src/chsys.c | 1 | ||||
| -rw-r--r-- | os/rt/src/chthreads.c | 74 | ||||
| -rw-r--r-- | os/various/shell/shell_cmd.c | 7 | ||||
| -rw-r--r-- | release_note_next.txt | 4 | ||||
| -rw-r--r-- | test/rt/test.c | 13 | ||||
| -rw-r--r-- | test/rt/test.h | 1 | ||||
| -rw-r--r-- | test/rt/test.mk | 1 | ||||
| -rw-r--r-- | test/rt/testbmk.c | 43 | ||||
| -rw-r--r-- | test/rt/testdyn.c | 15 | ||||
| -rw-r--r-- | testhal/STM32/STM32F7xx/USB_CDC/main.c | 3 | 
14 files changed, 222 insertions, 95 deletions
diff --git a/os/rt/include/chdynamic.h b/os/rt/include/chdynamic.h index fa42bf3ae..9b653cc5c 100644 --- a/os/rt/include/chdynamic.h +++ b/os/rt/include/chdynamic.h @@ -71,16 +71,16 @@  #ifdef __cplusplus
  extern "C" {
  #endif
 +  thread_t *chThdAddRef(thread_t *tp);
 +  void chThdRelease(thread_t *tp);
  #if CH_CFG_USE_HEAP == TRUE
    thread_t *chThdCreateFromHeap(memory_heap_t *heapp, size_t size,
                                  const char *name, tprio_t prio,
                                  tfunc_t pf, void *arg);
 -  void chThdFreeToHeap(thread_t *tp);
  #endif
  #if CH_CFG_USE_MEMPOOLS == TRUE
    thread_t *chThdCreateFromMemoryPool(memory_pool_t *mp, const char *name,
                                        tprio_t prio, tfunc_t pf, void *arg);
 -  void chThdFreeToMemoryPool(thread_t *tp, memory_pool_t *mp);
  #endif
  #ifdef __cplusplus
  }
 diff --git a/os/rt/include/chevents.h b/os/rt/include/chevents.h index fa8e4d7a5..8432eea8e 100644 --- a/os/rt/include/chevents.h +++ b/os/rt/include/chevents.h @@ -37,14 +37,6 @@  /* Module constants.                                                         */
  /*===========================================================================*/
 -/**
 - * @brief   Event bit reserved for thread termination request.
 - * @note    The most significant bit of the events mask is conventionally
 - *          used for thread termination but it can eventually be used for
 - *          other events.
 - */
 -#define CH_EVENT_TERMINATE  ~(((eventmask_t)-1) >> 1U)
 -
  /*===========================================================================*/
  /* Module pre-compile time settings.                                         */
  /*===========================================================================*/
 diff --git a/os/rt/include/chthreads.h b/os/rt/include/chthreads.h index 8d632d59e..d4f2a68d0 100644 --- a/os/rt/include/chthreads.h +++ b/os/rt/include/chthreads.h @@ -182,6 +182,7 @@ extern "C" {                                tprio_t prio, tfunc_t pf, void *arg);
    thread_t *chThdStart(thread_t *tp);
    tprio_t chThdSetPriority(tprio_t newprio);
 +  void chThdTerminate(thread_t *tp);
    msg_t chThdSuspendS(thread_reference_t *trp);
    msg_t chThdSuspendTimeoutS(thread_reference_t *trp, systime_t timeout);
    void chThdResumeI(thread_reference_t *trp, msg_t msg);
 @@ -277,6 +278,19 @@ static inline bool chThdTerminatedX(thread_t *tp) {  }
  /**
 + * @brief   Verifies if the current thread has a termination request pending.
 + *
 + * @retval true         termination request pending.
 + * @retval false        termination request not pending.
 + *
 + * @xclass
 + */
 +static inline bool chThdShouldTerminateX(void) {
 +
 +  return (bool)((chThdGetSelfX()->flags & CH_FLAG_TERMINATE) != (tmode_t)0);
 +}
 +
 +/**
   * @brief   Resumes a thread created with @p chThdCreateI().
   *
   * @param[in] tp        pointer to the thread
 diff --git a/os/rt/src/chdynamic.c b/os/rt/src/chdynamic.c index 414cfe2c8..60b0cbe19 100644 --- a/os/rt/src/chdynamic.c +++ b/os/rt/src/chdynamic.c @@ -54,6 +54,78 @@  /* Module exported functions.                                                */
  /*===========================================================================*/
 +/**
 + * @brief   Adds a reference to a thread object.
 + * @pre     The configuration option @p CH_CFG_USE_DYNAMIC must be enabled in
 + *          order to use this function.
 + *
 + * @param[in] tp        pointer to the thread
 + * @return              The same thread pointer passed as parameter
 + *                      representing the new reference.
 + *
 + * @api
 + */
 +thread_t *chThdAddRef(thread_t *tp) {
 +
 +  chSysLock();
 +  chDbgAssert(tp->refs < (trefs_t)255, "too many references");
 +  tp->refs++;
 +  chSysUnlock();
 +
 +  return tp;
 +}
 +
 +/**
 + * @brief   Releases a reference to a thread object.
 + * @details If the references counter reaches zero <b>and</b> the thread
 + *          is in the @p CH_STATE_FINAL state then the thread's memory is
 + *          returned to the proper allocator.
 + * @pre     The configuration option @p CH_CFG_USE_DYNAMIC must be enabled in
 + *          order to use this function.
 + * @note    Static threads are not affected.
 + *
 + * @param[in] tp        pointer to the thread
 + *
 + * @api
 + */
 +void chThdRelease(thread_t *tp) {
 +  trefs_t refs;
 +
 +  chSysLock();
 +  chDbgAssert(tp->refs > (trefs_t)0, "not referenced");
 +  tp->refs--;
 +  refs = tp->refs;
 +  chSysUnlock();
 +
 +  /* If the references counter reaches zero and the thread is in its
 +     terminated state then the memory can be returned to the proper
 +     allocator. Of course static threads are not affected.*/
 +  if ((refs == (trefs_t)0) && (tp->state == CH_STATE_FINAL)) {
 +    switch (tp->flags & CH_FLAG_MODE_MASK) {
 +#if CH_CFG_USE_HEAP == TRUE
 +    case CH_FLAG_MODE_HEAP:
 +#if CH_CFG_USE_REGISTRY == TRUE
 +      REG_REMOVE(tp);
 +#endif
 +      chHeapFree(chthdGetStackLimitX(tp));
 +      break;
 +#endif
 +#if CH_CFG_USE_MEMPOOLS == TRUE
 +    case CH_FLAG_MODE_MPOOL:
 +#if CH_CFG_USE_REGISTRY == TRUE
 +      REG_REMOVE(tp);
 +#endif
 +      chPoolFree(tp->mpool, chthdGetStackLimitX(tp));
 +      break;
 +#endif
 +    default:
 +      /* Nothing to do for static threads, those are removed from the
 +         registry on exit.*/
 +      break;
 +    }
 +  }
 +}
 +
  #if (CH_CFG_USE_HEAP == TRUE) || defined(__DOXYGEN__)
  /**
   * @brief   Creates a new thread allocating the memory from the heap.
 @@ -82,6 +154,7 @@  thread_t *chThdCreateFromHeap(memory_heap_t *heapp, size_t size,
                                const char *name, tprio_t prio,
                                tfunc_t pf, void *arg) {
 +  thread_t *tp;
    void *wsp;
    wsp = chHeapAllocAligned(heapp, size, PORT_WORKING_AREA_ALIGN);
 @@ -98,24 +171,19 @@ thread_t *chThdCreateFromHeap(memory_heap_t *heapp, size_t size,      arg
    };
 -  return chThdCreate(&td);
 -}
 -
 -/**
 - * @brief   Releases a thread working area into the owner heap.
 - * @pre     The thread must have been created using @p chThdCreateFromHeap().
 - * @pre     The thread must be in the state @p CH_STATE_FINAL (terminated).
 - *
 - * @param[in] tp        the pointer to the thread
 - *
 - * @api
 - */
 -void chThdFreeToHeap(thread_t *tp) {
 +#if CH_DBG_FILL_THREADS == TRUE
 +  _thread_memfill((uint8_t *)wsp,
 +                  (uint8_t *)wsp + size,
 +                  CH_DBG_STACK_FILL_VALUE);
 +#endif
 -  chDbgCheck(tp != NULL);
 -  chDbgAssert(tp->state == CH_STATE_FINAL, "not terminated");
 +  chSysLock();
 +  tp = chThdCreateSuspendedI(&td);
 +  tp->flags = CH_FLAG_MODE_HEAP;
 +  chSchWakeupS(tp, MSG_OK);
 +  chSysUnlock();
 -  chHeapFree(chthdGetStackLimitX(tp));
 +  return tp;
  }
  #endif /* CH_CFG_USE_HEAP == TRUE */
 @@ -148,6 +216,7 @@ void chThdFreeToHeap(thread_t *tp) {   */
  thread_t *chThdCreateFromMemoryPool(memory_pool_t *mp, const char *name,
                                      tprio_t prio, tfunc_t pf, void *arg) {
 +  thread_t *tp;
    void *wsp;
    chDbgCheck(mp != NULL);
 @@ -166,25 +235,21 @@ thread_t *chThdCreateFromMemoryPool(memory_pool_t *mp, const char *name,      arg
    };
 -  return chThdCreate(&td);
 -}
 +#if CH_DBG_FILL_THREADS == TRUE
 +  _thread_memfill((uint8_t *)wsp,
 +                  (uint8_t *)wsp + mp->object_size,
 +                  CH_DBG_STACK_FILL_VALUE);
 +#endif
 -/**
 - * @brief   Releases a thread working area into a memory pool.
 - * @pre     The thread must have been created using @p chThdCreateFromMemoryPool().
 - * @pre     The thread must be in the state @p CH_STATE_FINAL (terminated).
 - *
 - * @param[in] tp        the pointer to the thread
 - * @param[in] mp        pointer to a @p memory_pool_t structure
 - *
 - * @api
 - */
 -void chThdFreeToMemoryPool(thread_t *tp, memory_pool_t *mp) {
 -  chDbgCheck((tp != NULL) && (mp != NULL));
 -  chDbgAssert(tp->state == CH_STATE_FINAL, "not terminated");
 +  chSysLock();
 +  tp = chThdCreateSuspendedI(&td);
 +  tp->flags = CH_FLAG_MODE_MPOOL;
 +  tp->mpool = mp;
 +  chSchWakeupS(tp, MSG_OK);
 +  chSysUnlock();
 -  chPoolFree(mp, (void *)chthdGetStackLimitX(tp));
 +  return tp;
  }
  #endif /* CH_CFG_USE_MEMPOOLS == TRUE */
 diff --git a/os/rt/src/chsys.c b/os/rt/src/chsys.c index 18459849d..d9ca6d81a 100644 --- a/os/rt/src/chsys.c +++ b/os/rt/src/chsys.c @@ -129,7 +129,6 @@ void chSysInit(void) {    /* Setting up the caller as current thread.*/
    currp->state = CH_STATE_CURRENT;
 -  currp->flags = CH_FLAG_MODE_STATIC;
    /* Port layer initialization last because it depend on some of the
       initializations performed before.*/
 diff --git a/os/rt/src/chthreads.c b/os/rt/src/chthreads.c index 0fff76604..ed5b19e15 100644 --- a/os/rt/src/chthreads.c +++ b/os/rt/src/chthreads.c @@ -87,22 +87,27 @@   */
  thread_t *_thread_init(thread_t *tp, const char *name, tprio_t prio) {
 -  tp->prio = prio;
 +  tp->prio      = prio;
 +  tp->state     = CH_STATE_WTSTART;
 +  tp->flags     = CH_FLAG_MODE_STATIC;
  #if CH_CFG_TIME_QUANTUM > 0
 -  tp->preempt = (tslices_t)CH_CFG_TIME_QUANTUM;
 +  tp->preempt   = (tslices_t)CH_CFG_TIME_QUANTUM;
  #endif
  #if CH_CFG_USE_MUTEXES == TRUE
 -  tp->realprio = prio;
 -  tp->mtxlist = NULL;
 +  tp->realprio  = prio;
 +  tp->mtxlist   = NULL;
  #endif
  #if CH_CFG_USE_EVENTS == TRUE
 -  tp->epending = (eventmask_t)0;
 +  tp->epending  = (eventmask_t)0;
  #endif
  #if CH_DBG_THREADS_PROFILING == TRUE
 -  tp->time = (systime_t)0;
 +  tp->time      = (systime_t)0;
 +#endif
 +#if CH_CFG_USE_DYNAMIC == TRUE
 +  tp->refs      = (trefs_t)1;
  #endif
  #if CH_CFG_USE_REGISTRY == TRUE
 -  tp->name = name;
 +  tp->name      = name;
    REG_INSERT(tp);
  #endif
  #if CH_CFG_USE_WAITEXIT == TRUE
 @@ -173,10 +178,6 @@ thread_t *chThdCreateSuspendedI(const thread_descriptor_t *tdp) {    tp = (thread_t *)((uint8_t *)tdp->wend -
                      MEM_ALIGN_NEXT(sizeof (thread_t), PORT_STACK_ALIGN));
 -  /* Initial state.*/
 -  tp->state = CH_STATE_WTSTART;
 -  tp->flags = CH_FLAG_MODE_STATIC;
 -
    /* Stack boundary.*/
    tp->stklimit = tdp->wbase;
 @@ -380,6 +381,25 @@ tprio_t chThdSetPriority(tprio_t newprio) {  }
  /**
 + * @brief   Requests a thread termination.
 + * @pre     The target thread must be written to invoke periodically
 + *          @p chThdShouldTerminate() and terminate cleanly if it returns
 + *          @p true.
 + * @post    The specified thread will terminate after detecting the termination
 + *          condition.
 + *
 + * @param[in] tp        pointer to the thread
 + *
 + * @api
 + */
 +void chThdTerminate(thread_t *tp) {
 +
 +  chSysLock();
 +  tp->flags |= CH_FLAG_TERMINATE;
 +  chSysUnlock();
 +}
 +
 +/**
   * @brief   Suspends the invoking thread for the specified time.
   *
   * @param[in] time      the delay in system ticks, the special values are
 @@ -501,14 +521,20 @@ void chThdExitS(msg_t msg) {    thread_t *tp = currp;
    tp->u.exitcode = msg;
 +#if defined(CH_CFG_THREAD_EXIT_HOOK)
    CH_CFG_THREAD_EXIT_HOOK(tp);
 +#endif
  #if CH_CFG_USE_WAITEXIT == TRUE
    while (list_notempty(&tp->waiting)) {
      (void) chSchReadyI(list_remove(&tp->waiting));
    }
  #endif
  #if CH_CFG_USE_REGISTRY == TRUE
 -  REG_REMOVE(tp);
 +  /* Static threads are immediately removed from the registry because
 +     there is no memory to recover.*/
 +  if ((tp->flags & CH_FLAG_MODE_MASK) == CH_FLAG_MODE_STATIC) {
 +    REG_REMOVE(tp);
 +  }
  #endif
    chSchGoSleepS(CH_STATE_FINAL);
 @@ -520,12 +546,28 @@ void chThdExitS(msg_t msg) {  /**
   * @brief   Blocks the execution of the invoking thread until the specified
   *          thread terminates then the exit code is returned.
 + * @details This function waits for the specified thread to terminate then
 + *          decrements its reference counter, if the counter reaches zero then
 + *          the thread working area is returned to the proper allocator.<br>
 + *          The memory used by the exited thread is handled in different ways
 + *          depending on the API that spawned the thread:
 + *          - If the thread was spawned by @p chThdCreateStatic() or by
 + *            @p chThdCreateI() then nothing happens and the thread working
 + *            area is not released or modified in any way. This is the
 + *            default, totally static, behavior.
 + *          - If the thread was spawned by @p chThdCreateFromHeap() then
 + *            the working area is returned to the system heap.
 + *          - If the thread was spawned by @p chThdCreateFromMemoryPool()
 + *            then the working area is returned to the owning memory pool.
 + *          .
   * @pre     The configuration option @p CH_CFG_USE_WAITEXIT must be enabled in
   *          order to use this function.
   * @post    Enabling @p chThdWait() requires 2-4 (depending on the
   *          architecture) extra bytes in the @p thread_t structure.
   * @post    After invoking @p chThdWait() the thread pointer becomes invalid
   *          and must not be used as parameter for further system calls.
 + * @note    If @p CH_CFG_USE_DYNAMIC is not specified this function just waits for
 + *          the thread termination, no memory allocators are involved.
   *
   * @param[in] tp        pointer to the thread
   * @return              The exit code from the terminated thread.
 @@ -539,6 +581,9 @@ msg_t chThdWait(thread_t *tp) {    chSysLock();
    chDbgAssert(tp != currp, "waiting self");
 +#if CH_CFG_USE_DYNAMIC == TRUE
 +  chDbgAssert(tp->refs > (trefs_t)0, "not referenced");
 +#endif
    if (tp->state != CH_STATE_FINAL) {
      list_insert(currp, &tp->waiting);
      chSchGoSleepS(CH_STATE_WTEXIT);
 @@ -546,6 +591,11 @@ msg_t chThdWait(thread_t *tp) {    msg = tp->u.exitcode;
    chSysUnlock();
 +#if CH_CFG_USE_DYNAMIC == TRUE
 +  /* Releasing a lock if it is a dynamic thread.*/
 +  chThdRelease(tp);
 +#endif
 +
    return msg;
  }
  #endif /* CH_CFG_USE_WAITEXIT */
 diff --git a/os/various/shell/shell_cmd.c b/os/various/shell/shell_cmd.c index 80d683583..f8a8a0c06 100644 --- a/os/various/shell/shell_cmd.c +++ b/os/various/shell/shell_cmd.c @@ -144,12 +144,12 @@ static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) {      chprintf(chp, "Usage: threads\r\n");
      return;
    }
 -  chprintf(chp, "stklimit    stack     addr prio     state         name\r\n");
 +  chprintf(chp, "stklimit    stack     addr refs prio     state         name\r\n");
    tp = chRegFirstThread();
    do {
 -    chprintf(chp, "%08lx %08lx %08lx %4lu %9s %12s\r\n",
 +    chprintf(chp, "%08lx %08lx %08lx %4lu %4lu %9s %12s\r\n",
               (uint32_t)tp->stklimit, (uint32_t)tp->ctx.sp, (uint32_t)tp,
 -             (uint32_t)tp->prio, states[tp->state],
 +             (uint32_t)tp->refs - 1, (uint32_t)tp->prio, states[tp->state],
               tp->name == NULL ? "" : tp->name);
      tp = chRegNextThread(tp);
    } while (tp != NULL);
 @@ -173,7 +173,6 @@ static void cmd_test(BaseSequentialStream *chp, int argc, char *argv[]) {      return;
    }
    chThdWait(tp);
 -  chThdFreeToHeap(tp);
  }
  #endif
 diff --git a/release_note_next.txt b/release_note_next.txt index 4026ad9e8..525aa8a9c 100644 --- a/release_note_next.txt +++ b/release_note_next.txt @@ -26,11 +26,7 @@ a series of important new features.  - Enhanced trace buffer, it is able to store events regarding not just threads
    but also IRQs, halts and user events.
  - Enhanced Registry, it is now possible to find threads by name or by pointer.
 -- Simplified the dynamic threading model, now it is the thread creator
 -  responsible for memory release, the references counter has been removed
 -  and the code is much simpler.
  - New threading API, now creating static threads is even faster.
 -- Saved space in thread_t structure.
  - Extended priority range to 1..255.
  - Experimental NASA OSAL implementation.
 diff --git a/test/rt/test.c b/test/rt/test.c index fcba9607d..f4a08eeea 100644 --- a/test/rt/test.c +++ b/test/rt/test.c @@ -35,6 +35,7 @@  #include "testevt.h"
  #include "testheap.h"
  #include "testpools.h"
 +#include "testdyn.h"
  #include "testqueues.h"
  #include "testbmk.h"
 @@ -51,6 +52,7 @@ static ROMCONST struct testcase * ROMCONST *patterns[] = {    patternevt,
    patternheap,
    patternpools,
 +  patterndyn,
    patternqueues,
    patternbmk,
    NULL
 @@ -192,6 +194,17 @@ bool _test_assert_time_window(unsigned point, systime_t start, systime_t end) {   */
  /**
 + * @brief   Sets a termination request in all the test-spawned threads.
 + */
 +void test_terminate_threads(void) {
 +  int i;
 +
 +  for (i = 0; i < MAX_THREADS; i++)
 +    if (threads[i])
 +      chThdTerminate(threads[i]);
 +}
 +
 +/**
   * @brief   Waits for the completion of all the test-spawned threads.
   */
  void test_wait_threads(void) {
 diff --git a/test/rt/test.h b/test/rt/test.h index eb1f35c54..da080db2d 100644 --- a/test/rt/test.h +++ b/test/rt/test.h @@ -90,6 +90,7 @@ extern "C" {    bool _test_assert(unsigned point, bool condition);
    bool _test_assert_sequence(unsigned point, char *expected);
    bool _test_assert_time_window(unsigned point, systime_t start, systime_t end);
 +  void test_terminate_threads(void);
    void test_wait_threads(void);
    systime_t test_wait_tick(void);
    void test_start_timer(unsigned ms);
 diff --git a/test/rt/test.mk b/test/rt/test.mk index 1a3b368bb..03de3c89a 100644 --- a/test/rt/test.mk +++ b/test/rt/test.mk @@ -8,6 +8,7 @@ TESTSRC = ${CHIBIOS}/test/rt/test.c \            ${CHIBIOS}/test/rt/testevt.c \
            ${CHIBIOS}/test/rt/testheap.c \
            ${CHIBIOS}/test/rt/testpools.c \
 +          ${CHIBIOS}/test/rt/testdyn.c \
            ${CHIBIOS}/test/rt/testqueues.c \
            ${CHIBIOS}/test/rt/testsys.c \
            ${CHIBIOS}/test/rt/testbmk.c
 diff --git a/test/rt/testbmk.c b/test/rt/testbmk.c index 639ba2b7b..1bffbc4df 100644 --- a/test/rt/testbmk.c +++ b/test/rt/testbmk.c @@ -344,7 +344,8 @@ ROMCONST struct testcase testbmk6 = {  static THD_FUNCTION(thread3, p) {
 -  while (!*(bool *)p)
 +  (void)p;
 +  while (!chThdShouldTerminateX())
      chSemWait(&sem1);
  }
 @@ -355,13 +356,12 @@ static void bmk7_setup(void) {  static void bmk7_execute(void) {
    uint32_t n;
 -  bool terminate = false;
 -  threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX()+5, thread3, &terminate);
 -  threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriorityX()+4, thread3, &terminate);
 -  threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriorityX()+3, thread3, &terminate);
 -  threads[3] = chThdCreateStatic(wa[3], WA_SIZE, chThdGetPriorityX()+2, thread3, &terminate);
 -  threads[4] = chThdCreateStatic(wa[4], WA_SIZE, chThdGetPriorityX()+1, thread3, &terminate);
 +  threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX()+5, thread3, NULL);
 +  threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriorityX()+4, thread3, NULL);
 +  threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriorityX()+3, thread3, NULL);
 +  threads[3] = chThdCreateStatic(wa[3], WA_SIZE, chThdGetPriorityX()+2, thread3, NULL);
 +  threads[4] = chThdCreateStatic(wa[4], WA_SIZE, chThdGetPriorityX()+1, thread3, NULL);
    n = 0;
    test_wait_tick();
 @@ -373,7 +373,7 @@ static void bmk7_execute(void) {      _sim_check_for_interrupts();
  #endif
    } while (!test_timer_done);
 -  terminate = true;
 +  test_terminate_threads();
    chSemReset(&sem1, 0);
    test_wait_threads();
 @@ -401,44 +401,39 @@ ROMCONST struct testcase testbmk7 = {   * The performance is calculated by measuring the number of iterations after
   * a second of continuous operations.
   */
 -typedef struct {
 -  bool terminate;
 -  uint32_t n;
 -} params_t;
  static THD_FUNCTION(thread8, p) {
 -  params_t *pp = (params_t *)p;
    do {
      chThdYield();
      chThdYield();
      chThdYield();
      chThdYield();
 -    pp->n += 4;
 +    (*(uint32_t *)p) += 4;
  #if defined(SIMULATOR)
      _sim_check_for_interrupts();
  #endif
 -  } while (!pp->terminate);
 +  } while(!chThdShouldTerminateX());
  }
  static void bmk8_execute(void) {
 -  params_t params = {false, 0};
 +  uint32_t n;
 -  params.n = 0;
 +  n = 0;
    test_wait_tick();
 -  threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX()-1, thread8, (void *)¶ms);
 -  threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriorityX()-1, thread8, (void *)¶ms);
 -  threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriorityX()-1, thread8, (void *)¶ms);
 -  threads[3] = chThdCreateStatic(wa[3], WA_SIZE, chThdGetPriorityX()-1, thread8, (void *)¶ms);
 -  threads[4] = chThdCreateStatic(wa[4], WA_SIZE, chThdGetPriorityX()-1, thread8, (void *)¶ms);
 +  threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX()-1, thread8, (void *)&n);
 +  threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriorityX()-1, thread8, (void *)&n);
 +  threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriorityX()-1, thread8, (void *)&n);
 +  threads[3] = chThdCreateStatic(wa[3], WA_SIZE, chThdGetPriorityX()-1, thread8, (void *)&n);
 +  threads[4] = chThdCreateStatic(wa[4], WA_SIZE, chThdGetPriorityX()-1, thread8, (void *)&n);
    chThdSleepSeconds(1);
 -  params.terminate = true;
 +  test_terminate_threads();
    test_wait_threads();
    test_print("--- Score : ");
 -  test_printn(params.n);
 +  test_printn(n);
    test_println(" ctxswc/S");
  }
 diff --git a/test/rt/testdyn.c b/test/rt/testdyn.c index 9e8932c10..25304a376 100644 --- a/test/rt/testdyn.c +++ b/test/rt/testdyn.c @@ -87,13 +87,16 @@ static void dyn1_execute(void) {    /* Starting threads from the heap. */
    threads[0] = chThdCreateFromHeap(&heap1,
                                     THD_WORKING_AREA_SIZE(THREADS_STACK_SIZE),
 +                                   "dyn1",
                                     prio-1, thread, "A");
    threads[1] = chThdCreateFromHeap(&heap1,
                                     THD_WORKING_AREA_SIZE(THREADS_STACK_SIZE),
 +                                   "dyn2",
                                     prio-2, thread, "B");
    /* Large working area in order to make the thread creation fail.*/
    threads[2] = chThdCreateFromHeap(&heap1,
                                     THD_WORKING_AREA_SIZE(THREADS_STACK_SIZE * 16),
 +                                   "dyn3",
                                     prio-3, thread, "C");
    test_assert(1, (threads[0] != NULL) &&
 @@ -145,11 +148,11 @@ static void dyn2_execute(void) {      chPoolFree(&mp1, wa[i]);
    /* Starting threads from the memory pool. */
 -  threads[0] = chThdCreateFromMemoryPool(&mp1, prio-1, thread, "A");
 -  threads[1] = chThdCreateFromMemoryPool(&mp1, prio-2, thread, "B");
 -  threads[2] = chThdCreateFromMemoryPool(&mp1, prio-3, thread, "C");
 -  threads[3] = chThdCreateFromMemoryPool(&mp1, prio-4, thread, "D");
 -  threads[4] = chThdCreateFromMemoryPool(&mp1, prio-5, thread, "E");
 +  threads[0] = chThdCreateFromMemoryPool(&mp1, "dyn1", prio-1, thread, "A");
 +  threads[1] = chThdCreateFromMemoryPool(&mp1, "dyn2", prio-2, thread, "B");
 +  threads[2] = chThdCreateFromMemoryPool(&mp1, "dyn3", prio-3, thread, "C");
 +  threads[3] = chThdCreateFromMemoryPool(&mp1, "dyn4", prio-4, thread, "D");
 +  threads[4] = chThdCreateFromMemoryPool(&mp1, "dyn5", prio-5, thread, "E");
    test_assert(1, (threads[0] != NULL) &&
                   (threads[1] != NULL) &&
 @@ -207,7 +210,7 @@ static void dyn3_execute(void) {    tprio_t prio = chThdGetPriorityX();
    /* Testing references increase/decrease and final detach.*/
 -  tp = chThdCreateFromHeap(&heap1, WA_SIZE, prio-1, thread, "A");
 +  tp = chThdCreateFromHeap(&heap1, WA_SIZE, "dyn1", prio-1, thread, "A");
    test_assert(1, tp->refs == 1, "wrong initial reference counter");
    chThdAddRef(tp);
    test_assert(2, tp->refs == 2, "references increase failure");
 diff --git a/testhal/STM32/STM32F7xx/USB_CDC/main.c b/testhal/STM32/STM32F7xx/USB_CDC/main.c index 940bde5a1..244385b11 100644 --- a/testhal/STM32/STM32F7xx/USB_CDC/main.c +++ b/testhal/STM32/STM32F7xx/USB_CDC/main.c @@ -160,8 +160,7 @@ int main(void) {        thread_t *shelltp = chThdCreateFromHeap(NULL, SHELL_WA_SIZE,
                                                "shell", NORMALPRIO + 1,
                                                shellThread, (void *)&shell_cfg1);
 -      chThdWait(shelltp);               /* Waiting termination.             */
 -      chThdFreeToHeap(shelltp);         /* Returning memory to heap.        */
 +      chThdWait(shelltp);
      }
  #if 0
      if (palReadPad(GPIOI, GPIOI_BUTTON_USER)) {
  | 
