I am working as an embedded software engineer and I have often been asked this question of what does embedded software engineers do. I am writing this article to explain what we do, how we do it, varieties of embedded software, skills needed to do develop each kind, types of companies you get to work for and other relevant details you might find interesting to give you an insiders look into this profession.
What does an embedded software engineer do? Embedded software engineers develop software that runs on devices like microwave ovens, Xbox controllers, Blood pressure monitors, Bluetooth headphones, smartwatches, and other such devices that has custom hardware.
That’s the short version of the answer, Let’s get into a little more detail into the above-mentioned activities and in the end have a look at how a typical day of an embedded software developer will look like!
I have written a separate article on what embedded systems are, how they differ from regular computers and what are the different types of embedded systems in this article
Let’s have a look at some variations of embedded software engineer roles.
Types of embedded software
There are several types of embedded software and they can be broadly classified into the following types.
- Embedded Bare-metal software
- Embedded Linux Software
- Embedded RTOS software and
- Embedded Networking software
These different embedded softwares need a specific skill set to be an expert in. Big companies often hire engineers who are experts in one given skill set, while small companies need engineers who are the jack of all the above-mentioned trades!
Although each variety needs a unique set of skills, some skills are common to all. They include the following
- Good mastery of C and C++ programming
- Debugging skills using oscilloscope and logic analyzers
- Version management software like Git
Now let’s go ahead and take a brief look at each one.
Embedded Bare-metal software a.k.a. Embedded Software
This is the simplest type of embedded system which does its job without an operating system. All other types branched out of this one. Even though the entire software running on these systems look simple, they are actually the hardest to design. Since there is no operating system present here, everything needed by the application from drivers to schedulers must be designed and developed by the software engineering team.
It’s called bare metal because of the fact that the software we write runs directly on the chip by manipulating the control registers and reading the status registers.
Also since the entire code is written for the specific application, the resulting system will the much more responsive and efficient compared to the above-mentioned systems.
What are the skills needed to develop Embedded Bare-metal software? Developing Embedded Bare-metal Software requires a good understanding of
- microcontroller and its peripherals
- Ability to read data sheets and working with registers and manipulating bit-level data.
- assembly programming (used rarely but an understanding of how it works is very important.)
- System architecture
- Software engineering principles (as there is no Operating System to guide us to design around it, we must adhere to good software engineering principles of code modularity and data abstraction) and
- Processor architecture
Embedded Linux Software
Linux is famous among embedded engineers as it is an open-source operating system with a customizable kernel. This means anyone can make their own operating system to suit their particular needs by keeping just the necessary parts thus keeping the size small yet support their device’s functionality. Then on top of the kernel, they can make their own application code to make an embedded device!
Some famous examples of porting Linux to embedded devices include Raspberry Pi, Beagle Bone, and Jetson devices.
This reduces the development time and costs so much compared to building your own embedded operating system.
What are the specific skills needed to develop Embedded Linux software? Developing embedded Linux software needs knowledge about the following
- Linux kernel development
- Linux driver development
- Linux application development
- File systems
- Operating System concepts like Scheduling, Queues, power management, and memory management.
elinux.org a dedicated community for embedded Linux recommends getting these books to learn more about the development of embedded Linux.
- Embedded Linux System Design and Development by P. Raghavan, Amol Lad and Sriram Neelakandan, Auerbach Publication (link to amazon)
- Embedded Linux Primer, a practical, real-world approach by Christopher Hallinan, Prentice Hall PTR (link to amazon)
Embedded RTOS Software
What are real-time systems? Real-time systems act predictable (or deterministic) to events. Their main characteristic is the fact that they will react to events within the specified time constraints.
Let’s take a simple example of a computer keyboard to understand what real-time systems are. When you are typing something, you expect the letter to appear on the screen as soon as you type it. If the word comes in even with a 2-second delay then it is going to be a bad experience using your device for the end-user. So the time constraint here is a few milliseconds, which cannot be perceived by normal human senses so that the end-user will feel like the letter you just pressed magically appeared on the screen.
They are of 2 types of hard and soft real-time systems
Hard real-time systems are those that have a hard deadline, in other words, a late answer is a wrong answer.
For example, imagine an embedded device installed on a mars rover whose purpose is collision avoidance. In this case, if the rover is heading for an obstacle and the embedded system does not react in a timely manner and pull the brakes then it can result in damage to the rover which can, in turn, result in the catastrophic failure of the mission.
Soft real-time systems have a deadline that is not as firm as hard real-time systems. Here a late answer is an inaccurate answer but still useful.
The keyboard example we talked about in the beginning is a good example as even if the letters are delayed by a few more milliseconds it is still acceptable performance to the end-user.
Before we can learn about RTOS let’s take a moment to cover one more idea, that is multitasking.
What is multitasking? Operating Systems, in general, are used to support multitasking. Multitasking means running more than one thread on a single processor.
For example, consider this device:
- It senses the temperature in your room
- It updates the readings over wifi to your smartphone.
- It has an LED indicator that blinks once every 2 seconds if the temperature is above 20 degrees and blinks every second if the temperature is below 20 degrees
It has a single processor that needs to do all three tasks at the same time, in other words, it needs to do some multitasking. To give us the illusion that all three processes are running at the same time, operating systems use a scheduler to let the 3 processes to share the processor time. So sensor reading is taken in the first 5 milliseconds, in the next 10 milliseconds it is sent to your smartphone and in the next 5 milliseconds, the LED status is updated. This is done over and over again to make the end-user think that all 3 processes are running parallelly.
We use this multitasking feature every day whenever we use our smartphone to listen to music and use it to do some other activity at the same time. (Like I am doing right now, as I am listening to music while I am writing this article!) These processes are called threads in the PC world and Tasks in RTOS world but they refer to the same idea.
What is RTOS? RTOS stands for Real-Time Operating System. This type of operating system is specially designed for use in real-time systems. The main characteristic of this system is to execute code within the specified deadline.
What differentiates RTOS from other traditional operating systems is the implementation of Schedulers. Here the algorithm used for scheduling allows the end programmer to prioritize tasks, set a minimum time limit to respond to an event, and such control.
A famous example of this kind of system is freeRTOS.
What are the specific skills needed to develop Embedded RTOS software? A good understanding of RTOS principles like
- Task Management
- Heap memory management
- Queue Management
- Software timer management
- Interrupt Management and
- Resource management
I would suggest this free ebook from freertos.org if you want to learn more about RTOS development. It basically explains the API used with FreeRTOS along with some examples on how to use the API and the concepts needed to start developing using their Operating System.
Embedded Networking software
A major part of any embedded software is not generating data, it is rather to transfer data from one module to another, in other words, to make 2 modules talk to each other.
Networking is given a special category in embedded software because they involve a specific talent set that’s needed to develop and manage custom network stacks. Some examples of network stacks include Ethernet stack, wifi stack, and Bluetooth stack.
A good understanding of these stacks, in terms of how they work and a good understanding of network security, is important to develop devices that are robust, safe and secure
Examples of such devices can include smartwatches that connect to our devices via Bluetooth or wifi, Bluetooth headphones and speakers and other wearable techs.
What are the skills needed to develop Embedded Networking software? Developing embedded software on the network stacks need knowledge about the following.
- Basic Networking principles
- Network security principles
- Ethernet stack
- Wifi stack
- Bluetooth stack
- Zigbee and Zwave protocols for home automation
- ANT+ protocols for the health industry
- Networking devices like switches, routers, IDS, IPS, and firewalls
If you don’t have a college course on networking, I would suggest you go for industrial certifications like CompTIA Network+ as a way to get your basics strong in networking.
You can read more about networking certifications in this link
Type of companies you get to work for
Any company that produces electronic devices with a microcontroller is going to need embedded software to run on it. Be it airlines, automobiles, home appliances, smartphones, laptops, and medical devices, they all use microcontrollers in their end product and thus they need embedded developers. Some famous examples of such companies can include Nokia, Apple, Samsung, LG, and HP.
A typical week in the life of an embedded software engineer
An Embedded software developer’s week typically consists of the following main activities
- Team meetings to discuss the architecture of the next feature to be installed in the next release
- Coding down the discussed features
- Testing the new feature as new features will inevitably introduce bugs on the previously working features
- Some more discussions and debates on what caused the bugs and which is the best solution for the bug
- Fixing the bug and releasing the software
Description of an embedded software engineer’s life is incomplete without mentioning the type of tools they use regularly to accomplish all the jobs mentioned above. So let’s take a look at the tools used regularly by embedded software engineers in the next section.
What are the tools typically used for embedded software development? A typical toolkit of an embedded software engineer consists of the following software and hardware
- A good Text editor.
- A Cross compiler
- An Integrated Development Environment (IDE) software like Eclipse or Visual Studio
- Version management software like GIT
- Development boards
- Logic analyzers
Each has its own place in the toolchain.
For example, even though IDE can do text editing, software developers usually prefer a good text editor software. This is because every project uses a different IDE provided by the manufacturer and there is no point learning the keyboard shortcuts of each and every available IDEs. Another reason is the fact that IDEs tend to consume a lot of resources and hence will not feel as snappy a text editor.
There are several editors available online that cater to the specified needs of the developers. You can hear debates that last entire weeks on whose editor is the best, but in the end, it all comes to personal preference! Sublime, atom, visual code, Vim, and Emacs are some of the more famous text editors.
But this doesn’t mean IDEs are never used as they are excellent for Debugging with memory views and other device-specific details
Development boards provided by the microcontroller manufacturers are used during the initial phases of product development when our custom hardware is not yet ready.
Oscilloscopes and logic analyzers are invaluable when dealing with hardware bugs and cross compilers produce the code that will run on the target machine.
Hope you guys learned something through this post and hope it was useful to you guys.
If you liked the post, feel free to share this post with your friends and colleagues!