Here's another idea. Implement your own background tasking system that allows you to create both timed tasks and demand tasks that run only when timed tasks are not running. It's not a true RTOS, but acts more like a cooperative scheduler. Convert a previous project to use the new tasking system.
This kind of system worked really well on a products we used to use on a 8051. It was originally written in assembly, but later on we converted it to C to help with porting it to other architectures. It was really slick where the heartbeat of the this system was on a 5 ms tick and the timed tasks ran on 5 ms increments. We had a file that we used to name all our tasks (function pointers) with their time values and those that were on demand. That file was then converted to either assembly or C depending on how we implemented it and compiled into the code.
If you get it working pretty well, then you can tackle writing your own simple RTOS for something a little heftier.