From 9a0ef300bce50901d5de3d6d722e29b79a2f9a36 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Fri, 28 Sep 2007 18:42:04 +0000 Subject: [PATCH] git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@25 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/LPC214x-GCC/main.c | 6 ++-- docs/Doxyfile | 72 +++++++++++++++++++-------------------- docs/ch.txt | 69 +++++++++++++++++++++++++++++++++++++ docs/img/readylist.png | Bin 0 -> 7883 bytes docs/img/workspace.png | Bin 0 -> 14430 bytes readme.txt | 9 +++++ src/chsleep.c | 4 +-- src/chthreads.c | 49 -------------------------- src/include/threads.h | 46 ++++++++++++++++++++++--- src/templates/chcore.c | 2 +- src/templates/chcore.h | 4 +-- 11 files changed, 163 insertions(+), 98 deletions(-) create mode 100644 docs/img/readylist.png create mode 100644 docs/img/workspace.png diff --git a/demos/LPC214x-GCC/main.c b/demos/LPC214x-GCC/main.c index a696b223f..c925671e9 100644 --- a/demos/LPC214x-GCC/main.c +++ b/demos/LPC214x-GCC/main.c @@ -23,7 +23,7 @@ #include "lpc214x_serial.h" #include "buzzer.h" -static BYTE8 waThread1[UserStackSize(16)]; +static BYTE8 waThread1[UserStackSize(32)]; static t_msg Thread1(void *arg) { @@ -40,7 +40,7 @@ static t_msg Thread1(void *arg) { return 0; } -static BYTE8 waThread2[UserStackSize(16)]; +static BYTE8 waThread2[UserStackSize(32)]; static t_msg Thread2(void *arg) { @@ -53,7 +53,7 @@ static t_msg Thread2(void *arg) { return 0; } -static BYTE8 waThread3[UserStackSize(16)]; +static BYTE8 waThread3[UserStackSize(32)]; static t_msg Thread3(void *arg) { diff --git a/docs/Doxyfile b/docs/Doxyfile index 6cc09c5d9..0bcdbdbf2 100644 --- a/docs/Doxyfile +++ b/docs/Doxyfile @@ -4,7 +4,7 @@ # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = ChibiOS/RT -PROJECT_NUMBER = "0.2.1 alpha" +PROJECT_NUMBER = "0.3.0 beta" OUTPUT_DIRECTORY = . CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English @@ -26,7 +26,7 @@ ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = "C:/Documents and Settings/Administrator/" -STRIP_FROM_INC_PATH = +STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = YES MULTILINE_CPP_IS_BRIEF = NO @@ -34,7 +34,7 @@ DETAILS_AT_TOP = YES INHERIT_DOCS = NO SEPARATE_MEMBER_PAGES = NO TAB_SIZE = 2 -ALIASES = +ALIASES = OPTIMIZE_OUTPUT_FOR_C = YES OPTIMIZE_OUTPUT_JAVA = NO BUILTIN_STL_SUPPORT = NO @@ -64,11 +64,11 @@ GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES -ENABLED_SECTIONS = +ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = NO SHOW_DIRECTORIES = NO -FILE_VERSION_FILTER = +FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- @@ -78,7 +78,7 @@ WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = NO WARN_FORMAT = "$file:$line: $text" -WARN_LOGFILE = +WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- @@ -115,15 +115,15 @@ FILE_PATTERNS = *.c \ *.py \ *.ddf RECURSIVE = YES -EXCLUDE = +EXCLUDE = EXCLUDE_SYMLINKS = NO -EXCLUDE_PATTERNS = -EXAMPLE_PATH = +EXCLUDE_PATTERNS = +EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO -IMAGE_PATH = -INPUT_FILTER = -FILTER_PATTERNS = +IMAGE_PATH = ./img +INPUT_FILTER = +FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing @@ -141,20 +141,20 @@ VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 -IGNORE_PREFIX = +IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html -HTML_HEADER = -HTML_FOOTER = -HTML_STYLESHEET = +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO -CHM_FILE = -HHC_LOCATION = +CHM_FILE = +HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO @@ -171,8 +171,8 @@ LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide -EXTRA_PACKAGES = -LATEX_HEADER = +EXTRA_PACKAGES = +LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO @@ -184,8 +184,8 @@ GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO -RTF_STYLESHEET_FILE = -RTF_EXTENSIONS_FILE = +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- @@ -198,8 +198,8 @@ MAN_LINKS = NO #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml -XML_SCHEMA = -XML_DTD = +XML_SCHEMA = +XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output @@ -211,16 +211,16 @@ GENERATE_AUTOGEN_DEF = NO GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES -PERLMOD_MAKEVAR_PREFIX = +PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- -# Configuration options related to the preprocessor +# Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES -INCLUDE_PATH = -INCLUDE_FILE_PATTERNS = +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = PREDEFINED = __JUST_STUBS__ \ __DOXIGEN__ \ CH_USE_VIRTUAL_TIMERS \ @@ -242,18 +242,18 @@ PREDEFINED = __JUST_STUBS__ \ CH_USE_MESSAGES \ CH_USE_MESSAGES_TIMEOUT \ CH_USE_MESSAGES_EVENT -EXPAND_AS_DEFINED = +EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- -# Configuration::additions related to external references +# Configuration::additions related to external references #--------------------------------------------------------------------------- -TAGFILES = -GENERATE_TAGFILE = +TAGFILES = +GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- -# Configuration options related to the dot tool +# Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES @@ -270,8 +270,8 @@ CALLER_GRAPH = NO GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES DOT_IMAGE_FORMAT = png -DOT_PATH = -DOTFILE_DIRS = +DOT_PATH = +DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 @@ -280,6 +280,6 @@ DOT_MULTI_TARGETS = NO GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- -# Configuration::additions related to the search engine +# Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO diff --git a/docs/ch.txt b/docs/ch.txt index c259357eb..38d6d589a 100644 --- a/docs/ch.txt +++ b/docs/ch.txt @@ -47,8 +47,77 @@ * memory image. *
  • Almost totally written in C with little ASM code required for ports.
  • * + * + * ChibiOS/RT architecture:

    + * @subpage Concepts */ +/** + * @page Concepts Concepts + * @{ + * @section naming Naming Conventions + * ChibiOS/RT APIs are all named following this convention: + * \a ch\\\(). + * The possible groups are: \a Sys, \a Sch, \a VT, \a Thd, \a Sem, \a Evt, + * \a Msg, \a IQ, \a OQ, \a HQ,\a FDD, \a HDD. + * The suffix is not present for normal APIs but can be one of + * the following: "I" for APIs meant to be invoked from an interrupt handler + * or within the system mutex zone but not from user code, "S" for APIs only + * useable from within the system mutex zone but not from interrupt handlers + * or user code. The APIs without suffix can be invoked only from the user + * code.
    + * Examples: \p chThdCreate(), \p chSemSignalI(), \p chIQGetTimeout(). + * + * @section scheduling Scheduling + * The strategy is very simple the currently ready thread with the highest + * priority is executed. If more than one thread with equal priority are + * eligible for execution then they are executed in a round-robin way, the + * CPU time slice constant is configurable. The ready list is a double linked + * list of threads ordered by priority. + * @image html readylist.png + * Note that the currently running thread is not in the ready list, the list + * only contains the threads ready to be executed but still actually waiting. + * + * @section warea Thread Working Area + * Each thread has its own stack, a Thread structure and a registers dump + * structure. All the structures are allocated into a "Thread working area", + * a thread private heap, usually allocated in a char array declared in your + * code, there is not a central threads table or list, this means you can + * have as many threads you want as long you have enough available RAM + * memory. The threads do not use any memory outside the allocated working + * area.
    + + * @image html workspace.png + *
    + * Note that the registers dump is only present when the Thread is not + * running, the context switching is done by pushing the registers on the + * stack of the switched-out thread and popping the registers of the + * switched-in thread from its stack. + * + * @section sysmutex System Mutex Zone + * It is the code within the OS that cannot be preempted, this code is + * everything between the \p chSysLock() and \p chSysUnlock() API calls. + * The implementation of the APIs in most cases just enables/disables the + * interrupts. Of course the code in the system mutex zone must be as short + * and efficient possible as it affects the RT performance of the whole + * system. The worst case response time is affected by the longest code + * path in the system mutex zone or interrupt handler. + * @code + * // User code, not critical, preemption possible. + * chSysLock(); + * ... + * // System critical code, preemption delayed. + * ... + * chSysUnlock(); + * // User code, preemption possible again. + * @endcode + * Applications usually do not need to put code into the system mutex zone + * unless you are implementing device drivers or special synchronization + * primitives, everything else can be implemented by using semaphores, + * messages or events. + */ +/** @} */ + /** * @defgroup Kernel Kernel * @{ diff --git a/docs/img/readylist.png b/docs/img/readylist.png new file mode 100644 index 0000000000000000000000000000000000000000..4d852388f3dade5f1236842edacc7b6eecd8aa71 GIT binary patch literal 7883 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 literal 0 HcmV?d00001 diff --git a/readme.txt b/readme.txt index 07fc0c508..4508b2a21 100644 --- a/readme.txt +++ b/readme.txt @@ -32,6 +32,15 @@ LPC214x-GCC - ChibiOS/RT port for ARM7 LPC2148, the demo targets the *** Releases *** ***************************************************************************** +*** 0.3.0 *** +- ChibiOS/RT goes beta. +- Diet for the threads code, some simple APIs become macros. +- Thread Local Storage implemented as a single API: chThdLS(). + The API simply returns a pointer into the thread working area, see the + documentation on the web site. +- Moved some documentation and images from the web site into the Doxigen + generated HTMLs. + *** 0.2.1 *** - Optimizations in the RT semaphores subsystem. The support for this subsystem should still be considered experimental and further changes may diff --git a/src/chsleep.c b/src/chsleep.c index 9fedd0244..5814410f3 100644 --- a/src/chsleep.c +++ b/src/chsleep.c @@ -62,11 +62,11 @@ t_time chSysGetTime(void) { * option is enabled in \p chconf.h. */ void chThdSleepUntil(t_time time) { - VirtualTimer t; + VirtualTimer vt; chSysLock(); - chVTSetI(&t, (t_time)(time - stime), (t_vtfunc)chSchReadyI, currp); + chVTSetI(&vt, (t_time)(time - stime), (t_vtfunc)chSchReadyI, currp); chSchGoSleepI(PRSLEEP); chSysUnlock(); diff --git a/src/chthreads.c b/src/chthreads.c index 59c361116..a439eb5b4 100644 --- a/src/chthreads.c +++ b/src/chthreads.c @@ -129,17 +129,6 @@ Thread *chThdCreate(t_prio prio, t_tmode mode, void *workspace, return tp; } -/** - * Verifies if the specified thread is in the \p PREXIT state. - * @param tp the pointer to the thread - * @return \p TRUE if the thread is ended else \p FALSE. \p TRUE ensures that - * a subsequent call to \p chThdWait() would not block. - */ -BOOL chThdTerminated(Thread *tp) { - - return tp->p_state == PREXIT; -} - #ifdef CH_USE_RESUME /** * Resumes a thread created with the \p P_SUSPENDED option. @@ -176,17 +165,6 @@ void chThdTerminate(Thread *tp) { chSysUnlock(); } - -/** - * Verifies if the current thread has a termination request pending. - * @return \p TRUE if the termination was requested. The thread should terminate - * as soon it is ready to do so. - */ -BOOL chThdShouldTerminate(void) { - - return currp->p_flags & P_TERMINATE ? TRUE : FALSE; -} - #endif /** @@ -234,31 +212,4 @@ t_msg chThdWait(Thread *tp) { } #endif /* CH_USE_WAITEXIT */ -#ifdef CH_USE_EXIT_EVENT -/** - * Returns the exit event source for the specified thread. The source is - * signaled when the thread terminates. - * @param tp the pointer to the thread - * @note When registering on a thread termination make sure the thread - * is still alive, if you do that after the thread termination - * then you would miss the event. There are two ways to ensure - * this:
    - *
      - *
    • Create the thread suspended, register on the event source - * and then resume the thread (recommended).
    • - *
    • Create the thread with a lower priority then register on it. - * This does not work if the hardware is capable of multiple - * physical threads.
    • - *
    - * @note You dont need to unregister from a terminated thread because - * the event source becomes inactive. - * @note The function is available only if the \p CH_USE_EXIT_EVENT - * option is enabled in \p chconf.h. - */ -EventSource *chThdGetExitEventSource(Thread *tp) { - - return &tp->p_exitesource; -} -#endif /* CH_USE_EXIT_EVENT */ - /** @} */ diff --git a/src/include/threads.h b/src/include/threads.h index f170ce368..688ce579a 100644 --- a/src/include/threads.h +++ b/src/include/threads.h @@ -182,19 +182,55 @@ static INLINE void enqueue(Thread *tp, ThreadsQueue *tqp) { /* * Threads APIs. */ -#define chThdSelf() currp Thread *chThdCreate(t_prio prio, t_tmode mode, void *workspace, t_size wsize, t_tfunc pf, void *arg); void chThdResume(Thread *tp); -void chThdTerminate(Thread *tp); -BOOL chThdShouldTerminate(void); -BOOL chThdTerminated(Thread *tp); void chThdExit(t_msg msg); + +/** Returns the pointer to the \p Thread currently in execution.*/ +#define chThdSelf() currp + +/** Returns the pointer to the \p Thread local storage area, if any.*/ +#define chThdLS() (void *)(currp + 1) + +/** Verifies if the specified thread is in the \p PREXIT state.*/ +#define chThdTerminated(tp) ((tp)->p_state == PREXIT) + +#ifdef CH_USE_TERMINATE +/** + * Verifies if the current thread has a termination request pending. + */ +#define chThdShouldTerminate() (currp->p_flags & P_TERMINATE) + +void chThdTerminate(Thread *tp); +#endif + #ifdef CH_USE_WAITEXIT t_msg chThdWait(Thread *tp); #endif + #ifdef CH_USE_EXIT_EVENT -EventSource *chThdGetExitEventSource(Thread *tp); +/** + * Returns the exit event source for the specified thread. The source is + * signaled when the thread terminates. + * @param tp the pointer to the thread + * @note When registering on a thread termination make sure the thread + * is still alive, if you do that after the thread termination + * then you would miss the event. There are two ways to ensure + * this:
    + *
      + *
    • Create the thread suspended, register on the event source + * and then resume the thread (recommended).
    • + *
    • Create the thread with a lower priority then register on it. + * This does not work if the hardware is capable of multiple + * physical threads.
    • + *
    + * @note You dont need to unregister from a terminated thread because + * the event source becomes inactive. + * @note The function is available only if the \p CH_USE_EXIT_EVENT + * option is enabled in \p chconf.h. + */ +#define chThdGetExitEventSource(tp) (&(tp)->p_exitesource) #endif #endif /* _THREADS_H_ */ diff --git a/src/templates/chcore.c b/src/templates/chcore.c index 29a809378..e23cf1bfe 100644 --- a/src/templates/chcore.c +++ b/src/templates/chcore.c @@ -37,7 +37,7 @@ void chSysPause(void) {} /** - * Abonormal system termination handler. Invoked by the ChobiOS/RT when an + * Abonormal system termination handler. Invoked by the ChibiOS/RT when an * abnormal unrecoverable condition is met. */ void chSysHalt(void) {} diff --git a/src/templates/chcore.h b/src/templates/chcore.h index 895e2b685..bb901b1ec 100644 --- a/src/templates/chcore.h +++ b/src/templates/chcore.h @@ -39,7 +39,7 @@ struct stackregs { } /** - * Enters the ChobiOS/RT system mutual exclusion zone, the implementation is + * Enters the ChibiOS/RT system mutual exclusion zone, the implementation is * architecture dependent, on single core systems usually this function * just disables the interrupts. * @note The code in the system mutual exclusion zone must be as light and @@ -50,7 +50,7 @@ struct stackregs { #define chSysLock() /** - * Leaves the ChobiOS/RT system mutual exclusion zone, the implementation is + * Leaves the ChibiOS/RT system mutual exclusion zone, the implementation is * architecture dependent, on single core systems usually this function * just enables the interrupts. * @note The code in the system mutual exclusion zone must be as light and