It’s ready the bundle in which you can program your Arduino apps using the FreeRTOS kernel. You can download it from
From the README.txt file:
The Molcajete project by Xavier R
The aim of this project is to program Arduino apps using the world’s most
downloded real time kernel, FreeRTOS, in a terminal through Arduino-mk
In fact, this project is kind of a FreeRTOS port for the ATMEGA328 chip
so that it can be used in the Arduino platform. The client of this project
MUST provide the several hooks that FreeRTOS needs to run. It’s assumed
that the client has knowledged of what FreeRTOS is about, and in general,
what a kernel is, and why and how it’s used.
Two examples are provided: The classical one that implements two tasks in a
dynamic fashion in order to test the system. The other example does the same
but with static tasks.
This port uses the standard malloc and free implementations for AVR when using
dynamic tasks. For reliable embedded systems it’s recommended not to abuse in
the creation and deletion of tasks in the heap. If the client chooses this way
it’s recommended to create all tasks at once at the global space and to avoid
any task deletion. Even better if static tasks are used as they are already
enabled in the kernel (since FreeRTOS 9).
The system tick is fixed at 1 millisecond after the AVR’s T0 timer. Tickless
and/or low-power modes have not been tested yet.
Sketches are not provided for now. Everything is done in a console.
For now this project only works on 64 bits Linux boxes. Later I’ll try to
create a patch file so you can apply it to your already Arduino installation.
Two files need to be edited in order to configure each project:
1) Makefile. There is one makefile per project. In this the client configures
stuff related to Arduino.
2) FreeRTOSconfig.h. There is one FreeRTOS configuration file for ALL
projects. In this the client configures stuff related to FreeRTOS. Having one
global FreeRTOS configuration file is a bad idea. However, due to my lack of
knowledge about paths and makefiles, this undesired behavior is all I have by
now. Hope to fix it ASAP.
The stack size assigned to each task depends on many factors. FreeRTOS
includes some schemes so that the client can choose the number that fits the most
each project’s tasks. Such a number can also be chosen by heart, provided a
good understanding of the task’s job.
As mentioned earlier, the RAM should be asked for and given globally at the very
start of the application. This is also true for static tasks. If dynamic tasks
are used, then it’s recommended not to delete them; the heap might fragment
and such situation isn’t good for reliable embedded systems.
Priority levels in FreeRTOS are implemented using a linked list. The more the
priority levels, the more RAM it uses and more time is spent looking for the
next task. Some projects use one priority level per task, while others share a
priority level among several tasks. It depends totally on the project
I’ve written an article on how three priority levels fulfill the needs
for a small systems using event-driven programming. The article can be reached
Some hook functions might be required for each project. The client MUST provide
them. The number of hook functions, if some, depends on the FreeRTOS
Some files were modified in order that Arduino can use FreeRTOS. If you are
interested in study them, these are the files:
I’ve modified a little bit the optiboot bootloader, and this change is included
in the bundle. If you don’t use it, then you have nothing to worry about.
If you’re planning to burn the bootloader into your chips, you might want to
check my modifications.
Each entity in this project might have its own licensing scheme. For details
As per my little contribution, the GPL license is enough.
All contributions are welcome: examples, sketches, testing in boards other
than UNO or Leonardo, testing in OSs other than Linux, etc. I’m NOT asking for
money. I’ve done this little contribution due to my love for embedded systems
and my beliefs on the open source and open hardware movement.
You can reach me at fjrg76 at hotmail dot com.