Current
Version 0.5.3
-
Project on SourceForge
Documentation
Downloads Wiki Forum
Contact me
-
History
Description Current ports
Design Performance and Size
Future
-
Credits
|
History
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 had a limited use.
Recently I decided to release this system, formerly known as mkRTOS, 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.
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 the feedback into the
product easily.
Description
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. The
system offers threads, semaphores, messages, events, virtual timers,
queues, I/O channels with timeout capability and much more.
Current
ports
Currently the ChibiOS/RT is ported to the following architectures:
- 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.
- Atmel AVR, the port is almost complete but untested because I broke my JTAG probe...
- 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.
- 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.
In general the port is very easy on architectures that can handle well
linked lists, the kernel is entirely reliant on 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.
Design
The system was designed to be stable and avoid trouble as much as
possible so some rules were set:
- 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 Documentation and
the demos.
- 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.
- 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.
- 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.
Performance and SizeChibiOS/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 starts at just
1.5KiB depending on the included subsystems and the choosen
compiler optimizations. As reference, a kernel configured with...
- System startup code
- Chip initialization code
- Multithreading APIs
- Virtual Timer APIs
- Semaphore APIs
- System time + Sleep API
- Suspend/Resume APIs
- Small main() program with flashing LEDs demo and 3 threads
...just takes 2.11KiB of program space when compiled using THUMB code and space optimizations. Note that this is quite a typical configuration
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.
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. 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.
Future
Expect:
- Documentation improvements.
- Ports to more architectures/boards when I am able to
put my hands on new hardware/tools.
- More demos.
- Creation of new subsystems.
- Integration with
existing other free projects like: TCP/IP stacks, File Systems etc.
Credits
ChibiOS/RT was created using:
|