Producing a working software system within project timescales and budget constraints is of paramount importance. These aren't the only challenges of course. Engineers also need to maximise the efficiency of their design to gain a competitive advantage. They must undertake optimisation in relation to a variety of key parameters, such as:
- Completeness and feature set of their design
- Hardware cost
- Code size
- Performance level
- Power budget
The way in which optimisations are applied is still relatively crude in comparison to the cutting-edge embedded systems being designed. Existing code generation tools make optimisations using processor-focused instructions, but these are, as a result, inadequate for anything but the most rudimentary of sequences. The numerous interactions between the processor/memory have the greatest influence over the performance of an embedded system, so these should be appropriately addressed. Traditional tools try to identify the most common control flows through a program then optimise for this dynamic behaviour at the expense of other, seemingly less important control flows.
However in reality, programs exhibit highly dynamic behaviours, and even infrequently-taken control flows can make dramatic changes to the processor/memory state, which affect the behaviour of other flows. Profiler tools can provide developers with information on which system resources are being expended (such as memory bandwidth, cache hits/misses, etc.). However, this isn’t the whole picture – it says nothing about the fundamental causes. The interactions of software and hardware are so complex in modern processor systems it is just too difficult for programmers to directly control many of these effects from their source code. Comprehending the underlying relationships at work here is frequently beyond the faculties of even the most skilled engineering professionals.
In reality there is a considerable gap between hardware’s theoretical performance, and new hardware features such as high performance tightly-coupled memories, and what can be achieved with traditional software development tools. This is starting to cause major issues and, in many cases, unnecessary compromises are having to be made in order to alleviate acute time-to-market pressures. It is for such reasons the vast majority of design projects embarked upon do not manage to achieve their initial goals, coming up short of their true potential and not fully utilising the performance features available with modern hardware.