aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docs/index.html151
-rw-r--r--readme.txt2
-rw-r--r--src/chschd.c6
-rw-r--r--src/include/scheduler.h7
4 files changed, 160 insertions, 6 deletions
diff --git a/docs/index.html b/docs/index.html
new file mode 100644
index 000000000..83bd285de
--- /dev/null
+++ b/docs/index.html
@@ -0,0 +1,151 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head>
+ <meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
+ <title>ChibiOS/RT Homepage</title></head>
+<body>
+<table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
+ <tbody>
+ <tr align="center">
+ <td colspan="2" rowspan="1">
+ <h2><small><span class="t_nihongo_kanji" xml:lang="ja" lang="ja">&#12385;&#12403;</span></small>OS/RT<sup><font size="-2">TM</font></sup>
+Homepage</h2>
+(ChibiOS/RT)</td>
+ </tr>
+ <tr>
+ <td style="text-align: center; vertical-align: top; width: 150px;">Current
+Version 0.4.2<br>
+-<br>
+ <a href="http://sourceforge.net/projects/chibios/" rel="me" target="_top">Project on SourceForge</a><br>
+ <a href="html/index.html" target="_top" rel="me">Documentation</a><br>
+ <a href="http://sourceforge.net/project/showfiles.php?group_id=205897" rel="me" target="_top">Downloads</a><br><a href="http://wiki.mechlab.net/doku.php?id=chibios:start" rel="me" target="_top">Wiki</a><br><a href="http://sourceforge.net/forum/?group_id=205897" rel="me" target="_top">Forum</a><br>
+ <a href="http://sourceforge.net/users/gdisirio/" rel="me" target="_top">Contact me</a><br>
+-<br>
+ <a href="#History">History</a><br>
+ <a href="#Description">Description</a><br><a href="index.html#Current_ports">Current ports</a><br>
+ <a href="#Design">Design</a><br><a href="#Performance_and_Size">Performance and Size</a><br>
+ <a href="#Future">Future</a><br>
+-<br>
+ <a href="#Credits">Credits</a><br>
+ <br>
+ <a href="http://sourceforge.net"><img src="http://sflogo.sourceforge.net/sflogo.php?group_id=205897&amp;type=4" alt="SourceForge.net Logo" border="0" height="37" width="125"></a><br>
+ <br>
+ <a href="http://sourceforge.net/donate/index.php?group_id=205897"><img src="http://images.sourceforge.net/images/project-support.jpg" alt="Support This Project" border="0" height="32" width="88"> </a> </td>
+ <td style="text-align: justify; vertical-align: top;">
+ <h3><a name="History"></a>History</h3>
+This kernel is something I wrote back in 1990 for use on boards
+equipped
+with M68K processors, the development was made on an Atari ST. The OS
+worked well for its intended purpose, Internet was not
+widespread at that time so the system&nbsp;had a limited use.<br>
+Recently I decided to release this system, formerly known as <span style="font-style: italic;">mkRTOS</span>, as Free
+Software. I cleaned up the code, improved the documentation, made a
+port on a more modern architecture (ARM) and it is finally ready.<br>
+While ChibiOS/RT is a new product it is based on a proven system so the
+alpha/beta phases should not last long, the project was started as an
+alpha
+version mainly to be able to incorporate&nbsp;the feedback into the
+product easily.<br>
+ <h3><a name="Description"></a>Description</h3>
+ChibiOS/RT is designed for embedded applications and it is meant to be
+linked with the application code. The design philosophy is to make it
+easy to use so I hope that all the APIs are meaningful, easy to
+understand and with the parameters you would expect from them.<br>The
+system offers threads, semaphores, messages, events, virtual timers,
+queues, I/O channels with timeout capability and much more.<br>
+ <h3><a name="Current_ports"></a>Current
+ports</h3>
+Currently the ChibiOS/RT is ported to the following architectures:<br>
+ <ul>
+ <li>ARM7TDMI-LPC214x, the port to other LPC2000 chips
+should be trivial, port to other ARM families should be easy too. Both
+ARM and THUMB modes are supported.</li><li>Atmel AVR, the port is almost complete but untested because I broke my JTAG probe...</li><li>x86 as a Win32 process, this port allows to write
+your application on the PC without the need of a development
+board/simulator/emulator. Communication ports are simulated over
+sockets, you can telnet on the simulator ports for the debug. I am
+considering to create a similar simulator into a Linux process.</li>
+ <li>M68K, this was the original target but it is
+currently removed from the source tree because currently I have no way
+to test it, my old Atari ST is long dead. It should be very easy to
+revive the port to the M68K or Coldfire CPUs.</li>
+ </ul>
+In general the port is very easy on architectures that can handle well
+linked lists, the kernel is entirely reliant on&nbsp;lists so this
+is a
+very important efficiency factor. 16 and 32 bits architectures are
+always fine, 8 bit architectures should be evaluated case by case but
+are not ruled out, something like an H8 would not have problems. You
+could port it
+to a Z80/Z180 (I considered that too, and made tests using the SDCC
+compiler) but the
+resulting code is not much efficient because the instruction set is
+missing the indirect addressing for 16 bits values that is important
+for efficient linked lists traversal.
+ <h3><a name="Design"></a>Design</h3>
+The system was designed to be stable and avoid trouble as much as
+possible so some rules were set:<br>
+ <ul>
+ <li>No arrays or tables, I don't like to have to
+configure limits
+for data structures, only use lists or other dynamic data structures.
+See
+the&nbsp;<a href="http://chibios.sourceforge.net/doc/index.html" target="_top" rel="me">Documentation</a> and
+the demos.</li>
+ <li>No memory allocation inside the kernel, an allocator
+can be
+troublesome for RT applications. All the data structures are declared
+in the application code and not allocated from a shared system heap.
+This does not prevent the application code to use an allocator if
+needed, it is just the kernel that does not require it.</li>
+ <li>No weird macros in the user code, everything should
+look
+and feel like normal C code with a normal main() function. I don't like
+to bring someone else weird programming habits in my code and I think
+this is true for everybody.</li>
+ <li>Encapsulate all the things that need changes while
+porting
+the OS to new architectures in few template files, fill the code into
+the templates and the port is done.</li></ul><h3><a name="Performance_and_Size"></a>Performance and Size</h3>ChibiOS/RT
+has a wide set of APIs but all the subsystems can be included or
+removed from the memory image by editing the kernel configuration file
+chconf.h. On ARM processors, the kernel size&nbsp;starts at just
+1.5KiB&nbsp;depending on the included subsystems and the choosen
+compiler optimizations.<br>As reference, a kernel configured with...<br><ul><li>System startup code</li><li>Chip initialization code</li><li>Multithreading APIs</li><li>Virtual Timer APIs</li><li>Semaphore APIs</li><li>System time + Sleep API</li><li>Suspend/Resume APIs</li><li>Small main() program with flashing LEDs demo and 3 threads</li></ul>...just takes 2.11KiB of program space when compiled using THUMB code and space optimizations. Note that this is quite a <span style="font-weight: bold;">typical configuration</span>
+not a minimal one. A kernel configured with all the options and
+optimized for speed takes about 8KiB. See the documentation about the
+many available subsystems.<br><br>About performance, on a 48MHz LPC
+ARM7 processor the kernel is capable of context switch time ranging
+from 3 to 6 microseconds depending on the code type (ARM/THUMB) and the
+choosen complier/kernel optimizations. In the distribution is included
+a spreadsheet with the exact values and the various space/time trade
+offs.<br>The context switch time is *measured* using 2 threads
+exchanging messages and doing *real* work, it is not a calculated peak
+value. See the demo code, it includes the benchmark.
+ <h3><a name="Future"></a>Future</h3>
+Expect:<br><ul>
+
+ <li>Documentation improvements.</li>
+
+ <li>Ports to more architectures/boards when I am able to
+put my hands on new hardware/tools.</li>
+ <li>More demos.</li>
+ <li>Creation of new subsystems.</li>
+ <li>Integration with
+existing other free projects like: TCP/IP stacks, File Systems etc.</li>
+ </ul>
+ <h3><a name="Credits"></a>Credits</h3>
+ChibiOS/RT was created using:<br>
+ <ul>
+ <li>7-Zip, <a href="http://7-zip.org" target="_top">http://7-zip.org</a></li>
+ <li>GCC and GNU binutils, &nbsp;<a href="http://gcc.gnu.org" target="_top">http://gcc.gnu.org</a></li>
+ <li>Doxigen, <a href="http://www.doxygen.org" target="_top">http://www.doxygen.org</a></li>
+ <li>Inkscape, <a href="http://www.inkscape.org" target="_top">http://www.inkscape.org</a></li>
+ <li>MinGW, <a href="http://mingw.org" target="_top">http://mingw.org</a></li>
+ <li>NVU, <a href="http://www.nvu.com/" target="_top">http://www.nvu.com</a></li>
+ <li>YAGARTO, <a href="http://www.yagarto.de" target="_top">http://www.yagarto.de</a></li>
+ </ul>
+ </td>
+ </tr>
+ </tbody>
+</table>
+
+</body></html> \ No newline at end of file
diff --git a/readme.txt b/readme.txt
index 561f1956a..cb8226b4b 100644
--- a/readme.txt
+++ b/readme.txt
@@ -49,6 +49,8 @@ AVR-AT90CANx-GCC - Port on AVR AT90CAN128, not complete yet.
It is recommended to either use ARM mode or THUMB mode and not mix them
unless you know exactly what you are doing and understand the consequences.
Mixing is still supported anyway.
+- More optimizations in the scheduler, an extra 4% performance found using
+ the default performance settings.
- Fixed a problem with the thread working area declarations, the alignment to
4 bytes boundary was not enforced. Now it is defined a new macro
WorkingArea(name, length) that takes care of both the allocation and the
diff --git a/src/chschd.c b/src/chschd.c
index 45b6c266c..7ad33d82f 100644
--- a/src/chschd.c
+++ b/src/chschd.c
@@ -26,11 +26,7 @@
/** @cond never*/
-static ReadyList rlist;
-
-#ifndef CH_CURRP_REGISTER_CACHE
-Thread *currp;
-#endif
+ReadyList rlist;
#ifdef CH_USE_SYSTEMTIME
volatile t_time stime;
diff --git a/src/include/scheduler.h b/src/include/scheduler.h
index c56773ee1..89bc37292 100644
--- a/src/include/scheduler.h
+++ b/src/include/scheduler.h
@@ -41,8 +41,13 @@ typedef struct {
ThreadsQueue r_queue;
t_prio r_prio;
t_cnt r_preempt;
+#ifndef CH_CURRP_REGISTER_CACHE
+ Thread *r_current;
+#endif
} ReadyList;
+extern ReadyList rlist;
+
/*
* Scheduler APIs.
*/
@@ -70,7 +75,7 @@ extern "C" {
#ifdef CH_CURRP_REGISTER_CACHE
register Thread *currp asm(CH_CURRP_REGISTER_CACHE);
#else
-extern Thread *currp;
+#define currp rlist.r_current
#endif
/**