Almost all state-of-the-art electronic systems require some amount of software engineering, whether for simple control functions, advanced digital signal processing, or the latest touch-based user interfaces. TDI has in-house expertise covering key programming languages such as Embedded C, C++, Java and Python, targeting everything from the smallest 8-bit devices to high-end Embedded Linux and Android platforms.
We can handle as little or as much of the software development as needed; from a basic device driver package, to a custom Linux environment, or the full software stack. The process starts with an analysis of the project requirements to devise a set of high-level features, their inter-dependencies, and an agreed schedule for releases. Where appropriate, clients can benefit from staged releases to facilitate their own functional testing, or to begin trials or product approvals in parallel with the remaining application development. For split developments, where TDI is responsible for only part of the software, a detailed interface specification is agreed at an early stage.
Our engineers have experience with a wide range of Real Time Operating Systems (RTOS) such as FreeRTOS, eCos and RTX, and our home-grown porting layer gives us the flexibility to choose the operating system and hardware architecture on their own merits, or to suit a client’s existing integration requirements. By utilising a consistent interface for device drivers we maximise low-level code reuse, increasing quality and reducing the time taken to bring up and test new hardware. In many cases this highly modular approach means the software development can begin even before the finished hardware is available, either by taking advantage of available development hardware, or through PC-based simulation.
Clients in industries with strict software assurance requirements will benefit from the application of modern software engineering principles throughout the development process, with a MISRA-compatible coding standard and, for larger projects, the use of a Continuous Integration (CI) strategy and automated unit testing. Of course we can also accommodate clients’ own configuration management, coding and verification standards if required, and for less stringent applications we apply the same level of quality control by default.