“According to experts, predictive maintenance will be the norm for virtually all rotating machinery within the next five to ten years. The rapid development of sensor technology and artificial intelligence is further accelerating this pace. The embedded systems connected to the Internet of Things (IoT) are placing increasingly complex demands on design. Those who develop well-thought-out requirements in advance and consistently refine the architecture with software design ensure software and product quality.
Placement in the development process
In the development process, software design is ordered according to the software-Requirements and architecture development and before implementation. Development today is incremental and iterative, not waterfall-like. Figuratively speaking, software design represents the bridge between architecture and implementation.
The system intelligence in IoT and Industry 4.0 products very often resides in the embedded software. Its complexity is currently increasing rapidly. Many companies have now recognized the necessity of embedded software requirements gathering and embedded software architecture development. The logical consequence: using software design to refine the software architect's results before implementation..

Fig. 1: Topics from embedded software design
Independent of C++ with an object-oriented approach
Object-oriented software supports positive software quality attributes such as extensibility, maintainability, portability, reusability, and much more. In object-oriented software development, you can program constructs such as classes, objects, associations, aggregation, composition, inheritance, and polymorphic interfaces not only in C++ but also in C.
Design principles help with clean code
Not least due to the growing popularity of the "Clean Code Developer" initiative in recent years, the topic of "developing high-quality software" remains highly relevant. Adhering to simple principles like DRY, KISS, SLA, SRP, and POLS helps developers write high-quality software.
Develop faster with design patterns
Design Patterns These are tried-and-tested solutions to recurring challenges in software development. The more design patterns you know, the faster your software development will go. Design patterns can be divided into generational, structural, and behavioral patterns.
Design patterns specifically for embedded software can be grouped into the following topics: functional safety, access security, reliability, hardware access, parallelization, resource access, and multicore.
Separate vending machine functionality from the application
Generic (universally valid) behavior in embedded software is very often designed and implemented using state machines. But how do I model (document) and implement the state machine?
The particular challenge in implementing this in C lies in strictly separating the automation functionality from the application. This approach significantly improves the software quality characteristics.
Operating system required
More complex software often offers the possibility of meaningfully (quasi-)parallel processing of tasks within the software. This is achieved by incorporating mechanisms such as multithreading, synchronization, and communication from an (embedded/real-time) operating system into the design.
When developing an IoT (Internet of Things) application, you are usually forced to use an operating system due to the integrated communication stacks.
Callback structures as the method of choice
To enable decoupled communication between software architecture elements, such as software layers, callback structures are often the preferred method. Various design and implementation approaches exist, including those with or without an operating system, object-oriented or procedural, and with or without polymorphism (static or dynamic).
Hardware driver concepts and interrupts
If you do not (want to or are not allowed to) use the drivers supplied by the silicon manufacturer or generated by tools, and your operating system does not provide I/O management, you also have the option of developing a driver and interrupt service concept that best meets your software requirements.
Refactoring
Not every developer has the opportunity to start from scratch with a completely new embedded software development project. Often, the focus is on maintaining and extending existing software that has matured and evolved over more than ten years. This makes significant changes difficult, as side effects inevitably arise.
If you decide against a fresh start, the software must be restructured step by step so that the side effects disappear or don't occur in the first place. Restructuring means optimizing planned projects on a small scale (with data, functions, classes, and objects) and, if necessary, adapting the software architecture on a larger scale.
Conclusion
Every embedded software developer must be aware of the high relevance of software design. This knowledge leads directly to improvements in software and, consequently, product quality.
This expertise qualifies you as an embedded software developer for the next step in your professional career. Take advantage of this opportunity and acquire the necessary specialist knowledge in the MicroConsult seminar „Embedded software design and patterns with C“.
Further information
MicroConsult Training & Coaching on Embedded and Real-Time Programming
MicroConsult Training & Coaching on the topic of software quality
MicroConsult Expertise in Embedded and Real-Time Software Development

