Real-Time Programming Languages - Operating Systems
Real-Time Programming Languages - Operating Systems
Real-Time Programming Languages - Operating Systems
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong><br />
Hermann Härtig<br />
<strong>Real</strong>-<strong>Time</strong> <strong>Programming</strong> <strong>Languages</strong><br />
(ADA and Esterel as Examples)<br />
08/01/14
RT-HLL Issues<br />
●<br />
Concurrency and Synchronization/Communication<br />
●<br />
<strong>Time</strong><br />
●<br />
Access to<br />
●<br />
Control over (“timeout”, ...)<br />
●<br />
Scheduling/Resource Management<br />
●<br />
●<br />
Built in<br />
Explicit<br />
●<br />
Recurrent processes<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 2
RT Language Classes<br />
Synchronous HLL (tick driven)<br />
● Esterel<br />
● Lustre<br />
● (State Charts)<br />
Imperative HLL with rt-extensions<br />
● ADA<br />
● RT-Java<br />
● PEARL<br />
● CHILL<br />
● RT-Euclid (designed to enable static analysis)<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 3
Esterel<br />
For further study<br />
Gerard Berry,<br />
Esterel Language Primer<br />
http://www.esterel-technologies.com/files/primer.zip<br />
Gerard<br />
Berry<br />
Video of Artist summer school 2008<br />
http://www.artist-embedded.org/artist/Videos-Slides<br />
(Prof. Christian Hochberger's “Embedded <strong>Systems</strong>”<br />
moved on to another Uni)<br />
Caveat:<br />
This lecture: introduction into principles only<br />
Ignored: Extensive Tool Chain, Verification, ...<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 4
Synchronous <strong>Systems</strong> → Synchronous <strong>Languages</strong><br />
Gerard Berry:<br />
Our approach is based on the standard principle of separation of<br />
concerns. First, write the program at the logical level and make<br />
use of all the mathematics available there. Then, implement the<br />
program using the best available automatic synthesis tools, and<br />
check that the result is practically OK.<br />
Gerard<br />
Berry<br />
Ideal <strong>Systems</strong> produce their outputs synchronously with their inputs.<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 5
BUT: Implementation<br />
For example, assume we want to trigger a reaction with two<br />
inputs A and B present.<br />
We execute the following [compiler generated] C code:<br />
M_I_A();<br />
M_I_B();<br />
M();<br />
If X is emitted by the reaction, the function M() will call an output<br />
function M O X() we have to supply. The reaction is subject to an<br />
essential atomicity condition: during the execution of the main<br />
reaction function M(), it is forbidden to call any input function. This is<br />
the software counterpart to the hardware requirement that input<br />
voltages must be kept stable during a clock cycle.<br />
Gerard<br />
Berry<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 6
Esterel at a glance<br />
Most statements are instantaneous<br />
(starts and terminates at the same instant of time)<br />
Stepwise execution,<br />
everything completes in each step/cycle/tick<br />
<strong>Time</strong> consumption explicit (e.g., „Pause“)<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 7
Esterel: „Statements“<br />
●<br />
Consume no time (unless explicitly said otherwise)<br />
● Await A: „consumes one A“<br />
●<br />
Pause: „consumes one time step“ (tick)<br />
●<br />
●<br />
●<br />
●<br />
X:= Y: assigns values to variables<br />
S1;S2<br />
S1 || S2<br />
Loop S end<br />
starts s, repeats if not terminated<br />
(s must consume time)<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 8
Esterel „Data“: Variables and Signals<br />
Variable:<br />
Value of any type<br />
Signal:<br />
Value and Status<br />
Value of any type<br />
Status:<br />
Present/non present<br />
Newly evaluated at every step<br />
present when emitted<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 9
Signals<br />
●<br />
●<br />
●<br />
●<br />
●<br />
●<br />
Emit x(y): sets signal x present, assigns value y<br />
?σ current value:<br />
value just emitted (if so) or value of previous instant<br />
(otherwise)<br />
pre(?S): previous value<br />
Present σ then s1 else s2 end (conditional)<br />
Abort S when σ do R end abort;<br />
starts S, terminates when σ becomes active, does R<br />
Suspend S when σ<br />
suspends S when σ active<br />
no emission when suspended<br />
Trap σ in S end trap<br />
starts S, aborts when σ present<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 10
Signals vs Variables<br />
01<br />
Emit Count(pre(?Count) + 1) vs V:= V+1;<br />
Gerard<br />
Berry<br />
Beware:<br />
writing “emit COUNT(?COUNT+1)” is tempting but incorrect.<br />
Since ?COUNT is the current value of COUNT, it cannot be<br />
incremented and reemitted right away as itself. It is necessary to<br />
use the previous value pre(?COUNT).<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 11
More Statements<br />
●<br />
halt: loop pause end<br />
●<br />
await σ : abort halt when σ end abort<br />
●<br />
sustain x(t): loop emit x(t); pause end<br />
●<br />
loop S each R<br />
restarts S at each occurance of R<br />
every σ do S end every:<br />
await σ ; loop S each σ<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 12
Examples (all by Berry): ABRO<br />
Specification ABRO:<br />
Emit an output O as soon as two inputs A and B have occurred.<br />
Reset this behavior each time the input R occurs.<br />
Gerard<br />
Berry<br />
module ABRO:<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
input A, B, R;<br />
output O;<br />
loop<br />
[ await A || await B ];<br />
emit O<br />
each R<br />
end module<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 13
Counting<br />
Specification COUNT:<br />
Count the number of occurrences of the input I seen so far, and<br />
broadcast it as the value of a COUNT signal at each new I.<br />
Gerard<br />
Berry<br />
module COUNT:<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
input I;<br />
output COUNT := 0 : integer;<br />
every I do<br />
emit COUNT(pre(?COUNT) + 1)<br />
end every<br />
end module<br />
Beware:<br />
“emit COUNT(?COUNT+1)” is tempting but incorrect.<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 14
Speed<br />
Specification SPEED:<br />
Count the number of centimeters run per second, and broadcast<br />
that number as the value of a Speed signal every second.<br />
Gerard<br />
Berry<br />
module SPEED:<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
08<br />
09<br />
10<br />
11<br />
12<br />
13<br />
14<br />
15<br />
input Centimeter, Second;<br />
relation Centimeter # Second;<br />
output Speed : integer;<br />
loop<br />
var Distance := 0 : integer in<br />
abort<br />
every Centimeter do<br />
Distance := Distance+1<br />
end every<br />
when Second do<br />
emit Speed(Distance)<br />
end abort<br />
end var<br />
end loop<br />
end module<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 15
ADA<br />
Used intensively, e.g. Military, Aircraft (B777), Space<br />
“most commonly used language in US weapons<br />
modernization”<br />
Ada 83 - result of a competition ...<br />
Ada 95 - major redesign (ISO/IEC 8652: 1995)<br />
Ada 2005, includes Ravenscar: subset<br />
Annex: <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong><br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 16
Few general points<br />
Ada has “Annexes”:<br />
in this lecture: <strong>Real</strong>-<strong>Time</strong> Annex<br />
Ada has “profiles”:<br />
relevant for this lecture “Ravenscar”<br />
reduced functionality for Hard-RT<br />
Ada has “pragmas” (compiler directives)<br />
CAVEAT:<br />
In this lecture: very limited extract relevant for RTS<br />
Especially, not covered explicitely:<br />
Packages, OO, Type-System, Generics, exceptions, …<br />
we rely on your intuition<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 17
THE ADA-RT Book<br />
Concurrent and <strong>Real</strong>-<strong>Time</strong><br />
<strong>Programming</strong> in Ada<br />
by<br />
Alan Burns and Andy Wellings<br />
Burns,<br />
Wellings<br />
Cambridge University Press<br />
ISBN 978-0521866972<br />
Most code examples taken from this source.<br />
Many more resources available.<br />
Image Source:<br />
amazon.com/dp/B001GS6TBO/<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 18
Concurrency<br />
Tasks<br />
●<br />
●<br />
●<br />
●<br />
are entities whose execution may proceed in parallel.<br />
have a thread of control.<br />
proceed independently,<br />
except at points where they synchronize.<br />
are created and activated via<br />
●<br />
●<br />
an object declaration or<br />
created dynamically using an “access type”<br />
Ptr:= new …<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 19
Example: Operator/Subscriber<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
08<br />
09<br />
10<br />
11<br />
12<br />
13<br />
14<br />
15<br />
16<br />
17<br />
18<br />
19<br />
task type Subscriber;<br />
task type Telephone_Operator is<br />
entry Directory_Enquiry(Person : in Name; Addr : in Address;<br />
Num : out Number);<br />
end Telephone_Operator;<br />
S1, S2, S3 : Subscriber; -- friends of Stuart Jones<br />
An_Op : Telephone_Operator;<br />
task body Subscriber is<br />
Stuarts_Number : Number;<br />
begin<br />
...<br />
end Subscriber;<br />
Burns,<br />
Wellings<br />
Ch. 5.1<br />
Page 80<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 20
Termination of Tasks<br />
Every task has a “master” and “depends” on it:<br />
block, subprogram etc.<br />
containing the declaration of the task object or<br />
of the access object type<br />
Before leaving the master, the parent task waits for all<br />
dependent tasks to terminate.<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 21
Communication<br />
●<br />
●<br />
●<br />
Protected objects<br />
for synchronized access to shared data<br />
Rendezvous<br />
for synchronous communication between tasks<br />
Unprotected access to shared data (global variables)<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 22
The Rendezvous<br />
Based on client/server model:<br />
●<br />
One task (client) calls an entry of an other task<br />
●<br />
●<br />
Other task accepts a call (Server)<br />
Calling task placed on a queue<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 23
Example: Operator/Subscriber<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
08<br />
09<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
08<br />
09<br />
10<br />
11<br />
12<br />
13<br />
task body Subscriber is<br />
Stuarts_Number : Number;<br />
begin<br />
--.AD ...<br />
An_Op.Directory_Enquiry("STUART JONES",<br />
"10 MAIN STREET, YORK", Stuarts_Number);<br />
-- phone Stuart<br />
--.AD ...<br />
end Subscriber;<br />
task body Telephone_Operator is<br />
begin<br />
loop<br />
-- prepare to accept next call<br />
accept Directory_Enquiry(Person : in Name;<br />
Addr : in Address; Num : out Number) do<br />
-- look up telephone number and<br />
-- assign the value to Num<br />
null; --.RM<br />
end Directory_Enquiry;<br />
-- undertake housekeeping such as logging all calls<br />
end loop;<br />
end Telephone_Operator;<br />
Burns,<br />
Wellings<br />
Ch. 5.1<br />
Page 80 f.<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 24
In detail<br />
task executing<br />
Server Client 1 Client 2<br />
accept Request<br />
Burns,<br />
Wellings<br />
Ch. 5.1<br />
Page 82<br />
Server.Request<br />
task executing<br />
a rendezvous<br />
end<br />
task suspended<br />
accept Request<br />
Server.Request<br />
data exchange<br />
end<br />
<strong>Time</strong><br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 25
Select Statement<br />
A task can have multiple entries:<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
08<br />
09<br />
select<br />
when (expression) =><br />
accept E1 do bla end E1;<br />
or<br />
when (expression) =><br />
accept E2 do bla end E2;<br />
or ...<br />
end select;<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 26
Select Statement<br />
●<br />
●<br />
Arbitrary entry, whose expression is evaluated to true,<br />
is called.<br />
Exception if no expression evaluates to true.<br />
●<br />
The Boolean expression is evaluated only once per<br />
execution of select<br />
(do not use global variables in when clause !)<br />
More on “select” later (timings)<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 27
Protected Objects<br />
have:<br />
● functions<br />
read-only access to shared data<br />
functions can be executed concurrently<br />
● procedures<br />
read/write access to shared data<br />
Procedures: executed under mutual exclusion<br />
● entries<br />
procedures with barriers (boolean expressions)<br />
synchronization operations automatic<br />
evaluate barriers<br />
at each call to and at each return from an entry<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 28
Example: Resource with Locking<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
08<br />
09<br />
10<br />
11<br />
12<br />
13<br />
14<br />
protected type Resource is<br />
entry lock;<br />
procedure unlock; Release;<br />
private Locked: Boolean := False;<br />
end Resource;<br />
protected body Resource is<br />
entry lock when not Locked is<br />
begin<br />
Locked := True;<br />
end lock;<br />
procedure unlock is begin Locked := False end unlock;<br />
end Resource;<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 29
Tasks ./. Protected Objects<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
08<br />
09<br />
10<br />
11<br />
12<br />
13<br />
14<br />
15<br />
protected type Shared_Integer(Initial_Value : Integer) is<br />
function Read return Integer;<br />
procedure Write(New_Value : Integer);<br />
procedure Increment(By : Integer);<br />
private<br />
The_Data : Integer := Initial_Value;<br />
end Shared_Integer;<br />
protected body Shared_Integer is<br />
function Read return Integer is<br />
begin<br />
return The_Data;<br />
end Read;<br />
procedure Write(New_Value : Integer) is<br />
begin<br />
The_Data := New_Value;<br />
end Write;<br />
procedure Increment(By : Integer) is<br />
begin<br />
The_Data := The_Data + By;<br />
end Increment;<br />
end Shared_Integer;<br />
Burns,<br />
Wellings<br />
Ch. 7.2<br />
Page 131 f.<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 30
Tasks ./. Protected Objects<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
08<br />
09<br />
10<br />
11<br />
12<br />
13<br />
14<br />
15<br />
16<br />
17<br />
18<br />
19<br />
20<br />
21<br />
task body Shared_Integer is<br />
The_Data : Integer := Initial_Value;<br />
begin<br />
loop<br />
select<br />
accept Read(New_Value : out Integer) do<br />
New_Value := The_Data;<br />
end Read;<br />
or<br />
accept Write(New_Value : Integer) do<br />
The_Data := New_Value;<br />
end Write;<br />
or<br />
accept Increment(By : Integer) do<br />
The_Data := The_Data + By;<br />
end Increment;<br />
or<br />
terminate;<br />
end select;<br />
end loop;<br />
end Shared_Integer;<br />
Burns,<br />
Wellings<br />
Ch. 7.2<br />
Page 132<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 31
Priorities<br />
01<br />
pragma task_dispatching_policy(policy identifier);<br />
Burns,<br />
Wellings<br />
Ch. 13.2<br />
Page 320<br />
Supported by ADA 205:<br />
●<br />
●<br />
Preemptive fixed priority<br />
Non-Preemptive fixed priority<br />
●<br />
Round robin<br />
●<br />
EDF<br />
●<br />
And mixtures thereof<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 32
Fixed Priorities<br />
● task (type) T is pragma Priority(P); ....<br />
●<br />
●<br />
Distinct Run Queue per (active) priority<br />
released tasks at the end of queue<br />
preempted tasks at the beginning<br />
Such priorities are called the base priorities of the task<br />
in contrast to active priority<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 33
Priority Ceiling<br />
01<br />
02<br />
Pragma Locking_Policy(Ceiling_Locking);<br />
Protected object is pragma priority(...) ... ;<br />
Burns,<br />
Wellings<br />
Ch. 13.3<br />
Page 325<br />
Implements the “immediate ceiling protocol”<br />
●<br />
●<br />
The object ceiling priority must be maximum priority of<br />
any calling task<br />
the task executing a protected operation executes at<br />
the ceiling priority of the protected object<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 34
Active Priority<br />
Base priority or<br />
●<br />
Ceiling priority if calling a protected object<br />
●<br />
●<br />
The creating task's priority if higher than the base p<br />
During rendezvous:<br />
the priority of the task executing the accept statement<br />
inherits the priority of the calling task<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 35
Run-<strong>Time</strong> Priorities<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
procedure Set_Priority(Priority: Any_Priority;<br />
T: Task_ID := Current_Task);<br />
function Get_Priority(T: Task_ID := Current_Task)<br />
return Any_Priority;<br />
Resets base priority.<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 36
EDF Dispatching<br />
How to set deadlines:<br />
Burns,<br />
Wellings<br />
Ch. 14.3<br />
Page 336 f.<br />
01<br />
02<br />
03<br />
04<br />
05<br />
Package ada.dispatching.EDF is<br />
procedure set_deadline (D: in deadline,<br />
T: in TaskId)<br />
Procedure DelayUntilAndSetDeadline(...)<br />
Procedure GetDeadline (...)<br />
Or<br />
01<br />
02<br />
Pragma Relative_Deadline(Milliseconds(3))<br />
& Explicit call to set first deadline of periodic task<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 37
EDF and Ceiling<br />
●<br />
Implements “Preemption Level Control Protocol”<br />
look forward to: lecture on resource access control<br />
separates:<br />
●<br />
●<br />
Urgency (EDF)<br />
Preemption level<br />
●<br />
Using Priority Ceiling of Protected Objects as<br />
Preemption Level<br />
Burns,<br />
● Details: see Ted Baker(91) and Wellings (complicated)<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 38
Mixed Scheduling Policies, example<br />
Specify “priority partitions” to set scheduling<br />
disciplines<br />
Burns,<br />
Wellings<br />
Ch. 14.4<br />
Page 347<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
08<br />
09<br />
10<br />
Pragma Priority_Specific_Dispatching<br />
(Fifo_Within_Priorities, 10, 16)<br />
Pragma Priority_Specific_Dispatching<br />
(EDF_Across_Priorities, 2,9)<br />
Pragma Priority_Specific_Dispatching<br />
(RoundRobin_Within_Priorities, 1, 1)<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 39
Entry Queuing: Implicit Policies<br />
Standard: FIFO<br />
01<br />
pragma Queuing_Policy(Priority_Queuing);<br />
Burns,<br />
Wellings<br />
Ch. 13.4<br />
Page 327<br />
“the user can override the default FIFO policy with<br />
the pragma Queuing_Policy”<br />
per partition (not per entries or tasks)<br />
passing of dynamic priorities as implicit parameters<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 40
Explicit Request Ordering: Requeue<br />
Explicit treatment of request orders, example:<br />
A request enters entry or barrier<br />
Parameters inspected in body code<br />
Possible decision: requeue at different entry<br />
Action:<br />
Requeue a request of a caller to some entry or barrier<br />
Not easy to use !!!<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 41
Example<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
08<br />
09<br />
10<br />
11<br />
12<br />
13<br />
14<br />
protected body AirportGate is<br />
entry EnterGateBusiness(Ticket)<br />
begin<br />
if Ticket.Economy then<br />
requeue EnterGateEconomy;<br />
end if;<br />
HandleBusinessPassenger<br />
end EnterGateBusiness;<br />
entry EnterGateEconomy(Ticket)<br />
when AllBusinessPassengersHaveEntered<br />
begin HandleEcenomyPassenger end EnterGateEconomy<br />
end AirportGate;<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 42
Timing events<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
08<br />
Package Ada.<strong>Real</strong>_time.Timing_events is<br />
--...<br />
Procedure Set_Handler(Event: in out Timing_Event;<br />
At-<strong>Time</strong>: <strong>Time</strong>; Handler: Timing_Event_Handler);<br />
--...<br />
Procedure Set_Handler(Event: in out Timing_Event;<br />
At-<strong>Time</strong>: <strong>Time</strong>_Span; Handler: Timing_Event_Handler);<br />
Burns,<br />
Wellings<br />
Ch. 15.2<br />
Page 363<br />
Causes Handler to be called at chosen times.<br />
Handlers are called by Clock_Interrupt Handler<br />
Must not block.<br />
Used for periodic action and watchdogs<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 43
Example: Watchdog<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
08<br />
09<br />
10<br />
11<br />
12<br />
13<br />
14<br />
15<br />
16<br />
protected Watchdog is<br />
pragma Interrupt_Priority (Interrupt_Priority'Last);<br />
entry Alarm_Control;<br />
-- Called by alarm handling task.<br />
procedure Call_In;<br />
-- Called by application code every 50ms if alive.<br />
procedure <strong>Time</strong>r(Event : in out Timing_Event);<br />
-- <strong>Time</strong>r event code, ie the handler.<br />
private<br />
Alarm : Boolean := False;<br />
end Watchdog;<br />
Fifty_Mil_Event : aliased Timing_Event;<br />
TS : <strong>Time</strong>_Span := Milliseconds(50);<br />
Set_Handler(Fifty_Mil_Event, TS, <strong>Time</strong>r);<br />
Burns,<br />
Wellings<br />
Ch. 15.2<br />
Page 364 f.<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 44
Example: Watchdog<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
08<br />
09<br />
10<br />
11<br />
12<br />
13<br />
14<br />
15<br />
16<br />
17<br />
18<br />
protected body Watchdog is<br />
entry Alarm_Control when Alarm is<br />
begin<br />
Alarm := False;<br />
end Alarm_Control;<br />
procedure <strong>Time</strong>r(Event : in out Timing_Event) is<br />
begin<br />
Alarm := True;<br />
-- Note no use is made of the parameter in this example<br />
end <strong>Time</strong>r;<br />
procedure Call_in is<br />
begin<br />
Set_Handler(Fifty_Mil_Event, TS, <strong>Time</strong>r);<br />
-- This call to Set_Handler cancels the previous call<br />
end Call_in;<br />
end Watchdog;<br />
Burns,<br />
Wellings<br />
Ch. 15.2<br />
Page 365<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 45
Execution <strong>Time</strong> <strong>Time</strong>rs<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
08<br />
09<br />
10<br />
Package Ada.Execution_<strong>Time</strong>.<strong>Time</strong>rs is<br />
--...<br />
Procedure SetHandler(TM : in out <strong>Time</strong>r;<br />
In_<strong>Time</strong>: <strong>Time</strong>_Span; Handler. <strong>Time</strong>r_Handler);<br />
Procedure SetHandler(TM : in out <strong>Time</strong>r;<br />
At_<strong>Time</strong>: CPU_<strong>Time</strong>; Handler. <strong>Time</strong>r_Handler);<br />
--...<br />
Burns,<br />
Wellings<br />
Ch. 15.8<br />
Page 372<br />
<strong>Time</strong>rs are strongly linked to tasks!<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 46
<strong>Time</strong>: Delay Statement<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
delay<br />
duration<br />
point in time<br />
delay 5.0;<br />
-- delay for at least 5 seconds<br />
delay until A_<strong>Time</strong>; -- delay at least until A_<strong>Time</strong><br />
specifies minimum delay<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 47
Delay and Select, server side<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
select<br />
accept An_Entry do bla<br />
end An_Entry;<br />
or<br />
delay 10.0;<br />
Put("An_Entry: timeout");<br />
end select;<br />
Select terminates if entry is not called within 10 time units.<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 48
Delay and Select, client side(1)<br />
01<br />
02<br />
03<br />
04<br />
05<br />
select<br />
Operator.Enquiry()<br />
or<br />
delay 10;<br />
end select;<br />
Select terminates if entry is not accepted within 10 time<br />
units.<br />
Only one call alternative allowed<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 49
Client side (2): “Asynchronous” Select<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
08<br />
09<br />
10<br />
select trigger<br />
triggering_alternative --- (entry-call or delay)<br />
then abort<br />
abortable_part<br />
end select;<br />
Burns,<br />
Wellings<br />
Ch. 9.3<br />
Page 202<br />
●<br />
●<br />
If delay or entry-call complete before the abortable<br />
part, the abortable part is aborted<br />
abortable_part must not an accept statement<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 50
Example<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
select<br />
delay 5.0;<br />
-- triggering alternative<br />
then abort<br />
CalculationComplete:= false;<br />
Invert_Giant_Matrix(M); -- abortable part<br />
CalculationComplete:= true;<br />
end select;<br />
Careful: notice the race condition !<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 51
Example: Watchdog<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
08<br />
09<br />
10<br />
11<br />
12<br />
13<br />
14<br />
15<br />
16<br />
17<br />
task type Watchdog is<br />
entry All_Is_Well;<br />
end Watchdog;<br />
task body Watchdog is<br />
begin<br />
loop<br />
select<br />
accept All_Is_Well;<br />
or<br />
delay 10.0;<br />
-- signal alarm, potentially the client has failed<br />
exit;<br />
end select;<br />
end loop;<br />
-- any further required action<br />
end Watchdog;<br />
Burns,<br />
Wellings<br />
Ch. 6.3<br />
Page 104<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 52
Example: Operator/Subscriber<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
08<br />
09<br />
task type Telephone_Operator is<br />
entry Directory_Enquiry(Person : in Name; Addr: in Adress;<br />
Num : out Number);<br />
entry Directory_Enquiry(Person : in Name;<br />
Zip : in Postal_Code; Num : out Number);<br />
entry Report_Fault(Num : Number);<br />
private<br />
entry Allocate_Repair_Worker(Num : out Number);<br />
end Telephone Operator;<br />
Burns,<br />
Wellings<br />
Ch. 6.1<br />
Page 99<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 53
Example: Operator/Subscriber<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
08<br />
09<br />
10<br />
11<br />
12<br />
13<br />
14<br />
15<br />
16<br />
17<br />
18<br />
19<br />
20<br />
21<br />
22<br />
23<br />
task body Telephone_Operator is<br />
Workers : constant Integer := 10;<br />
Failed : Number;<br />
begin<br />
loop<br />
-- prepare to accept next request<br />
select<br />
accept Directory_Enquiry(Person : in Name;<br />
Addr : in Adress; Num : out Number) do<br />
-- look up telephone number and assign the value to Num<br />
end Directory_Enquiry;<br />
or<br />
accept Directory_Enquiry(Person : in Name;<br />
Zip : in Postal_Code; Num : out Number) do<br />
-- look up telephone number and assign the value to Num<br />
end Directory_Enquiry;<br />
or<br />
accept Report_Fault(Num : Number) do<br />
Failed := Num;<br />
end Report_Fault;<br />
-- log faulty line and allocate repair worker<br />
end select; – undertake housekeeping such as logging all calls<br />
end loop;<br />
end Telephone_Operator;<br />
Burns,<br />
Wellings<br />
Ch. 6.1<br />
Page 99 f.<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 54
Example: Operator/Subscriber<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
08<br />
09<br />
10<br />
11<br />
12<br />
13<br />
14<br />
15<br />
16<br />
17<br />
18<br />
19<br />
task type Subscriber;<br />
task body Subscriber is<br />
Stuarts_Number : Number;<br />
begin<br />
loop<br />
--...<br />
select<br />
An_Op.Directory_Enquiry("STUART JONES",<br />
"10 MAIN STREET, YORK", Stuarts_Number);<br />
-- log the cost of a directory enquiry call<br />
or<br />
delay 10.0;<br />
-- phone up his parents and ask them,<br />
-- log the cost of a long distance call<br />
end select;<br />
--...<br />
end loop;<br />
end Subscriber;<br />
Burns,<br />
Wellings<br />
Ch. 6.9<br />
Page 119<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 55
Simple Periodic Task With Static Priority<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
08<br />
09<br />
10<br />
11<br />
12<br />
13<br />
14<br />
task A is<br />
pragma Priority(5);<br />
end A;<br />
task body A is<br />
Next_Release: <strong>Real</strong>_<strong>Time</strong>.<strong>Time</strong>;<br />
begin<br />
Next_Release := <strong>Real</strong>_<strong>Time</strong>.Clock;<br />
loop<br />
-- code<br />
Next_Release := Next_Release + <strong>Real</strong>_<strong>Time</strong>.Milliseconds(10);<br />
delay until Next_Release;<br />
end loop<br />
end A;<br />
Burns,<br />
Wellings<br />
Ch. 14.3<br />
Page 345<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 56
Recurrent Tasks (1)<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
08<br />
09<br />
10<br />
11<br />
12<br />
13<br />
14<br />
15<br />
16<br />
17<br />
18<br />
19<br />
20<br />
21<br />
22<br />
23<br />
with Ada.Task_Identification; use Ada.Task_Identification;<br />
with Ada.<strong>Real</strong>_<strong>Time</strong>; use Ada.<strong>Real</strong>_<strong>Time</strong>;<br />
package Periodic_Scheduler is<br />
procedure Set_Characteristic(T : Task_Id; Period : <strong>Time</strong>_Span;<br />
First_Schedule : <strong>Time</strong>);<br />
procedure Wait_Until_Next_Schedule; -- potentially blocking<br />
end Periodic_Scheduler;<br />
with Ada.Task_Attributes;<br />
package body Periodic_Scheduler is<br />
Start_Up_<strong>Time</strong> : <strong>Time</strong> := Clock;<br />
type Task_Information is<br />
record<br />
Period : <strong>Time</strong>_Span := <strong>Time</strong>_Span_Zero;<br />
Next_Schedule_<strong>Time</strong> : <strong>Time</strong> :=<br />
<strong>Time</strong>_Of(100_000,<strong>Time</strong>_Span_Zero);<br />
end record;<br />
Default : Task_Information;<br />
-- a default object needs to be provided<br />
-- to the following package instantiation<br />
package Periodic_Attributes is new<br />
Ada.Task_Attributes(Task_Information, Default);<br />
use Periodic_Attributes;<br />
Burns,<br />
Wellings<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 57
Recurrent Tasks (2)<br />
25<br />
26<br />
27<br />
28<br />
29<br />
30<br />
31<br />
32<br />
33<br />
34<br />
35<br />
36<br />
37<br />
38<br />
39<br />
40<br />
procedure Set_Characteristic(T : Task_Id; Period : <strong>Time</strong>_Span;<br />
First_Schedule : <strong>Time</strong>) is<br />
begin<br />
Set_Value((Period, First_Schedule), T );<br />
end Set_Characteristic;<br />
procedure Wait_Until_Next_Schedule is<br />
Task_Info : Task_Information := Value;<br />
Next_<strong>Time</strong> : <strong>Time</strong>;<br />
begin<br />
Next_<strong>Time</strong> := Task_Info.Period +<br />
Task_Info.Next_Schedule_<strong>Time</strong>;<br />
Set_Value((Task_Info.Period,Next_<strong>Time</strong>));<br />
delay until Next_<strong>Time</strong>;<br />
end Wait_Until_Next_Schedule;<br />
end Periodic_Scheduler;<br />
Burns,<br />
Wellings<br />
Ch. 12.4<br />
Page 315<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 58
Recurrent Tasks (3)<br />
Periodic tasks can now be encoded as<br />
Burns,<br />
Wellings<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
08<br />
09<br />
task Periodic_Task;<br />
task body Periodic_Task is<br />
begin<br />
loop<br />
-- statements to be executed each period<br />
Periodic_Scheduler.Wait_Until_Next_Schedule<br />
end loop;<br />
end Periodic_Task;<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 59
Example EDF<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
08<br />
09<br />
10<br />
11<br />
12<br />
13<br />
14<br />
15<br />
16<br />
17<br />
18<br />
01<br />
01<br />
task A is<br />
pragma Priority(5);<br />
pragma Relative_Deadline(10);<br />
-- gives an initial relative<br />
-- deadline of 10 milliseconds<br />
end A;<br />
task body A is<br />
Next_Release: <strong>Real</strong>_<strong>Time</strong>.<strong>Time</strong>;<br />
begin<br />
Next_Release := <strong>Real</strong>_<strong>Time</strong>.Clock;<br />
loop<br />
-- code<br />
Next_Release := Next_Release + <strong>Real</strong>_<strong>Time</strong>.Milliseconds(10);<br />
Delay_Until_And_Set_Deadline(Next_Release,<br />
<strong>Real</strong>_<strong>Time</strong>.Milliseconds(10);<br />
end loop<br />
end A;<br />
Finally the dispatching policy must be changed from<br />
pragma Task_Dispatching_Policy(FIFO_Within_Priorities);<br />
to<br />
pragma Task_Dispatching_Policy(EDF_Across_Priorities);<br />
Burns,<br />
Wellings<br />
Ch. 14.3<br />
Page 345<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 60
Example<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
08<br />
09<br />
10<br />
11<br />
protected Overrun is<br />
pragma Priority(Min_Handler_Ceiling);<br />
entry Stop_Task;<br />
procedure Handler(TM : in out <strong>Time</strong>r);<br />
procedure Reset(C1, C2 : <strong>Time</strong>_Span);<br />
private<br />
Abandon : Boolean := False;<br />
First_Occurence : Boolean := True;<br />
WCET : <strong>Time</strong>_Span;<br />
WCET_Overrun : <strong>Time</strong>_Span;<br />
end Overrun;<br />
Burns,<br />
Wellings<br />
Ch. 15.5<br />
Page 373<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 61
Example<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
08<br />
09<br />
10<br />
11<br />
12<br />
13<br />
14<br />
15<br />
16<br />
17<br />
18<br />
19<br />
20<br />
21<br />
22<br />
23<br />
protected body Overrun is<br />
entry Stop_Task when Abandon is<br />
begin<br />
Abandon := False;<br />
First_Occurence := True;<br />
end Stop_Task;<br />
procedure Reset(C1, C2 : <strong>Time</strong>_Span) is<br />
begin<br />
Abandon := False;<br />
First_Occurence := True;<br />
WCET := C1;<br />
WCET_Overrun := C2;<br />
end Reset;<br />
procedure Handler(TM : in out <strong>Time</strong>r) is<br />
begin<br />
if First_Occurence then<br />
Set_Handler(TM,WCET_Overrun,Handler);<br />
Set_Priority(2, TM.T.all);<br />
First_Occurence := False;<br />
else<br />
Abandon := True;<br />
end if;<br />
end Handler;<br />
end Overrun;<br />
Burns,<br />
Wellings<br />
Ch. 15.5<br />
Page 373<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 62
Example<br />
01<br />
02<br />
03<br />
04<br />
05<br />
06<br />
07<br />
08<br />
09<br />
task Hard_Example;<br />
task body Hard_Example is<br />
ID : aliased Task_ID := Current_Task;<br />
WCET_Error : <strong>Time</strong>r(ID);<br />
WCET : <strong>Time</strong>_Span := Microseconds(1250);<br />
WCET_Overrun : <strong>Time</strong>_Span := Microseconds(250);<br />
Bool : Boolean := False;<br />
...<br />
Burns,<br />
Wellings<br />
Ch. 15.5<br />
Page 373<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 63
Example<br />
10<br />
11<br />
12<br />
13<br />
14<br />
15<br />
16<br />
17<br />
18<br />
19<br />
20<br />
21<br />
22<br />
23<br />
24<br />
25<br />
26<br />
27<br />
begin<br />
-- initialisation<br />
loop<br />
Overrun.Reset(WCET, WCET_Overrun);<br />
Set_Handler(WCET_Error,WCET,Overrun.Handler);<br />
select<br />
Overrun.Stop_Task;<br />
-- handle the error if possible<br />
then abort<br />
-- code of the application<br />
null; --.RM<br />
end select;<br />
Cancel_Handler(WCET_Error, Bool);<br />
Set_Priority(14);<br />
delay until ...<br />
end loop;<br />
...<br />
end Hard_Example;<br />
Burns,<br />
Wellings<br />
Ch. 15.5<br />
Page 373 f.<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 64
Missing in this RT-HLL lecture<br />
●<br />
RT-Java and RT-Garbage Collection<br />
●<br />
Language with built-in periodic processes<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 65
To take away ...<br />
●<br />
Principles of synchronous languages<br />
●<br />
Mechanisms to explicitely handle timing<br />
●<br />
Mechanisms to handle asynchronous events<br />
● “scheduling” of processes, queues, ...<br />
WS 2013/14 <strong>Real</strong>-<strong>Time</strong> <strong>Systems</strong>, <strong>Real</strong>-<strong>Time</strong> Prog. <strong>Languages</strong> / Hermann Härtig 66