Designers of embedded systems face tight constraints
on resources, response time and cost. The ability to analyze embedded
systems is essential to timely delivery of new designs. Many
analysis techniques model parallel programs as task graphs. Task
graphs capture the worst-case execution times of individual program
tasks and the data dependencies among these.
This paper introduces two compiler directives which let programmers
annotate source code with data dependencies among
tasks. Compiler analysis overapproximates the actual dependencies
among tasks. The directives help eliminate potential data dependencies
that do not occur at runtime. This lets tools compute
more accurate task graphs from the annotated code.
The correct use of the directives cannot be verified at compile
time. Therefore, the check for correct use is done at runtime—not
unlike dynamic array bounds checking in many languages.
The overhead of verifying the correct use of the directives was
measured on a set of benchmarks on two platforms. The overhead
of runtime checks was found to be negligible in all instances.