Software Development

Overview

Our team has broad experience with software development in different environments and using various methodologies, depending on the setup of a particular customer’s processes. In general, we prefer highly iterative approach in tight cooperation with customer’s domain experts, supported by automation tools and with wide test coverage.

From target platform point of view, we are mainly focused on software for microcontrollers and linux-based embedded devices.

Software quality in all aspects (robustness, reliability, maintainability etc.) is our primary goal since we are convinced that there is no place for mistakes in embedded software (and we simply don’t like not-functioning software, too).

System-level development

Our knowledge of embedded operating systems and practical experience with Linux and FreeRTOS on various HW platforms allows us performing a variety of embedded software development tasks including:

  • implementation of peripheral drivers – we clearly separate hardware specific abstraction layer and the main driver part to enable easy portability, reusability and easier testability
  • integration of standard communication stacks (USB, TCP/IP) even non-standard custom protocols
  • porting of existing software stacks to new MCUs
  • board support packages (BSP’s)
  • system analysis & solution design
  • configuration and setup of cross toolchains (binary utilities, C/C++ compiler, linker): we believe that one has to have the complete software stack under control while building truly reliable and secure products
  • embedded Linux integration

Custom applications development

We are able to cover all stages of application development lifecycle from requirements collection and their analysis, feasibility study to coding, testing and documentation. Not all customers’ projects need all these stages and we are able to fit your company’s standards or project’s nature.

Domain specific modeling and languages

Customer domains are frequenty complex and very specific at the same time. There are numerous techniques and methods out there how to deal with this fact.

One of these techniques is domain specific modeling, ranging from text-based and even graphics-based domain specific languages over to model transformations and validations, and further leading to configurable generation of multiple artifact types (source code is just one of them). This set of techniques, when carefully used, brings at least two major benefits:

  • increased development productivity by moving to a higher level of abstraction, which implicitly leads to either development cost reduction, or time savings, or both
  • decreased rate of error because of reducing human factor in coding (model compiler/code generator, automatic model validation against specific rules etc.)

Standard examples of areas where model-based code/test/documentation generation can be huge time/money saver:

  • user interface / HMI
  • process definition or, in general, statefull behavior thru derivatives of state machine concept
  • remote interface definition and objects marshalling and un-marshalling
  • control algorithms
  • automatic data providers for e.g. internal web browser (or other similar artifacts)
  • etc.

It is a clear, that this approach is not always applicable for all problems. The range of opportunities is still quite wide. If you are interested in evaluating your particular domain and existing environment to know if there is space for increasing efficiency or reducing development cost by using domain specific SW development approach, we can prepare an evaluation study for you, as noted on the Consulting page. The first-see evaluation can be done in quite short time and we would be honored to provide it and discuss it with you free of charge.

Basic model driven development principle

Technology

We are focused on providing our customers with a comprehensive software stack ranging from cross toolchain, debugging tools, over to operating systems, libraries and eclipse based IDE. The list below provides an overview of the software technologies used for our projects.

  • GNU toolchain (binutilsgccgdb) – we exclusively use GNU  toolchain since it is available for variety of architectures. Hardware vendors are highly motivated to contribute support for  their recent architectures to this toolchain that become an industry  standard.
  • newlib – C library for embedded systems provided by RedHat
  • OpenOCD – a standard tool used for debugging, in-system programming  and boundary-scan testing that supports many debugging JTAG adapters
  • FreeRTOS – real time operating system that is also available in a certified commercial form and supports a wide range of target system  architectures.
  • lwip – embedded TCP/IP stack suitable for RTOS based solutions
  • MicroPython – a tiny and efficient implementation of Python 3 for bare metal systems. We really like to run it within an RTOS ;-) along regular tasks that have to meet hard realtime deadlines
  • Linux – we exclusively use Linux kernel for high-end embedded devices with sufficient resources to run this operating system.