The role of an embedded software engineer involves writing code for systems with hardware and software components.
Such systems referred to as embedded systems are a combination of electronic hardware designed for a particular purpose and the software, which drives its functionality.
Due to the role involving working with hardware components, there are some core embedded software engineer skills that are distinct from other fields of software development.
Embedded software engineer skills include a solid understanding of programming languages optimised for embedded systems such as C, C++ and Assembly. Understanding of both hardware and software systems is also crucial for the work of embedded software engineers.
While embedded software engineers typically focus on the activity of writing code for these devices, an understanding of hardware is also important. Several embedded software engineer skills surround understanding of hardware and software and how to distinguish the boundaries between them.
In a previous post we outlined a starting guide on how to be an embedded software engineer. In this post we’ll further breakdown some fundamental embedded software engineer skills.
This list will provide some core embedded software engineer skills to strive for when starting out in the field or to improve your proficiency working with embedded systems.
- 1. Learn embedded programming languages
- 2. Get comfortable working with hexadecimal and binary
- 3. Grasp the fundamentals of schematics and PCB design
- 4. Gain knowledge of embedded communication protocols
- 5. Know how to use instrumentation
- 6. Understand the challenges of firmware development
- 7. Recognise the importance of teamwork
- 8. Diversify and don’t be afraid to learn new things
1. Learn embedded programming languages
The ability to write code for embedded platforms is of course a core requirement for any embedded engineer focusing on the activity of software development. It’s therefore essential to have knowledge of languages optimised for embedded systems.
The main languages used in developing embedded systems are C, C++ and Assembly.
In a growing number of cases Python is also being used as part of the process in developing embedded software or to run directly on the system itself for platforms that support Python.
Assembly is the ‘lowest level’ language of these options, which means it runs very close to the hardware layer of the device. While Assembly is still very relevant today, it will only be the language of choice for engineers that work on compilers, optimisers or in the development of hardware platforms with highly limited resources.
While the language used will vary by platform, a typical embedded software engineer nowadays is likely using C or C++ to develop embedded applications.
So a fundamental and essential embedded software engineer skill is having the ability to write code in any or a combination of these languages.
2. Get comfortable working with hexadecimal and binary
When writing software for embedded systems one needs to be familiar with the numerical systems for hexadecimal (base16) and binary (base2).
This is an essential embedded software engineer skill as the process of writing code for embedded platforms involves manipulation of hexadecimal and binary.
This is especially the case if you’re working with low-bit microprocessors (e.g. 8/16-bit) where you’ll likely be manipulating register values down to the bit level.
For a real example where hexadecimal manipulation comes into play, take a device using a 16-bit microprocessor that exchanges data with other components. Due to the limited resource and capability of the 16-bit processor data will be exchanged in hexadecimal values.
This is in contrast to, say, platforms running operating systems where data can easily be exchanged in readable format such as JSON or plain text format. For such systems working with hexadecimal is not as crucial.
For these reasons a fundamental embedded software engineer skill is the ability to work with binary to some level and make sense of hexadecimal characters and translate them to meaningful data.
3. Grasp the fundamentals of schematics and PCB design
As an embedded software engineer you’ll be writing software for electronic devices. This will require some level of understanding of circuits and how electronic components work when put together.
Schematics are drawings representing the physical connection of an electronic circuit. Schematics are used to design PCB (Printed Circuit Board) layouts which represent the physical design of the circuit. Design files of the PCB layout are used to manufacture the circuit board.
The ability to read schematics is an essential embedded software engineer skill and having some understanding of PCB layouts will also be beneficial.
The best way to understand the basics of schematics and PCB layouts is to do one yourself.
Install an EDA (Electronic Design Automation) software (e.g. KiCAD, EasyEDA, DesignSpark), and design a circuit from drawing out the schematic and laying out the PCB. Send the PCB for manufacture and test the board when you receive it.
While hardware design is not an activity you’ll be doing often if your focus is on software, it’s still highly beneficial to know the process involved in PCB design to become a more rounded embedded engineer.
4. Gain knowledge of embedded communication protocols
Communication protocols are sets of rules that allow systems to exchange information between each other.
When developing for embedded systems, communication protocols are used to exchange data between components on a circuit board or to communicate to an entirely separate system.
There are several communication interfaces you’ll come across often when working with embedded systems. Some of these include UART/USART, SPI, I2C, LIN, CAN, USB and Modbus. Each of these interfaces have their own protocol that must be followed to enable exchange of data over that interface.
The capabilities of the embedded platform will determine which communication interfaces are available. The type of application in development will also highly influence which protocols are suitable for use as some applications may require interfaces to meet certain criteria such as higher communication speeds and reliability.
It’s essential to know how to work with the communication interfaces available for the system you’re working with.
As the available communication interfaces varies from system to system, knowing how to work with several of these protocols is a useful embedded software engineer skill to acquire.
5. Know how to use instrumentation
Instrumentation refers to equipment and tools that are used to analyse, measure or record information from a system.
In the context of developing embedded software, instrumentation can be any equipment, tool, kit or application that assists you in studying and debugging the system you’re working on.
Examples of instrumentation used by embedded software engineers include: in-circuit debuggers, debug headers, multimeters, oscilloscopes, logic analysers or even your version control system.
As embedded systems are made up of hardware and software components, anything can be at fault with either side. Hence, embedded engineers must learn to use instrumentation to analyse both hardware and software.
When you realise something is wrong with the system, you’ll surely be reaching out for one of these to help figure out the problem.
Knowing how to use instrumentation effectively will allow you to become more efficient at gathering the information you need, thus speeding up the development and debugging process.
6. Understand the challenges of firmware development
As an embedded engineer, it’s useful to be aware of the types of embedded applications out there and know how to adapt to working with them.
Let’s say you work in a role where you can find yourself working with many types of embedded applications. Maybe your last project was to write code for an 8-bit processor used in a TV remote and your next one will be to work with a 32-bit processor for an IoT application.
In this scenario, when working with the 8-bit processor, you likely paid attention to memory resources and power management. While developing the IoT application will require you to pay attention to latency and system security.
Each type of embedded system has its own set of challenges and being aware of different types will allow you to work with a wide range of applications.
The mindset of being aware of the limitations of the available hardware is what separates developing embedded firmware from developing ‘high-level’ software applications (desktop, mobile apps, web apps etc..).
A solid embedded software engineer skill is to understand limitations of hardware platforms and grow your ability to work around challenges associated with them.
7. Recognise the importance of teamwork
Another crucial embedded software engineer skill is the ability to work within a team. It’s unlikely you’ll find yourself (or be able to) develop all components of an embedded system without working with others.
Embedded devices are often referred to as systems because they require many components to work together. These components at minimum will involve hardware and software. And depending on the type of application it may also involve other types such as mechanical or chemical components.
Depending on the type of application you work with, this means you can find yourself working with hardware engineers, software engineers, mechanical engineers, chemical engineers and so on.
When something goes wrong with the system, there are many parts to study and expertise from each side will be required to pinpoint the problem.
In order for these systems to come together and work as intended, it requires nothing short of teamwork!
You’ll also need to work with non-technical staff and stakeholders. The ability to convey information to people with a non-technical background is an important skill to develop early in your career.
You’ll have to learn to take the perspective of other people you work into account with even though you might not completely understand the technicalities of what they do or the decisions they make.
Teamwork is a core skill for any career, and it’s no different for embedded engineers.
8. Diversify and don’t be afraid to learn new things
The word ‘embedded system’ can be an arbitrary term as there are countless different forms of embedded systems. Virtually any electronic device we find these days is an embedded system.
This provides countless opportunities in what an embedded engineer can work with. If you enjoy diversity you don’t have to limit yourself to just one field or area of specialisation!
This keeps things interesting as there’s always something new to be learned. You can find yourself working with a different microprocessor for each project. Diversity allows you to grow knowledge and understanding of various systems and will provide flexibility in the fields you can work with.
And as with anyone working in technology, due to the rapid changing nature of the industry it’s also important to have a willingness to learn new things. Be ready at any time to adapt if the market shifts towards new technologies and ways of doing things.
Working with a diverse range of applications and a passion for learning is therefore an important embedded software engineer skill to desire.
We covered some fundamental embedded software engineer skills relevant to anyone involved with embedded systems.
These points will give you a good overview of what it takes to be an embedded software engineer if you’re curious about getting into the industry.
And if you’re already in the industry, take note and plan these into your personal or career development plan!
What other essential and fundamental embedded software engineer skills do you believe are crucial to have? Let us know in the comments.
Checkout other related articles: