Programming for embedded systems has come a long way. The first firmware was typically hand-coded machine language, often created by the same engineer that designed the hardware. This was entirely appropriate, given that this firmware was seen as a cheaper way to replace discrete hardware logic.

If you fast-forward to the present the situation is quite different. The software and firmware for current embedded systems is now typically a sophisticated set of control systems that is handling multiple functions simultaneously. Most of the programmers working in this environment rarely even see the actual instruction op codes, much less program in them. This kind of programming requires more advanced capability for control of this software, and a major tool in achieving that control is a good multitasking Real-time Operating System (RTOS).