Software Development

emsys Embedded Systems GmbH provides reliable and reusable software and solutions for embedded systems.

Software development is performed according to a well-defined process to achieve the specified goals. The process is based on principles and is organized to follow the Agile philosophy.

Specific techniques for embedded C and C++ development projects are applied.

Goals

  • create reliable software
  • in predictable time schedule
  • which is resource-efficient
  • and can be easily maintained

Principles

emsys Embedded Systems GmbH follows dedicated principles in the standard development process. Adoption and integration into customer specific approaches are possible and have already been performed in multiple customer projects.

  • every code change is done in a context of a ticket in an issue tracking system (Atlassian Jira)
  • each ticket has a corresponding branch in revision control (git and Bitbucket)
  • the branch is built and checked for every commit with a continuous integration (CI) server (Atlassian Bamboo)
  • continuous integration tests are performed on real target hardware, too
  • the branch has to pass CI tests before merging to master
  • the changes in a branch have to be reviewed before merging to master (Atlassian Crucible)
  • the code must compile warning-free (warning = error) with extended warning levels
  • building the code is based on a generic build system (CMake)
  • for the sake of portability, CI builds use multiple compiler tool chains (GCC, Clang/LLVM, MSVC, ICC, RVCT, …) – project specific compilers can be added easily
  • source code must pass static code analysis (PC-lint and Klocwork)
  • the code is covered by a comprehensive set of unit tests (CppUnit, Catch)
  • all code comes with in-source documentation in English language (Doxygen)
  • code to be delivered to customer must pass automated tests and additional complex functional tests (Zephyr for Jira); all tests are formally documented in test specifications, test plans and test reports

Organizational

  • Agile development process based on Scrum
  • Scrum teams with five to seven members
  • Certified Scrum Master in each team
  • typically two weeks scrum cycle
  • Scrum boards are managed within Atlassian Jira
  • transparent work logs with Tempo for Jira
  • transparent Definition of Done
  • continuous process improvement by regular retrospectives (stored with Atlassian Confluence)
  • customer beside is intended (desktop sharing, accounts in Jira)
  • ISO 9001:2008 certification

C Programming Techniques for Embedded Systems

  • all symbol names are prefixed to ensure unique naming
  • object-based data types for complex aspects (context pointer and function table)
  • inlining of compact functions
  • wrapper for standard library to allow emulation, if required
  • ANSI C11 compatible multi-threading (atomics, thread, mutex, cond_var, …)
  • reusable basic components and protocol implementations

C++ Programming Techniques for Embedded Systems

  • all code resides in domain-specific namespaces
  • no exception handling in production code
  • no rtti (run-time type information) in production code
  • multiple inheritance only for mixin concepts; no virtual base classes
  • avoid virtual functions on public API
  • asynchronous design for I/O operations
  • no C-style type casts
  • use of C++11 features to ensure better code: e.g., nullptr, override and final, move semantics (emulate in case of limited compiler support)
  • standard compliant OS abstraction: e.g., atomic, thread, mutex, conditional_variable, system_error (emulation for many system environments)
  • embedded-capable implementation of STL containers and algorithms
  • heavy use of design patterns (e.g., Singleton, Factory, Visitor)
  • all setters follow NPI (named parameter idiom)
  • resource management follows the RAII (resource allocation is instantiation) idiom
  • reusable basic components and protocol implementations