git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@437 35acf78f-673a-0410-8e92-d51de3d6d3f4
parent
9b2c9869dd
commit
9a1c91e6ee
|
@ -147,6 +147,12 @@
|
|||
* are included in the kernel.*/
|
||||
#define CH_USE_MEMPOOLS
|
||||
|
||||
/** Configuration option: if specified then the dynamic objects creation APIs
|
||||
* are included in the kernel.
|
||||
* @note requires \p CH_USE_WAITEXIT.
|
||||
*/
|
||||
#define CH_USE_DYNAMIC
|
||||
|
||||
/** Configuration option: Frequency of the system timer that drives the system
|
||||
* ticks. This also defines the system time unit.*/
|
||||
#define CH_FREQUENCY 1000
|
||||
|
|
|
@ -147,6 +147,12 @@
|
|||
* are included in the kernel.*/
|
||||
#define CH_USE_MEMPOOLS
|
||||
|
||||
/** Configuration option: if specified then the dynamic objects creation APIs
|
||||
* are included in the kernel.
|
||||
* @note requires \p CH_USE_WAITEXIT.
|
||||
*/
|
||||
#define CH_USE_DYNAMIC
|
||||
|
||||
/** Configuration option: Frequency of the system timer that drives the system
|
||||
* ticks. This also defines the system time unit.*/
|
||||
#define CH_FREQUENCY 1000
|
||||
|
|
|
@ -147,6 +147,12 @@
|
|||
* are included in the kernel.*/
|
||||
#define CH_USE_MEMPOOLS
|
||||
|
||||
/** Configuration option: if specified then the dynamic objects creation APIs
|
||||
* are included in the kernel.
|
||||
* @note requires \p CH_USE_WAITEXIT.
|
||||
*/
|
||||
#define CH_USE_DYNAMIC
|
||||
|
||||
/** Configuration option: Frequency of the system timer that drives the system
|
||||
* ticks. This also defines the system time unit.*/
|
||||
#define CH_FREQUENCY 1000
|
||||
|
|
|
@ -147,6 +147,12 @@
|
|||
* are included in the kernel.*/
|
||||
//#define CH_USE_MEMPOOLS
|
||||
|
||||
/** Configuration option: if specified then the dynamic objects creation APIs
|
||||
* are included in the kernel.
|
||||
* @note requires \p CH_USE_WAITEXIT.
|
||||
*/
|
||||
//#define CH_USE_DYNAMIC
|
||||
|
||||
/** Configuration option: Frequency of the system timer that drives the system
|
||||
* ticks. This also defines the system time unit.*/
|
||||
#define CH_FREQUENCY 1000
|
||||
|
|
|
@ -147,6 +147,12 @@
|
|||
* are included in the kernel.*/
|
||||
#define CH_USE_MEMPOOLS
|
||||
|
||||
/** Configuration option: if specified then the dynamic objects creation APIs
|
||||
* are included in the kernel.
|
||||
* @note requires \p CH_USE_WAITEXIT.
|
||||
*/
|
||||
#define CH_USE_DYNAMIC
|
||||
|
||||
/** Configuration option: Frequency of the system timer that drives the system
|
||||
* ticks. This also defines the system time unit.*/
|
||||
#define CH_FREQUENCY 1000
|
||||
|
|
|
@ -147,6 +147,12 @@
|
|||
* are included in the kernel.*/
|
||||
#define CH_USE_MEMPOOLS
|
||||
|
||||
/** Configuration option: if specified then the dynamic objects creation APIs
|
||||
* are included in the kernel.
|
||||
* @note requires \p CH_USE_WAITEXIT.
|
||||
*/
|
||||
#define CH_USE_DYNAMIC
|
||||
|
||||
/** Configuration option: Frequency of the system timer that drives the system
|
||||
* ticks. This also defines the system time unit.*/
|
||||
#define CH_FREQUENCY 1000
|
||||
|
|
|
@ -147,6 +147,12 @@
|
|||
* are included in the kernel.*/
|
||||
#define CH_USE_MEMPOOLS
|
||||
|
||||
/** Configuration option: if specified then the dynamic objects creation APIs
|
||||
* are included in the kernel.
|
||||
* @note requires \p CH_USE_WAITEXIT.
|
||||
*/
|
||||
#define CH_USE_DYNAMIC
|
||||
|
||||
/** Configuration option: Frequency of the system timer that drives the system
|
||||
* ticks. This also defines the system time unit.*/
|
||||
#define CH_FREQUENCY 1000
|
||||
|
|
|
@ -147,6 +147,12 @@
|
|||
* are included in the kernel.*/
|
||||
#define CH_USE_MEMPOOLS
|
||||
|
||||
/** Configuration option: if specified then the dynamic objects creation APIs
|
||||
* are included in the kernel.
|
||||
* @note requires \p CH_USE_WAITEXIT.
|
||||
*/
|
||||
#define CH_USE_DYNAMIC
|
||||
|
||||
/** Configuration option: Frequency of the system timer that drives the system
|
||||
* ticks. This also defines the system time unit.*/
|
||||
#define CH_FREQUENCY 1000
|
||||
|
|
|
@ -148,6 +148,12 @@
|
|||
* are included in the kernel.*/
|
||||
#define CH_USE_MEMPOOLS
|
||||
|
||||
/** Configuration option: if specified then the dynamic objects creation APIs
|
||||
* are included in the kernel.
|
||||
* @note requires \p CH_USE_WAITEXIT.
|
||||
*/
|
||||
#define CH_USE_DYNAMIC
|
||||
|
||||
/** Configuration option: Frequency of the system timer that drives the system
|
||||
* ticks. This also defines the system time unit.*/
|
||||
#define CH_FREQUENCY 1000
|
||||
|
|
|
@ -148,6 +148,12 @@
|
|||
* are included in the kernel.*/
|
||||
#define CH_USE_MEMPOOLS
|
||||
|
||||
/** Configuration option: if specified then the dynamic objects creation APIs
|
||||
* are included in the kernel.
|
||||
* @note requires \p CH_USE_WAITEXIT.
|
||||
*/
|
||||
#define CH_USE_DYNAMIC
|
||||
|
||||
/** Configuration option: Frequency of the system timer that drives the system
|
||||
* ticks. This also defines the system time unit.*/
|
||||
#define CH_FREQUENCY 1000
|
||||
|
|
|
@ -260,7 +260,8 @@ PREDEFINED = __JUST_STUBS__ \
|
|||
CH_USE_MESSAGES_EVENT \
|
||||
CH_USE_MESSAGES_PRIORITY \
|
||||
CH_USE_DEBUG \
|
||||
CH_USE_TRACE
|
||||
CH_USE_TRACE \
|
||||
CH_USE_DYNAMIC
|
||||
EXPAND_AS_DEFINED =
|
||||
SKIP_FUNCTION_MACROS = YES
|
||||
#---------------------------------------------------------------------------
|
||||
|
|
15
readme.txt
15
readme.txt
|
@ -75,13 +75,16 @@ Win32-MinGW - ChibiOS/RT simulator and demo into a WIN32 process,
|
|||
*****************************************************************************
|
||||
|
||||
*** 0.7.1 ***
|
||||
- NEW: New chThdInit() API, this API allows to quickly create threads in the
|
||||
PRSUSPENDED state. This API also allows to start threads from interrupt
|
||||
handlers.
|
||||
- CHANGE: The chThdCreate() API no more has the mode parameter, a different
|
||||
API is now used in order to start suspended threads.
|
||||
- NEW: New chThdInit() and chThdCreateStatic() APIs now replace the old
|
||||
chThdCreate() and chThdCreateFast() that are marked as deprecated.
|
||||
The new APIs use one less parameter and are faster.
|
||||
- NEW: New dynamic chThdCreateFromHeap() and chthdCreateFromMemoryPool() APIs.
|
||||
The dynamic APIs are only included if the CH_USE_DYNAMIC option is specified
|
||||
into the project configuration file.
|
||||
- FIX: The chThdCreate() had a regression in 0.7.0, the mode parameter was
|
||||
ignored. Note that in this version the mode parameter had been removed.
|
||||
ignored. Note that in this version the API is deprecated and the bug
|
||||
documented as correct behavior. If you need to create a suspended thread
|
||||
please use the new chThdInit() API.
|
||||
|
||||
*** 0.7.0 ***
|
||||
- NEW: Memory Heap Allocator functionality added. The allocator implements a
|
||||
|
|
|
@ -49,7 +49,7 @@ void chSysInit(void) {
|
|||
/*
|
||||
* Now this instructions flow becomes the main thread.
|
||||
*/
|
||||
init_thread(NORMALPRIO, &mainthread);
|
||||
init_thread(&mainthread, NORMALPRIO);
|
||||
mainthread.p_state = PRCURR;
|
||||
currp = &mainthread;
|
||||
|
||||
|
@ -61,8 +61,8 @@ void chSysInit(void) {
|
|||
* serve interrupts in its context while keeping the lowest energy saving
|
||||
* mode compatible with the system status.
|
||||
*/
|
||||
chThdCreateFast(IDLEPRIO, waIdleThread, sizeof(waIdleThread),
|
||||
(tfunc_t)_IdleThread);
|
||||
chThdCreateStatic(waIdleThread, sizeof(waIdleThread),
|
||||
IDLEPRIO, (tfunc_t)_IdleThread, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
169
src/chthreads.c
169
src/chthreads.c
|
@ -27,7 +27,7 @@
|
|||
/*
|
||||
* Initializes a thread structure.
|
||||
*/
|
||||
void init_thread(tprio_t prio, Thread *tp) {
|
||||
void init_thread(Thread *tp, tprio_t prio) {
|
||||
static tid_t nextid = 0;
|
||||
|
||||
tp->p_tid = nextid++;
|
||||
|
@ -83,8 +83,8 @@ static void memfill(uint8_t *p, uint32_t n, uint8_t v) {
|
|||
* @note This function can be used to start a thead from within an interrupt
|
||||
* handler by manually making it ready with \p chSchReadyI().
|
||||
*/
|
||||
Thread *chThdInit(tprio_t prio, void *workspace,
|
||||
size_t wsize, tfunc_t pf, void *arg) {
|
||||
Thread *chThdInit(void *workspace, size_t wsize,
|
||||
tprio_t prio, tfunc_t pf, void *arg) {
|
||||
/* thread structure is layed out in the lower part of the thread workspace */
|
||||
Thread *tp = workspace;
|
||||
|
||||
|
@ -95,15 +95,114 @@ Thread *chThdInit(tprio_t prio, void *workspace,
|
|||
memfill(workspace, wsize, MEM_FILL_PATTERN);
|
||||
#endif
|
||||
SETUP_CONTEXT(workspace, wsize, pf, arg);
|
||||
init_thread(prio, tp);
|
||||
init_thread(tp, prio);
|
||||
return tp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new thread into a static memory area.
|
||||
* @param workspace pointer to a working area dedicated to the thread stack
|
||||
* @param wsize size of the working area.
|
||||
* @param prio the priority level for the new thread. Usually the threads are
|
||||
* created with priority \p NORMALPRIO, priorities
|
||||
* can range from \p LOWPRIO to \p HIGHPRIO.
|
||||
* @param pf the thread function. Returning from this function automatically
|
||||
* terminates the thread.
|
||||
* @param arg an argument passed to the thread function. It can be \p NULL.
|
||||
* @return the pointer to the \p Thread structure allocated for the
|
||||
* thread into the working space area.
|
||||
* @note A thread can terminate by calling \p chThdExit() or by simply
|
||||
* returning from its main function.
|
||||
*/
|
||||
Thread *chThdCreateStatic(void *workspace, size_t wsize,
|
||||
tprio_t prio, tfunc_t pf, void *arg) {
|
||||
|
||||
Thread *tp = chThdInit(workspace, wsize, prio, pf, arg);
|
||||
chSysLock();
|
||||
chSchWakeupS(tp, RDY_OK);
|
||||
chSysUnlock();
|
||||
return tp;
|
||||
}
|
||||
|
||||
#if defined(CH_USE_DYNAMIC) && defined(CH_USE_WAITEXIT) && defined(CH_USE_HEAP)
|
||||
/**
|
||||
* Creates a new thread allocating the memory from the heap.
|
||||
* @param wsize size of the working area to be allocated
|
||||
* @param prio the priority level for the new thread. Usually the threads are
|
||||
* created with priority \p NORMALPRIO, priorities
|
||||
* can range from \p LOWPRIO to \p HIGHPRIO.
|
||||
* @param pf the thread function. Returning from this function automatically
|
||||
* terminates the thread.
|
||||
* @param arg an argument passed to the thread function. It can be \p NULL.
|
||||
* @return the pointer to the \p Thread structure allocated for the
|
||||
* thread into the working space area or \p NULL if the memory cannot
|
||||
* be allocated.
|
||||
* @note A thread can terminate by calling \p chThdExit() or by simply
|
||||
* returning from its main function.
|
||||
* @note The memory allocated for the thread is not released when the thread
|
||||
* terminates but when a \p chThdWait() is performed.
|
||||
* @note The function is available only if the \p CH_USE_DYNAMIC,
|
||||
* \p CH_USE_HEAP and \p CH_USE_WAITEXIT options are enabled
|
||||
* in \p chconf.h.
|
||||
*/
|
||||
Thread *chThdCreateFromHeap(size_t wsize, tprio_t prio,
|
||||
tfunc_t pf, void *arg) {
|
||||
|
||||
void *workspace = chHeapAlloc(wsize);
|
||||
if (workspace == NULL)
|
||||
return NULL;
|
||||
Thread *tp = chThdInit(workspace, wsize, prio, pf, arg);
|
||||
tp->p_flags |= P_MEM_MODE_HEAP;
|
||||
chSysLock();
|
||||
chSchWakeupS(tp, RDY_OK);
|
||||
chSysUnlock();
|
||||
return tp;
|
||||
}
|
||||
#endif /* defined(CH_USE_DYNAMIC) && defined(CH_USE_WAITEXIT) && defined(CH_USE_HEAP) */
|
||||
|
||||
#if defined(CH_USE_DYNAMIC) && defined(CH_USE_WAITEXIT) && defined(CH_USE_MEMPOOLS)
|
||||
/**
|
||||
* Creates a new thread allocating the memory from the specified Memory Pool.
|
||||
* @param mp the memory pool
|
||||
* @param prio the priority level for the new thread. Usually the threads are
|
||||
* created with priority \p NORMALPRIO, priorities
|
||||
* can range from \p LOWPRIO to \p HIGHPRIO.
|
||||
* @param pf the thread function. Returning from this function automatically
|
||||
* terminates the thread.
|
||||
* @param arg an argument passed to the thread function. It can be \p NULL.
|
||||
* @return the pointer to the \p Thread structure allocated for the
|
||||
* thread into the working space area or \p NULL if the memory cannot
|
||||
* be allocated.
|
||||
* @note A thread can terminate by calling \p chThdExit() or by simply
|
||||
* returning from its main function.
|
||||
* @note The memory allocated for the thread is not released when the thread
|
||||
* terminates but when a \p chThdWait() is performed.
|
||||
* @note The function is available only if the \p CH_USE_DYNAMIC,
|
||||
* \p CH_USE_MEMPOOLS and \p CH_USE_WAITEXIT options are enabled
|
||||
* in \p chconf.h.
|
||||
*/
|
||||
Thread *chThdCreateFromMemoryPool(MemoryPool *mp, tprio_t prio,
|
||||
tfunc_t pf, void *arg) {
|
||||
|
||||
void *workspace = chPoolAlloc(mp);
|
||||
if (workspace == NULL)
|
||||
return NULL;
|
||||
Thread *tp = chThdInit(workspace, mp->mp_object_size, prio, pf, arg);
|
||||
tp->p_flags |= P_MEM_MODE_MEMPOOL;
|
||||
tp->p_mpool = mp;
|
||||
chSysLock();
|
||||
chSchWakeupS(tp, RDY_OK);
|
||||
chSysUnlock();
|
||||
return tp;
|
||||
}
|
||||
#endif /* defined(CH_USE_DYNAMIC) && defined(CH_USE_WAITEXIT) && defined(CH_USE_MEMPOOLS) */
|
||||
|
||||
/**
|
||||
* Creates a new thread.
|
||||
* @param prio the priority level for the new thread. Usually the threads are
|
||||
* created with priority \p NORMALPRIO, priorities
|
||||
* can range from \p LOWPRIO to \p HIGHPRIO.
|
||||
* @param mode ignored
|
||||
* @param workspace pointer to a working area dedicated to the thread stack
|
||||
* @param wsize size of the working area.
|
||||
* @param pf the thread function. Returning from this function automatically
|
||||
|
@ -113,15 +212,13 @@ Thread *chThdInit(tprio_t prio, void *workspace,
|
|||
* thread into the working space area.
|
||||
* @note A thread can terminate by calling \p chThdExit() or by simply
|
||||
* returning from its main function.
|
||||
* @deprecated Please use \p chThdCreateStatic() or \p chThdInit() instead,
|
||||
* this function will be removed in version 1.0.0.
|
||||
*/
|
||||
Thread *chThdCreate(tprio_t prio, void *workspace,
|
||||
Thread *chThdCreate(tprio_t prio, tmode_t mode, void *workspace,
|
||||
size_t wsize, tfunc_t pf, void *arg) {
|
||||
|
||||
Thread *tp = chThdInit(prio, workspace, wsize, pf, arg);
|
||||
chSysLock();
|
||||
chSchWakeupS(tp, RDY_OK);
|
||||
chSysUnlock();
|
||||
return tp;
|
||||
return chThdCreateStatic(workspace, wsize, prio, pf, arg);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -137,16 +234,13 @@ Thread *chThdCreate(tprio_t prio, void *workspace,
|
|||
* thread into the working space area.
|
||||
* @note A thread can terminate by calling \p chThdExit() or by simply
|
||||
* returning from its main function.
|
||||
* @deprecated
|
||||
* @deprecated Please use \p chThdCreateStatic() or \p chThdInit() instead,
|
||||
* this function will be removed in version 1.0.0.
|
||||
*/
|
||||
Thread *chThdCreateFast(tprio_t prio, void *workspace,
|
||||
size_t wsize, tfunc_t pf) {
|
||||
|
||||
Thread *tp = chThdInit(prio, workspace, wsize, pf, NULL);
|
||||
chSysLock();
|
||||
chSchWakeupS(tp, RDY_OK);
|
||||
chSysUnlock();
|
||||
return tp;
|
||||
return chThdCreateStatic(workspace, wsize, prio, pf, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -245,9 +339,21 @@ void chThdExit(msg_t msg) {
|
|||
/**
|
||||
* Blocks the execution of the invoking thread until the specified thread
|
||||
* terminates then the exit code is returned.
|
||||
*
|
||||
* @param tp the pointer to the thread
|
||||
* @return the exit code
|
||||
* The memory used by the exited thread is handled in different ways depending
|
||||
* on the API that spawned the thread:
|
||||
* <ul>
|
||||
* <li>If the thread was spawned by \p chThdCreateStatic() or by \p chThdInit()
|
||||
* then nothing happens and the thread working area is not released or
|
||||
* modified in any way. This is the default, totally static, behavior.</li>
|
||||
* <li>If the thread was spawned by \p chThdCreateFromHeap() then the working
|
||||
* area is returned to the system heap.</li>
|
||||
* <li>If the thread was spawned by \p chThdCreateFromMemoryPool() then the
|
||||
* working area is returned to the owning memory pool.</li>
|
||||
* </ul>
|
||||
* @param tp the thread pointer
|
||||
* @return the exit code from the terminated thread
|
||||
* @note After invoking \p chThdWait() the thread pointer becomes invalid and
|
||||
* must not be used as parameter for further system calls.
|
||||
* @note The function is available only if the \p CH_USE_WAITEXIT
|
||||
* option is enabled in \p chconf.h.
|
||||
*/
|
||||
|
@ -262,8 +368,33 @@ msg_t chThdWait(Thread *tp) {
|
|||
}
|
||||
msg = tp->p_exitcode;
|
||||
|
||||
#ifndef CH_USE_DYNAMIC
|
||||
chSysUnlock();
|
||||
return msg;
|
||||
#else /* CH_USE_DYNAMIC */
|
||||
if (notempty(&tp->p_waiting)) {
|
||||
chSysUnlock();
|
||||
return msg;
|
||||
}
|
||||
|
||||
/* This is the last thread waiting for termination, returning memory.*/
|
||||
tmode_t mode = tp->p_flags & P_MEM_MODE_MASK;
|
||||
chSysUnlock();
|
||||
|
||||
switch (mode) {
|
||||
#ifdef CH_USE_HEAP
|
||||
case P_MEM_MODE_HEAP:
|
||||
chHeapFree(tp);
|
||||
break;
|
||||
#endif
|
||||
#ifdef CH_USE_MEMPOOLS
|
||||
case P_MEM_MODE_MEMPOOL:
|
||||
chPoolFree(tp->p_mpool, tp);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
return msg;
|
||||
#endif /* CH_USE_DYNAMIC */
|
||||
}
|
||||
#endif /* CH_USE_WAITEXIT */
|
||||
|
||||
|
|
|
@ -37,13 +37,13 @@
|
|||
#include "mutexes.h"
|
||||
#include "events.h"
|
||||
#include "messages.h"
|
||||
#include "heap.h"
|
||||
#include "mempools.h"
|
||||
#include "threads.h"
|
||||
#include "inline.h"
|
||||
#include "sleep.h"
|
||||
#include "queues.h"
|
||||
#include "serial.h"
|
||||
#include "heap.h"
|
||||
#include "mempools.h"
|
||||
#include "debug.h"
|
||||
|
||||
/*
|
||||
|
|
|
@ -106,6 +106,10 @@ struct Thread {
|
|||
/** Thread's own, non-inherited, priority. */
|
||||
tprio_t p_realprio;
|
||||
#endif
|
||||
#if defined(CH_USE_DYNAMIC) && defined(CH_USE_MEMPOOLS)
|
||||
/** Memory Pool where the thread workspace is returned. */
|
||||
void *p_mpool;
|
||||
#endif
|
||||
#ifdef CH_USE_THREAD_EXT
|
||||
THREAD_EXT_FIELDS
|
||||
#endif
|
||||
|
@ -134,8 +138,14 @@ struct Thread {
|
|||
/** Thread state: After termination.*/
|
||||
#define PREXIT 10
|
||||
|
||||
/** Thread option: Termination requested flag.*/
|
||||
#define P_TERMINATE 1
|
||||
/*
|
||||
* Various flags into the thread p_flags field.
|
||||
*/
|
||||
#define P_MEM_MODE_MASK 3 /* Thread memory mode mask. */
|
||||
#define P_MEM_MODE_STATIC 0 /* Thread memory mode: static. */
|
||||
#define P_MEM_MODE_HEAP 1 /* Thread memory mode: heap. */
|
||||
#define P_MEM_MODE_MEMPOOL 2 /* Thread memory mode: mempool. */
|
||||
#define P_TERMINATE 4 /* Termination requested. */
|
||||
|
||||
/** Pseudo priority used by the ready list header, do not use.*/
|
||||
#define NOPRIO 0
|
||||
|
@ -151,7 +161,7 @@ struct Thread {
|
|||
#define ABSPRIO 255
|
||||
|
||||
/* Not an API, don't use into the application code.*/
|
||||
void init_thread(tprio_t prio, Thread *tp);
|
||||
void init_thread(Thread *tp, tprio_t prio);
|
||||
|
||||
/** Thread function.*/
|
||||
typedef msg_t (*tfunc_t)(void *);
|
||||
|
@ -162,9 +172,15 @@ typedef msg_t (*tfunc_t)(void *);
|
|||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
Thread *chThdInit(tprio_t prio, void *workspace,
|
||||
size_t wsize, tfunc_t pf, void *arg);
|
||||
Thread *chThdCreate(tprio_t prio, void *workspace,
|
||||
Thread *chThdInit(void *workspace, size_t wsize,
|
||||
tprio_t prio, tfunc_t pf, void *arg);
|
||||
Thread *chThdCreateStatic(void *workspace, size_t wsize,
|
||||
tprio_t prio, tfunc_t pf, void *arg);
|
||||
Thread *chThdCreateFromHeap(size_t wsize, tprio_t prio,
|
||||
tfunc_t pf, void *arg);
|
||||
Thread *chThdCreateFromMemoryPool(MemoryPool *mp, tprio_t prio,
|
||||
tfunc_t pf, void *arg);
|
||||
Thread *chThdCreate(tprio_t prio, tmode_t mode, void *workspace,
|
||||
size_t wsize, tfunc_t pf, void *arg);
|
||||
Thread *chThdCreateFast(tprio_t prio, void *workspace,
|
||||
size_t wsize, tfunc_t pf);
|
||||
|
|
|
@ -148,6 +148,12 @@
|
|||
* are included in the kernel.*/
|
||||
#define CH_USE_MEMPOOLS
|
||||
|
||||
/** Configuration option: if specified then the dynamic objects creation APIs
|
||||
* are included in the kernel.
|
||||
* @note requires \p CH_USE_WAITEXIT.
|
||||
*/
|
||||
#define CH_USE_DYNAMIC
|
||||
|
||||
/** Configuration option: Frequency of the system timer that drives the system
|
||||
* ticks. This also defines the system time unit.*/
|
||||
#define CH_FREQUENCY 1000
|
||||
|
|
|
@ -47,7 +47,7 @@ static msg_t thread(void *p) {
|
|||
static void msg1_execute(void) {
|
||||
msg_t msg;
|
||||
|
||||
threads[0] = chThdCreate(chThdGetPriority()-1, wa[0], STKSIZE, thread, chThdSelf());
|
||||
threads[0] = chThdCreateStatic(wa[0], STKSIZE, chThdGetPriority()-1, thread, chThdSelf());
|
||||
do {
|
||||
chMsgRelease(msg = chMsgWait());
|
||||
if (msg)
|
||||
|
|
|
@ -52,11 +52,11 @@ static void mtx1_execute(void) {
|
|||
|
||||
tprio_t prio = chThdGetPriority(); // Bacause priority inheritance.
|
||||
chMtxLock(&m1);
|
||||
threads[0] = chThdCreate(prio+1, wa[0], STKSIZE, thread1, "E");
|
||||
threads[1] = chThdCreate(prio+2, wa[1], STKSIZE, thread1, "D");
|
||||
threads[2] = chThdCreate(prio+3, wa[2], STKSIZE, thread1, "C");
|
||||
threads[3] = chThdCreate(prio+4, wa[3], STKSIZE, thread1, "B");
|
||||
threads[4] = chThdCreate(prio+5, wa[4], STKSIZE, thread1, "A");
|
||||
threads[0] = chThdCreateStatic(wa[0], STKSIZE, prio+1, thread1, "E");
|
||||
threads[1] = chThdCreateStatic(wa[1], STKSIZE, prio+2, thread1, "D");
|
||||
threads[2] = chThdCreateStatic(wa[2], STKSIZE, prio+3, thread1, "C");
|
||||
threads[3] = chThdCreateStatic(wa[3], STKSIZE, prio+4, thread1, "B");
|
||||
threads[4] = chThdCreateStatic(wa[4], STKSIZE, prio+5, thread1, "A");
|
||||
chMtxUnlock();
|
||||
test_assert(prio == chThdGetPriority(), "priority return failure");
|
||||
test_wait_threads();
|
||||
|
@ -117,9 +117,9 @@ static msg_t thread4(void *p) {
|
|||
*/
|
||||
static void mtx2_execute(void) {
|
||||
|
||||
threads[0] = chThdCreate(chThdGetPriority()-1, wa[0], STKSIZE, thread2, "A");
|
||||
threads[1] = chThdCreate(chThdGetPriority()-3, wa[1], STKSIZE, thread3, "C");
|
||||
threads[2] = chThdCreate(chThdGetPriority()-2, wa[2], STKSIZE, thread4, "B");
|
||||
threads[0] = chThdCreateStatic(wa[0], STKSIZE, chThdGetPriority()-1, thread2, "A");
|
||||
threads[1] = chThdCreateStatic(wa[1], STKSIZE, chThdGetPriority()-3, thread3, "C");
|
||||
threads[2] = chThdCreateStatic(wa[2], STKSIZE, chThdGetPriority()-2, thread4, "B");
|
||||
test_wait_threads();
|
||||
test_assert_sequence("ABC");
|
||||
}
|
||||
|
@ -206,11 +206,11 @@ static msg_t thread9(void *p) {
|
|||
*/
|
||||
static void mtx3_execute(void) {
|
||||
|
||||
threads[0] = chThdCreate(chThdGetPriority()-5, wa[0], STKSIZE, thread5, "E");
|
||||
threads[1] = chThdCreate(chThdGetPriority()-4, wa[1], STKSIZE, thread6, "D");
|
||||
threads[2] = chThdCreate(chThdGetPriority()-3, wa[2], STKSIZE, thread7, "C");
|
||||
threads[3] = chThdCreate(chThdGetPriority()-2, wa[3], STKSIZE, thread8, "B");
|
||||
threads[4] = chThdCreate(chThdGetPriority()-1, wa[4], STKSIZE, thread9, "A");
|
||||
threads[0] = chThdCreateStatic(wa[0], STKSIZE, chThdGetPriority()-5, thread5, "E");
|
||||
threads[1] = chThdCreateStatic(wa[1], STKSIZE, chThdGetPriority()-4, thread6, "D");
|
||||
threads[2] = chThdCreateStatic(wa[2], STKSIZE, chThdGetPriority()-3, thread7, "C");
|
||||
threads[3] = chThdCreateStatic(wa[3], STKSIZE, chThdGetPriority()-2, thread8, "B");
|
||||
threads[4] = chThdCreateStatic(wa[4], STKSIZE, chThdGetPriority()-1, thread9, "A");
|
||||
test_wait_threads();
|
||||
test_assert_sequence("ABCDE");
|
||||
}
|
||||
|
|
|
@ -40,11 +40,11 @@ static void rdy1_teardown(void) {
|
|||
|
||||
static void rdy1_execute(void) {
|
||||
|
||||
threads[0] = chThdCreate(chThdGetPriority()-5, wa[0], STKSIZE, thread, "E");
|
||||
threads[1] = chThdCreate(chThdGetPriority()-4, wa[1], STKSIZE, thread, "D");
|
||||
threads[2] = chThdCreate(chThdGetPriority()-3, wa[2], STKSIZE, thread, "C");
|
||||
threads[3] = chThdCreate(chThdGetPriority()-2, wa[3], STKSIZE, thread, "B");
|
||||
threads[4] = chThdCreate(chThdGetPriority()-1, wa[4], STKSIZE, thread, "A");
|
||||
threads[0] = chThdCreateStatic(wa[0], STKSIZE, chThdGetPriority()-5, thread, "E");
|
||||
threads[1] = chThdCreateStatic(wa[1], STKSIZE, chThdGetPriority()-4, thread, "D");
|
||||
threads[2] = chThdCreateStatic(wa[2], STKSIZE, chThdGetPriority()-3, thread, "C");
|
||||
threads[3] = chThdCreateStatic(wa[3], STKSIZE, chThdGetPriority()-2, thread, "B");
|
||||
threads[4] = chThdCreateStatic(wa[4], STKSIZE, chThdGetPriority()-1, thread, "A");
|
||||
test_wait_threads();
|
||||
test_assert_sequence("ABCDE");
|
||||
}
|
||||
|
@ -69,11 +69,11 @@ static void rdy2_teardown(void) {
|
|||
|
||||
static void rdy2_execute(void) {
|
||||
|
||||
threads[1] = chThdCreate(chThdGetPriority()-4, wa[1], STKSIZE, thread, "D");
|
||||
threads[0] = chThdCreate(chThdGetPriority()-5, wa[0], STKSIZE, thread, "E");
|
||||
threads[4] = chThdCreate(chThdGetPriority()-1, wa[4], STKSIZE, thread, "A");
|
||||
threads[3] = chThdCreate(chThdGetPriority()-2, wa[3], STKSIZE, thread, "B");
|
||||
threads[2] = chThdCreate(chThdGetPriority()-3, wa[2], STKSIZE, thread, "C");
|
||||
threads[1] = chThdCreateStatic(wa[1], STKSIZE, chThdGetPriority()-4, thread, "D");
|
||||
threads[0] = chThdCreateStatic(wa[0], STKSIZE, chThdGetPriority()-5, thread, "E");
|
||||
threads[4] = chThdCreateStatic(wa[4], STKSIZE, chThdGetPriority()-1, thread, "A");
|
||||
threads[3] = chThdCreateStatic(wa[3], STKSIZE, chThdGetPriority()-2, thread, "B");
|
||||
threads[2] = chThdCreateStatic(wa[2], STKSIZE, chThdGetPriority()-3, thread, "C");
|
||||
test_wait_threads();
|
||||
test_assert_sequence("ABCDE");
|
||||
}
|
||||
|
|
|
@ -47,11 +47,11 @@ static msg_t thread(void *p) {
|
|||
|
||||
static void sem1_execute(void) {
|
||||
|
||||
threads[0] = chThdCreate(chThdGetPriority()+5, wa[0], STKSIZE, thread, "A");
|
||||
threads[1] = chThdCreate(chThdGetPriority()+1, wa[1], STKSIZE, thread, "B");
|
||||
threads[2] = chThdCreate(chThdGetPriority()+3, wa[2], STKSIZE, thread, "C");
|
||||
threads[3] = chThdCreate(chThdGetPriority()+4, wa[3], STKSIZE, thread, "D");
|
||||
threads[4] = chThdCreate(chThdGetPriority()+2, wa[4], STKSIZE, thread, "E");
|
||||
threads[0] = chThdCreateStatic(wa[0], STKSIZE, chThdGetPriority()+5, thread, "A");
|
||||
threads[1] = chThdCreateStatic(wa[1], STKSIZE, chThdGetPriority()+1, thread, "B");
|
||||
threads[2] = chThdCreateStatic(wa[2], STKSIZE, chThdGetPriority()+3, thread, "C");
|
||||
threads[3] = chThdCreateStatic(wa[3], STKSIZE, chThdGetPriority()+4, thread, "D");
|
||||
threads[4] = chThdCreateStatic(wa[4], STKSIZE, chThdGetPriority()+2, thread, "E");
|
||||
chSemSignal(&sem1);
|
||||
chSemSignal(&sem1);
|
||||
chSemSignal(&sem1);
|
||||
|
|
Loading…
Reference in New Issue