|Ada 95 Quality and Style Guide||Chapter 6|
6.1.7 Delay Statements
Do not depend on a particular delay being achievable (Nissen and Wallis 1984).
Use a delay until not a delay statement to delay until a specific time has been reached.
Avoid using a busy waiting loop instead of a delay.
The phase of a periodic task is the fraction of a complete cycle elapsed as measured from a specified reference point. In the following example, an inaccurate delay causes the phase of the periodic task to drift over time (i.e., the task starts later and later in the cycle):Periodic: loop delay Interval; ... end loop Periodic;
To avoid an inaccurate delay drift, you should use the delay until statement. The following example (Rationale 1995, §9.3) shows how to satisfy a periodic requirement with an average period:task body Poll_Device is use type Ada.Real_Time.Time; use type Ada.Real_Time.Time_Span; Poll_Time : Ada.Real_Time.Time := ...; -- time to start polling Period : constant Ada.Real_Time.Time_Span := Ada.Real_Time.Milliseconds (10); begin loop delay until Poll_Time; ... -- Poll the device Poll_Time := Poll_Time + Period; end loop; end Poll_Device;
There are two forms of delay statement. The delay will cause a delay for at least a specified time interval. The delay until causes a delay until an absolute wake-up time. You should choose the form appropriate to your application.
The Ada language definition only guarantees that the delay time is a minimum. The meaning of a delay or delay until statement is that the task is not scheduled for execution before the interval has expired. In other words, a task becomes eligible to resume execution as soon as the amount of time has passed. However, there is no guarantee of when (or if) it is scheduled after that time because the required resources for that task might not be available at the expiration of the delay .
A busy wait can interfere with processing by other tasks. It can consume the very processor resource necessary for completion of the activity for which it is waiting. Even a loop with a delay can have the impact of busy waiting if the planned wait is significantly longer then the delay interval. If a task has nothing to do, it should be blocked at an accept or select statement, an entry call, or an appropriate delay.
The expiration time for a relative delay is rounded up to the nearest clock tick. If you use the real-time clock features provided by (Annex D, however, clock ticks are guaranteed to be no greater than one millisecond (Ada Reference Manual 1995, §D.8).
You need to ensure the arithmetic precision of the calculation Poll_Time := Poll_Time + Period; to avoid drift.
|< Previous Page||Search||Contents||Index||Next Page >|