The demand for embedded systems software engineers is higher than ever. Here are some skills and proficiencies you should look for to make sure you hire the best talent.
I have had the opportunity to interview and hire many embedded software engineers in my 20-year career in the industry. Hiring a software engineer to work on embedded systems is in my mind, significantly different than hiring a software engineer to work on application programs. In order to understand the difference, I think it would be beneficial to first define what I believe to be an embedded systems software engineer.
An embedded system by definition is a “system” embedded within a device. The device may be a mobile phone, wireless router, remote control or a washing machine. This system will generally consist of a control system made up of some form of input sensor system, an output actuator and an electronic control mechanism. Typically, the control would be governed by some type of micro-controller with associated circuitry.
An embedded systems software engineer would be an engineer who would design, develop and maintain the software that would run on the micro-controller within the embedded system. Depending on the complexity of the control algorithm, diagnostics and communication interfaces, the software involved may be very simple or highly complicated. As an example, the embedded system within a color changing light switch would simply detect the switch activation selecting the color and activate the appropriate color LED. In this case, the embedded software would be relatively simple and compact. On the other hand, a cell phone is a highly complex embedded system with multiple controls, inputs and outputs. This requires a multi-layered formal software platform.
So, what does it take to be an embedded software engineer? Here are some of the areas I think a good embedded software engineer should be adept at and focusing on:
Think Like a Systems Engineer: It is essential for embedded software engineers to have a systems orientation. Being able to visualize the project as a system, knowing the limitations of the hardware, packaging and mechanical limits will allow for better software design. Understanding of a formal product development life cycle, whether it is a waterfall model or a more Agile process is also crucial as it accounts for safe design practices such as requirements management, formal verification and also compliance with many of the standards that govern embedded systems in regulated environments.
Understanding Hardware: A good embedded software engineer has to understand hardware, primarily the micro-controller and associated peripherals. Knowing how a micro-controller executes code and how the peripherals such as communication buses and inputs/outputs function is key to being able to write efficient embedded code.
Working with Constraints: Typical application programmers can write code to do many different things and structure it to be layered and organized on a standardized platform. They do not have to worry about how much hardware resources they are using for their application because on PC-based systems, memory and CPU bandwidth are ample. On a typical embedded system, where cost may be a limiting factor, resources such as memory and CPU speed may be drastically limited. A good embedded software engineer then needs to know how to cope with such constraints. Knowledge of how much RAM, ROM and CPU cycles are required for a function needs to be understood and planned for when designing. Budgeting resources for functions, tracking memory usage and writing efficient and tight code that reduces CPU cycles are all required for good embedded programs.
Programming in C: Most embedded systems are programmed in what is considered one of the most efficient programming languages – C. Embedded software engineers need to have solid C programming capabilities. Recent trends have led to a more object oriented approach that would require knowledge of C++ concepts but at the core, basic C programming capability should suffice for a successful embedded software engineer.
State Machine Design: Software design can be linear, as in a flowchart of instructions in a single “thread” of operation, or can be made to be multi-threaded “state machines.” While single threaded flow would work for simple applications, more complicated features would need parallel activity. This is where state machine design comes into play. Features or functions can be defined as state machines in which each feature will always exist in one of its defined states and then transition between states based on different stimuli. Understanding state machine design is critical for embedded programmers as this method will best accommodate efficient sharing and tracking of critical resources.
Understanding Interrupts: No embedded systems can be designed without using interrupts. It is absolutely critical that the software engineer understand interrupts and how they work because we have to design and write code that would be able to function as intended even if the flow is interrupted at any time by another higher priority process or task.
The embedded systems space is continuously changing with new technology, faster processors, cheaper solutions and standardized platforms. With that being said, how do you make sure the skills you have are the most relevant? Here are some of the areas that it would be good to keep up with or add to your skill set if you are an embedded engineer.
Internet is the Future: Learning the technologies that enable the Internet will definitely help an engineer’s career. The Internet of Things (IoT) is the next big boom in technology and staying abreast with the latest advances in sensors, actuators and cloud infrastructure is quickly becoming a necessity for most embedded engineers.
Real Time Operating Systems: Engineers who learn a formal structured development processes while working with a real time operating system (RTOS) are in high demand. They have acquired the necessary discipline to develop any kind of safety-critical product and they also understand the idea of concurrency. In short, they know how to protect resources from other tasks using the service unexpectedly, while maintaining performance. There are many commercial and open source RTOS’s in the market that can be used to develop the capability.
Wireless Connectivity: Wireless is the future of technology. There are various wireless protocol stacks such as Wi-Fi and Bluetooth Low Energy (BLE) in the market to suit different needs for speed, distance and data bandwidth. Understanding these protocols and being able to decipher and design with them is necessary in this emerging connected world.
As embedded applications become more and more complex, the separation between embedded programmers and application programmers is rapidly closing. Technology improvements are making microprocessors faster, smaller and cheaper, such that resource constraints are slowly disappearing. Soon standardized platforms similar to PC operating systems will run on very small devices, in fact with Android, it is already happening. Engineers will no longer need to pay attention to attributes such as CPU bandwidth and RAM/ROM sizes – embedded skills as we know them today may not be needed.
However, a solid understanding of the basics will still enable you to keep up with improvements and learn faster because at the very core of it, it all comes down to two bits – 0 and 1.