Embedded software is specialized software - controlling devices or machines. Typically these devices do not have normal screen and keyboard, although often they will have some kind of buttons and maybe a small screen and/or LEDs.
The embedded software is used in customized products - ranging from the size of a button to a five-story high diesel engine in a ship. I discuss the level of this customization - as well as the many parameters involved when doing designs - in my book Embedded Software for the IoT where the below picture is found:
Whereas most PC-programmers are not really aware of the internals of their computer, most embedded programmers need to understand many details of the inner workings. This is demonstrated with the figure below from my latest book - Microcontrollers with C
.A typical embedded developer is a "Jack of all trades". On top of the domain-knowledge (automotive, audio, medical etc) they need to understand hardware and how to control it - like:
- Digital I/O-ports - used as bytes or bits, with or without "open-collector", "tri-state" or similar concepts
- Intra-board communication interfaces like SPI and I2C - sometimes even Ethernet and USB, or specialized audio buses
- Inter-board communication interfaces like Ethernet, USB, and PCI
- Networking - including Wi-Fi, BLE and others - see Networks and it's sub-pages
- Peripherals (sometimes internal) chips like ADC, DAC, battery gauge, GPS and many more
- Clocking and Timing - sometimes downto clock-domains
- Memory-types and types of memory-access - see OS Challenges
- Operating Systems and Real-Time Operating Systems - see e.g. Zephyr - including interrupt control
- Power Management - turning on and off parts of the system, and saving cycles in general
- Security - hashes, signing, certificates, handshakes and much more - see Cyber Security
- General software patterns as in the PC-world - but also when to not use these for e.g., power-reasons - see Performance
When it comes to building software, most PC-programmers can simply press the "Build"-button in Visual Studio. Embedded programmers know that you have a compiler, assembler and linker working together to build your system - as seen in the figure below. The program needs to be downloaded - typically also flashed - and at least someone in the team needs to know what happens next before the program is ready to execute the first instruction in "main".
This is also described in Microcontrollers with C.What happens in the program after the initial phases can be divided in two parts:
- The "introspective" part - handling buttons, LEDs, interrupts, clocks and much more - described in Microcontrollers with C
- The "extrospective" part - talking to servers over the internet - described in Embedded Software for the IoT
Please note that "introspective" and "extrospective" are not normally words used in the embedded software domain - they simply serve a purpose here.
I have a page on toolchains and another on embedded trends.