From 3c101f29013c71f6a786f9ac7bdbf29499c47cbb Mon Sep 17 00:00:00 2001 From: gdisirio Date: Tue, 30 Dec 2008 18:08:30 +0000 Subject: [PATCH] git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@566 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- docs/ch.txt | 23 +++++++---- docs/img/readylist.png | Bin 7883 -> 11862 bytes docs/img/readylist.svg | 65 +++++++++++++++---------------- docs/img/workspace.png | Bin 14430 -> 20285 bytes docs/img/workspace.svg | 84 ++++++++++++++++++++++++++++++----------- src/templates/chcore.c | 9 ++++- src/templates/chcore.h | 18 +++++++++ 7 files changed, 137 insertions(+), 62 deletions(-) diff --git a/docs/ch.txt b/docs/ch.txt index 71ef8140e..c39153807 100644 --- a/docs/ch.txt +++ b/docs/ch.txt @@ -79,7 +79,7 @@ * 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. + * 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. @@ -89,19 +89,26 @@ * @image html states.png * * @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", + * Each thread has its own stack, a Thread structure and some preemption + * areas. 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.
+ * 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. + * Note that the preemption areas only present when the Thread is not + * running (switched out), 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. + * The preemption areas can be divided in up to three structures: + * - External Context. + * - Interrupt Stack. + * - Internal Context. + * + * See the @ref Core documentation for details, the areas may change on + * the various ports and some structures may not be present (or be zero-sized). * * @section sysmutex System Mutex Zone * It is the code within the OS that cannot be preempted, this code is diff --git a/docs/img/readylist.png b/docs/img/readylist.png index 4d852388f3dade5f1236842edacc7b6eecd8aa71..a7a8adb57556681d85fe1b4359589b965e348ad7 100644 GIT binary patch literal 11862 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

fmo`JoIaC03U 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 h{5M9g|9>pml^oNtJP8gDX#)i3ff< + transform="translate(-46.668657,15)"> 127 + id="flowPara3223">63 Thread Structure + transform="translate(-166.66866,15)"> 126 + id="flowPara5451">62 + transform="translate(73.331343,15)"> 128 + id="flowPara5492">64 + transform="translate(193.33134,15)"> 128 + id="flowPara5508">64 + id="g5533" + transform="translate(3.30033,14.5)"> Header diff --git a/docs/img/workspace.png b/docs/img/workspace.png index 03149b7bd876325f40888e8cf33136f19a538c36..e7e20b60b241247d86d1da28bc8f95130c887517 100644 GIT binary patch literal 20285 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 diff --git a/docs/img/workspace.svg b/docs/img/workspace.svg index afdc5492e..721be190c 100644 --- a/docs/img/workspace.svg +++ b/docs/img/workspace.svg @@ -15,10 +15,10 @@ sodipodi:version="0.32" inkscape:version="0.45.1" version="1.0" - sodipodi:docbase="C:\Progetti\ChibiOS\homepage" + sodipodi:docbase="D:\Progetti\ChibiOS-RT\docs\img" sodipodi:docname="workspace.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape" - inkscape:export-filename="C:\Progetti\ChibiOS\homepage\workspace.png" + inkscape:export-filename="D:\Progetti\ChibiOS-RT\docs\img\workspace.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90"> + inkscape:window-height="871" + inkscape:window-x="352" + inkscape:window-y="69" /> @@ -149,37 +149,37 @@ inkscape:export-xdpi="90" inkscape:export-ydpi="90" /> Thread Structure Registers Dump intctx Structure Thread Stack chThdLS() + id="flowPara2224">chThdLS() Stack Limit + + + extctx Structure INT_REQUIRED_STACK diff --git a/src/templates/chcore.c b/src/templates/chcore.c index c15f1c490..5a887d6ed 100644 --- a/src/templates/chcore.c +++ b/src/templates/chcore.c @@ -88,12 +88,19 @@ void chSysUnlock(void) { } /** - * Context switch. + * Performs a context switch. + * This is the most critical code in any port, this function is responsible + * for the context switch between 2 threads. + * @param otp the thread to be switched out + * @param ntp the thread to be switched in + * @note The implementation of this code affects directly the context + * switch performance so optimize here as much as you can. */ void chSysSwitchI(Thread *otp, Thread *ntp) {} /** * Prints a message on the system console (if any). + * @param msg the message to be printed on the system console */ void chSysPuts(char *msg) { } diff --git a/src/templates/chcore.h b/src/templates/chcore.h index 7690b7ce7..e551f3a61 100644 --- a/src/templates/chcore.h +++ b/src/templates/chcore.h @@ -32,27 +32,39 @@ /** * Base type for stack alignment. + * This type is used only for stack alignment reasons thus can be anything from + * a char to a double. */ typedef uint8_t stkalign_t; /** * Interrupt saved context. + * This structure represents the stack frame saved during a preemption-capable + * interrupt handler. */ struct extctx { }; /** * System saved context. + * This structure represents the inner stack frame during a context switching. */ struct intctx { }; +/** + * Platform dependent part of the @p Thread structure. + * This structure usually contains just the saved stack pointer defined as a + * pointer to a @p intctx structure. + */ typedef struct { struct intctx *sp; } Context; /** * Platform dependent part of the \p chThdCreate() API. + * This code usually setup the context switching frame represented by a + * @p intctx structure. */ #define SETUP_CONTEXT(workspace, wsize, pf, arg) \ { \ @@ -60,12 +72,18 @@ typedef struct { /** * Stack size for the system idle thread. + * This size depends on the idle thread implementation, usually the idle + * thread should take no more space than those reserved + * by @p INT_REQUIRED_STACK. */ #define IDLE_THREAD_STACK_SIZE 0 /** * Per-thread stack overhead for interrupts servicing, it is used in the * calculation of the correct working area size. + * This value can be zero on those architecture where there is a separate + * interrupt stack and the stack space between @p intctx and @p extctx is + * known to be zero. */ #define INT_REQUIRED_STACK 0