At LX we have a highly skilled team of firmware and embedded software developers capable of delivering even the most complex, low-level embedded software projects. We work closely with you to capture user and system requirements, and can work with you in a variety of ways from a remote turn-key capacity right through to working as a member of your team on-site.
We have experience in a range of processors, microcontrollers, real-time operating systems and programming languages. We have used 32-bit processors such as ARM (including ARM7, ARM9, ARM11 and Cortex) as well as most of the popular 8-bit and 16-bit devices, various RTOS systems and native environments.
Our software is robust, reliable, and well structured. Our embedded software development team has experience designing robust software for mission-critical control systems including medical, mining and military devices.
Our firmware design strategies conform to accepted industry practices, standards and languages, and we tailor our approach to the needs of the client recommending and implementing Agile or Waterfall techniques as required. Code is professionally developed to industry-respected coding guidelines and subject to peer reviews to ensure high quality designs.
Our experience over a large number of projects has allowed us to create a reusable library of software components that allows us to focus on developing quality and timely solutions.
Firmware Development Expertise
Our engineers have a range of experience in:
- C, C++, Python, Assembly (various processors) with a range of embedded processors (8, 16 and 32 – bit) and DSPs
- VHDL, Verilog and soft processor implementations (including NIOS, PowerPC and Microblaze)
- Real-Time Operating Systems (RTOS) (including RT Linux, VxWorks, QNX, µC, Fusion, IAR PowerPac)
- Embedded GUI design (including QT, Nano-X and 4DGL)
- A variety of compilers, debuggers and IDE’s (including GCC, IAR and CCS)
- Complex modelling, control systems (including PID control) and algorithm development
- Bootloaders and Over The Air (OTA) firmware upgrades
- Embedded web-server implementation
- Device driver development
- Fuzzy logic, adaptive algorithms and machine learning
- Agile and waterfall development methodologies
Testing non-trivial applications is often best performed using automated rather than manual methods. While manual methods may appear appropriate for the first release, they rapidly become tedious and time-consuming as changes and enhancements are made during the development process. We make use of automated methods where possible and use some or all of the following techniques as required:
- Unit testing – testing of individual units (or modules) within an application prior to integration with an individual test program for each unit/module
- Simulation testing – use of simulated stimulus provided by a testing module which then verifies the output is as specified (often useful for testing major algorithms)
- Regression testing – where previous manual test failures or reported bugs are turned into tests and added to the test suite (prevents already fixed problems from returning)
- Release testing – where a release is made and submitted to a test team or client for manual testing and reported problems are addressed to produce a relatively stable release
- Integration testing – system or sub-system testing were a test controller monitors system outputs to a range of test sequences (often built into the software from the start)
- Manual testing – manual testing of the system for which ultimately there is no substitute, often covering both known user cases and unexpected user inputs
Successful embedded software development requires engineering discipline and organisation. Apart from software efficiency requirements with respect to memory and CPU usage, there are often reliability constraints which can substantially influence the development approach. With the right development and testing strategy, potential challenges can be overcome and a functional and reliable application can be created.
Application Examples and Strengths
The following are key LX strengths in embedded software development:
- Ability to develop functional firmware in highly compressed timescales
- Wireless protocols (including Bluetooth, ZigBee, GSM, HSDPA, WiFi and IrDA)
- Wired protocols (including Ethernet, CAN, USB, LVDS, I2C, SPI, UART, RS-232/485 and PCI)
- Digital filter implementations (including FIR and IIR)
- Design for ultra-low power consumption (including battery-powered devices and sensor networks)
- User interface firmware development
- Development of image processing applications
- Design for mission-critical and safety-critical applications such as medical, military and mining including using MISRA-C
- Custom Board Support Package (BSP) development and embedded application porting