๐—ช๐—ต๐˜† ๐—˜๐—บ๐—ฏ๐—ฒ๐—ฑ๐—ฑ๐—ฒ๐—ฑ ๐—ฆ๐˜†๐˜€๐˜๐—ฒ๐—บ๐˜€ ๐—ก๐—ฒ๐—ฒ๐—ฑ ๐—•๐—ฒ๐˜๐˜๐—ฒ๐—ฟ ๐—”๐—ฝ๐—ฝ๐—น๐—ถ๐—ฐ๐—ฎ๐˜๐—ถ๐—ผ๐—ป ๐—Ÿ๐—ฎ๐˜†๐—ฒ๐—ฟ ๐——๐—ฒ๐˜€๐—ถ๐—ด๐—ป

๐—ช๐—ต๐˜† ๐—˜๐—บ๐—ฏ๐—ฒ๐—ฑ๐—ฑ๐—ฒ๐—ฑ ๐—ฆ๐˜†๐˜€๐˜๐—ฒ๐—บ๐˜€ ๐—ก๐—ฒ๐—ฒ๐—ฑ ๐—•๐—ฒ๐˜๐˜๐—ฒ๐—ฟ ๐—”๐—ฝ๐—ฝ๐—น๐—ถ๐—ฐ๐—ฎ๐˜๐—ถ๐—ผ๐—ป ๐—Ÿ๐—ฎ๐˜†๐—ฒ๐—ฟ ๐——๐—ฒ๐˜€๐—ถ๐—ด๐—ป

In the world of embedded systems, engineers ๐™ก๐™ค๐™ซ๐™š digging into the low-level stuff: writing device drivers, setting up board support packages, configuring RTOSs. Thatโ€™s the exciting, โ€œclose to the metalโ€ work.

But hereโ€™s the thingโ€ฆ

๐—ง๐—ต๐—ฒ ๐—ฟ๐—ฒ๐—ฎ๐—น ๐—บ๐—ฎ๐—ด๐—ถ๐—ฐ - ๐˜„๐—ต๐—ฎ๐˜ ๐˜๐—ต๐—ฒ ๐—ฒ๐—ป๐—ฑ-๐˜‚๐˜€๐—ฒ๐—ฟ ๐˜ƒ๐—ฎ๐—น๐˜‚๐—ฒ๐˜€ - ๐—น๐—ถ๐˜ƒ๐—ฒ๐˜€ ๐—ถ๐—ป ๐˜๐—ต๐—ฒ ๐—ฎ๐—ฝ๐—ฝ๐—น๐—ถ๐—ฐ๐—ฎ๐˜๐—ถ๐—ผ๐—ป ๐—น๐—ฎ๐˜†๐—ฒ๐—ฟ. And too often, its an afterthought.

๐Ÿงฑ ๐—ง๐—ต๐—ฒ ๐—Ÿ๐—ผ๐˜„-๐—Ÿ๐—ฒ๐˜ƒ๐—ฒ๐—น ๐—•๐—ถ๐—ฎ๐˜€ Embedded Engineers are trained to think in terms of:

  • Startup code
  • Peripherals, interrupts, and timers
  • Optimizing for bytes and cycles

Thatโ€™s critical work. But if we ignore the ๐—ฎ๐—ฝ๐—ฝ๐—น๐—ถ๐—ฐ๐—ฎ๐˜๐—ถ๐—ผ๐—ป ๐—น๐—ฎ๐˜†๐—ฒ๐—ฟ, we risk building systems that are brittle, hard to maintain, and painful to scale.

๐ŸŽฏ ๐—ช๐—ต๐˜† ๐˜๐—ต๐—ฒ ๐—”๐—ฝ๐—ฝ๐—น๐—ถ๐—ฐ๐—ฎ๐˜๐—ถ๐—ผ๐—ป ๐—Ÿ๐—ฎ๐˜†๐—ฒ๐—ฟ ๐— ๐—ฎ๐˜๐˜๐—ฒ๐—ฟ๐˜€ The application layer defines the ๐™—๐™š๐™๐™–๐™ซ๐™ž๐™ค๐™ง of your product. Itโ€™s where:

  • User interaction
  • Business rules
  • Safety, reliability, and communication

With modern devices, app-layer complexity is rising โ€” and demands better design.

๐Ÿง  ๐—•๐—ผ๐—ฟ๐—ฟ๐—ผ๐˜„๐—ถ๐—ป๐—ด ๐—ณ๐—ฟ๐—ผ๐—บ ๐——๐—ฒ๐˜€๐—ธ๐˜๐—ผ๐—ฝ, ๐— ๐—ผ๐—ฏ๐—ถ๐—น๐—ฒ ๐—ฎ๐—ป๐—ฑ ๐—˜๐—ป๐˜๐—ฒ๐—ฟ๐—ฝ๐—ฟ๐—ถ๐˜€๐—ฒ ๐—ฆ๐—ผ๐—ณ๐˜๐˜„๐—ฎ๐—ฟ๐—ฒ We donโ€™t need to reinvent the wheel. Established software patterns can apply beautifully to embedded systems:

โ€ข Layered Architecture โ†’ HAL โ†’ Middleware โ†’ Application

โ€ข MVC / MVVM โ†’ State machine + HMI (UI logic separated from behavior)

โ€ข Observer Pattern โ†’ publish-subscribe for inter-task messaging

โ€ข Dependency Injection โ†’ Configuration-driven initialization for decoupling and testability

โ€ข Command Pattern โ†’ Queueing or scheduling actions based on external or internal events

Frameworks like Quantum Leaps QP, FreeRTOS, and even lightweight C++ libraries help bring these ideas to life.

๐Ÿšง ๐—ช๐—ต๐—ฎ๐˜โ€™๐˜€ ๐—›๐—ผ๐—น๐—ฑ๐—ถ๐—ป๐—ด ๐—จ๐˜€ ๐—•๐—ฎ๐—ฐ๐—ธ?

  • Perceived simplicity of application logic
  • Fear of overhead (often unfounded with good design)
  • Lack of exposure to modern software practices

๐Ÿ”ง ๐—Ÿ๐—ฒ๐˜โ€™๐˜€ ๐—™๐—ถ๐˜… ๐—ง๐—ต๐—ฎ๐˜ To improve embedded software application design, we need to:

  • Teach architecture and patterns in embedded education
  • Model system behavior with statecharts/UML
  • Collaborate across disciplines โ€” bring in ideas from desktop, mobile, and web development

๐Ÿ ๐—™๐—ถ๐—ป๐—ฎ๐—น ๐—ง๐—ต๐—ผ๐˜‚๐—ด๐—ต๐˜ The application layer is ๐™ฃ๐™ค๐™ฉ the easy part. Itโ€™s the part that defines your product. Letโ€™s treat it like a first-class citizen.

๐—ช๐—ต๐—ฎ๐˜โ€™๐˜€ ๐˜„๐—ผ๐—ฟ๐—ธ๐—ฒ๐—ฑ ๐—ณ๐—ผ๐—ฟ ๐˜†๐—ผ๐˜‚? ๐—œโ€™๐—ฑ ๐—น๐—ผ๐˜ƒ๐—ฒ ๐˜๐—ผ ๐—ต๐—ฒ๐—ฎ๐—ฟ ๐—ถ๐—ป ๐˜๐—ต๐—ฒ ๐—ฐ๐—ผ๐—บ๐—บ๐—ฒ๐—ป๐˜๐˜€. ๐Ÿ‘‡

#EmbeddedSystems #SoftwareArchitecture #WolffElectronicDesign

By @Greg Burk, cross-posted from LinkedIn


No comments yet.