Programming an embedded controller differs from writing programs, in general. Even if a common programming language, such as C, is used. This is because many embedded controllers do not have enough resources to have an operating system. This means there is no hardware abstraction from the perspective of an application program. Furthermore, the limited resources (especially the amount of RAM) also force programmers to rethink how to implement algorithms using the least amount of memory.
Due to the lack of an operating system, embedded system programming often needs to handle interrupts, I/O ports and other resources that are inaccessible in a desktop environment. This type of programming is special because symptoms of bugs are usually non-deterministic. The interaction between an interrupt service routine (ISR) and other parts of a program can present a challenge to people who are used to more traditional programming.