28.02.2014 Views

Real-Time Programming Languages - Operating Systems

Real-Time Programming Languages - Operating Systems

Real-Time Programming Languages - Operating Systems

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!