Topics you should learn in embedded software development

Tobias Aguiar
4 min readNov 16, 2022

--

Hi everyone! Before I start this discussion, for those who don’t know me, here’s a quick introduction:

My name is Tobias and I am a Junior Embedded Software Engineer working in France. Pleasure to meet you!

I’ve decided to start my journey as a writer for the following reasons :
Well, I learn more when I put my ideas out of my head, when I try to teach them or when I share my experience, so why not also share what I am learning. I think that’s how we grow, isn’t it? And in case you don’t agree, you can always add your input. Without further ado, let’s get to the point!

1. C Programming

When we enter college, one of the first things we study as an engineering student is programming, and it is not by accident. But have you ever thought why C program is widely used in embedded programming?
There are a few reasons I can name, among others : portability (it can be run in different platforms) and performance (optimized machine instructions, which can be useful in applications with real time
constraints).

It seems obvious, but it is always good to remember. However, just knowing how to solve some C puzzles is not enough, even if it’s the advanced ones…
As embedded program involves making software with very few hardware resources, it’s imperative for it to be optimal. But what do I mean by that? It means you should know how many bytes each kind of
variable makes use in the memory, know what the C keywords are, when you should use them (const, volatile, extern, aligned, etc.), and know pointers manipulation.
Such level can only be achieved by getting experience on your own projects or in professional experiences like jobs and internships.

1.2 ASM Programming

The assembly language is the closest human readable machine language that exists and it is architecture dependent and it is still used even if in smaller proportions. if you take a close look at the Linux Operating Systems source code, you can see that some parts are coded in assembly. Its use is
interesting when you are building software with direct access to the hardware, with applications such as device drivers development.

2. Digital and analog electronics

Nowadays, it doesn’t really matter how complex the processing unit design architecture is, when we dig deep we encounter the same pieces of hardware : registers, counters, and memories.

These pieces are all built with basic digital logic : flip-flops, encoders, decoders, adders, sub-tractor and so on. So, together with programming, digital logic is one of the most important fields to study if you want to get in embedded software development. Another one is the analog electronics, because the data you may need to process from a sensor, for example, comes first from the analog world, and you need to know, at least, analog to digital conversion and vice-versa, in order to properly process with your processor.

3. Computer architecture

Well, I’m not saying you need to know about circuit design or know fabrication technology by heart, but knowing computer architecture is important for embedded software development, even more if you are
working in low-level programming. In order to to optimize your chances to make an embedded software work, you should have some basic knowledge on :

- Memory addressing
- Arithmetics
- ISA (Instruction Set Architecture)

We can’t forget that embedded software is about building software to run in another machine than your computer, which has a different architecture, so knowing at least a little bit about it should make your life easier.

4. Operating systems

You should know that the hardware itself has some complexities, and the Operating Systems are the piece of software capable of hiding it and giving it an abstractions to such complexities. When your embedded application increases in complexity, in order to manage all its resources (memory, CPU, peripherals) in an optimal way, you’re going to make use of an Operating Systems (OS). You’re gonna be using a real time one, if you are using a micro-controller, or a general purpose OS if you are using an application processor.

You should be familiar with the following concepts :

- Process
- Threads
- IPC (Inter Process Communication)
- Memory management

So get to reading!

5. Compiler design

To improve performance with limited resources, you should also have a basic understanding about compilers. If you know how a high-level language is translated to a low-level language, this can affect the
way you code. It means you will be able to make better choices of data structures and algorithms.

Moreover, you have the toolchain that you use to be able to cross compile, i.e. compile a code to a different machine architecture, your code to run in your specific machine.

Conclusion

Each topic mentioned here, when learned and implemented, changes your way to code. Therefore, they increase your value as a software engineer. This is because if you really put the effort to learn those complex and abstract concepts, you can then have an end-to-end macro view of a system. And, with a good understanding of those (specify what is those), you will likely make better decisions in your code as well as in the project in general.

Of course there are more topics than the ones I mentioned here, depending on the field you’re going to work, you might need to know concepts as control systems, network theory, signal processing and so on…

These topics I presented are just the general concepts I think you should know, no matter the field you want to specialize in later in your career.

I hope you find the lecture useful for you as I truly enjoyed writing it. If I missed anything or you see that any correction is needed, do not hesitate to give me your feedback.

Happy coding!

--

--

Tobias Aguiar

Software developer | Trying to make complex concepts look easy | Want help or discuss about embedded software development? Email me! tobi.aguiar01@gmail.com