Thomas Lundqvist - Ph.D. Thesis

Abstract

When constructing real-time systems, safe and tight estimations of
the worst case execution time (WCET) of programs are needed. To obtain
tight estimations, a common approach is to do path and timing
analyses. Path analysis is responsible for eliminating infeasible
paths in the program and timing analysis is responsible for accurately
modeling the timing behavior of programs. The focus of this thesis is
on analysis of programs running on high-performance microprocessors
employing pipelining and caching.

This thesis presents a new method, referred to as cycle-level
symbolic execution, that tightly integrates path and timing
analysis. An implementation of the method has been used to estimate
the WCET for a suite of programs running on a high-performance
processor. The results show that by using an integrated analysis, the
overestimation is significantly reduced compared to other methods. The
method automatically eliminates infeasible paths and derives path
information such as loop bounds, and performs accurate timing analysis
for a multiple-issue processor with an instruction and data cache. The
thesis also identifies timing anomalies in dynamically scheduled
processors. These anomalies can lead to unbounded timing effects when
estimating the WCET, which makes it unsafe to use previously presented
timing analysis methods. To handle these unbounded timing effects,
two methods are proposed. The first method is based on program
modifications and the second method relies on using pessimistic timing
models. Both methods make it possible to safely use all previously
published timing analysis methods even for architectures where timing
anomalies can occur. Finally, the use of data caching is examined. For
data caching to be fruitful in real-time systems, data accesses must
be predictable when estimating the WCET. Based on a notion of
predictable and unpredictable data structures, it is shown how to
classify program data structures according to their influence on data
cache analysis. For both categories, several examples of frequently
used types of data structures are provided. Furthermore, it is shown
how to make an efficient data cache analysis even when data structures
have an unknown placement in memory. This is important, for example,
when analyzing single subroutines of a program.