Modern Embedded Software Development

2025 07 01 head

Modern embedded systems have a multicore processor with a 64-bit architecture, huge RAM, and flash resources. The cost of a simple core is in the area of one Euro.

The complexity of embedded applications is increasing. You must support complex protocols such as CANopen, Ethernet, Bluetooth, and USB.

Industrial standards such as functional safety or FDA recommendations are quite challenging to realize.

You have find out good embedded software engineers are difficult to find and hire.

What are modern software architecture and design approaches suitable for such endeavors?

Which technology stacks and programming languages should we use to build evolvable and maintainable products?

Are talented embedded software engineers attracted to work with these practices?

I try to provide pointers for good practices. I am mainly working for small and medium industrial companies in Switzerland and Europe. Sold items of a specific product are in the range of hundreds up to the low range of thousands. Therefore, the presented approaches and techniques are tailored for this kind of digital products.

Modern embedded software development has multiple dimensions you should consider.

Embedded Concepts

Modern embedded solutions should be message-based communication actors. Do not use blocking synchronization primitives to implement multithreaded applications if you want to avoid potential deadlock, livelock and starvation problems.+

I strongly recommend using a realtime operating system and C++ as your programming language.

  • Asynchronous distributed systems [2]

  • Modern embedded system [4]

  • Logging [5]

Architecture

Use domain-driven design approach to design an embedded solution [1, 2, 3]. This approach is current good software architecture practice. It maps nicely to the embedded problem space. Technical agility is applied to create a maintainable product.

  • Agile software architecture [1] and asynchronous distributed systems [2]

  • Domain driven design for embedded application [3] and software structure with DDD [14]

  • Document agile architecture [6]

  • Agile code is clean code [7]

Development Environment

Continuous delivery is a proven environment to frequently deliver product increments. The approach fosters stable deliveries and working new functionalities.

  • First steps DevOps [8]

  • Self hosted development environment [10]

Development Process

Agile development approaches are currently the best solution to deliver digital products. Scrum is the industrial standard. We recommend LeSS for big development initiatives [1].

Lessons Learnt

You were just promoted to senior designer of a team. Which principles should you advocate for?

A powerful recipe to design evolvable digital products is:

How should you design your application?

  • Modern C++ is the preferred programming language. The source code is object-oriented.

  • A realtime operating system RTOS provides scheduling and concurrent processing.

  • The communication uses asynchronous message passing. Messages are immutable value objects.

  • Thread logic is realized as a finite state machine.

How should you document your selected architecture?

  • Follow the recommendations of arc42 approach for document structure and content.

  • Graphical modelization is done with C4 Model and UML.

  • Documents will be written in Asciidoc. Documentation language is English. Documentation is published as a static website.

  • API will be documented with Doxygen.

References

[1] E. Evans, Domain-driven design. Addison-Wesley, 2004 [Online]. Available: https://www.amazon.com/dp/0321125215

[2] V. Vernon, Implementing Domain driven Design. Addison-Wesley Professional, 2012 [Online]. Available: https://www.amazon.com/dp/B00BCLEBN8

[3] V. Vernon, Domain-Driven Design Distilled. Addison-Wesley Professional, 2016 [Online]. Available: https://www.amazon.com/dp/B01JJSGE5S/


1. Big development initiatives are seldom in the embedded world. Few companies have development groups of thirty or more people working on one product.