Using Ada for industrial embedded microprocessor applications

This paper investigates the use of Ada as a high level implementation language for use on microprocessors embedded in industrial applications. Many of these applications use microprocessors with minimal hardware, that is, no hardware support for a stack and possibly not even a hardware clock. The use of minimal hardware is dictated by manufacturing economics. If one can save $.25 per unit over a run of 100,000 units, the total savings will be $25,000. An Ada implementation for such hardware will differ greatly from an implementation for a large mainframe. For instance, the storage allocator cannot blithely allocate space for variables in activation records. While these programs do not use many of Ada's powerful language features, the compiler must be able to generate highly optimized code for those parts of the language that are used. Our discussion of Ada centers around a typical application, a program to control an automatic oven. While this example is not one of our intended applications, it embodies most of the problems that we expect to find in practice. The example was inspired by McCracken's furnace control case study [1], written in PL/M, and provides a good opportunity for comparing Ada with PL/M. Applications like the oven control program require a number of sophisticated compiler optimizations. In addition to performing the usual common subexpression analysis, removal of redundant and unreachable code, and sophisticated peephole optimizations, the compiler must be capable of complete static allocation of all data and must be able to perform significant amounts of verification to simplify generated code, especially with respect to error checks and exception handling. Finally, we discuss some language problems and some pragmas that we feel are necessary for use of Ada in real-time and time-dependent situations.