Arduino + FreeRTOS + C++ = Platform for Teaching Real-Time Software Design

I should add that two things I've seen really increase the complexity of any embedded system: [1] a memory management unit, and [2] a file system. Once you have either of those, you've entered a much more complicated realm of system architecture and design. I'm not saying they're bad ideas. But once you have them, you're going to really want an OS of some kind and work at a higher level of abstraction.