package fridge public with Deployment; with Data_Model; ------------------------------------------------ -- The shared date : it is an integer ------------------------------------------------ data Counter_Internal_Type properties Data_Model::Data_Representation => Integer; end Counter_Internal_Type; data Counter features Write_Counter : provides subprogram access Write_spg; Read_Counter : provides subprogram access Read_spg; properties Priority => 250; Concurrency_Control_Protocol => Priority_Ceiling; end Counter; data implementation Counter.Impl subcomponents Field : data Counter_Internal_Type; spgWrite : subprogram Write_spg; spgRead : subprogram Read_spg; connections C1 : subprogram access SpgWrite -> Write_Counter; C2 : subprogram access SpgRead -> Read_Counter; properties Data_Model::Data_Representation => Struct; end Counter.Impl; subprogram Write_spg features this : requires data access Counter.Impl; properties source_language => C; source_name => "counter_write"; source_text => ("application_code.c"); end Write_spg; subprogram Read_spg features this : requires data access Counter.Impl; properties source_language => C; source_name => "counter_read"; source_text => ("application_code.c"); end Read_spg; ----------------- -- Subprograms -- ----------------- subprogram probe_spg properties source_language => C; source_name => "probe_spg"; source_text => ("application_code.c"); end probe_spg; subprogram alarm_spg properties source_language => C; source_name => "alarm_spg"; source_text => ("application_code.c"); end alarm_spg; subprogram lamp_spg properties source_language => C; source_name => "lamp_spg"; source_text => ("application_code.c"); end lamp_spg; subprogram door_spg properties source_language => C; source_name => "door_spg"; source_text => ("application_code.c"); end door_spg; subprogram thermostat_spg properties source_language => C; source_name => "thermostat_spg"; source_text => ("application_code.c"); end thermostat_spg; ----------------------------------------------- -- Code for each thread -- We now have a sequence of subprogram call ----------------------------------------------- subprogram alarm_sequence features seq_cnt : requires data access Counter.Impl; end alarm_sequence; subprogram implementation alarm_sequence.Impl calls Mycalls: { Call_Read : subprogram Counter.Read_Counter; Call_alarm : subprogram alarm_Spg; }; connections C1 : data access seq_cnt -> Call_Read.this; end alarm_sequence.Impl; subprogram thermostat_sequence features seq_cnt : requires data access Counter.Impl; end thermostat_sequence; subprogram implementation thermostat_sequence.Impl calls Mycalls: { Call_thermostat : subprogram thermostat_Spg; Call_Write : subprogram Counter.Write_Counter; }; connections C1 : data access seq_cnt -> Call_Write.this; end thermostat_sequence.Impl; ------------- -- Threads -- ------------- thread periodic_task properties Dispatch_Protocol => Periodic; end periodic_task; thread implementation periodic_task.door calls c : { s : subprogram door_spg; }; end periodic_task.door; thread implementation periodic_task.lamp calls c : { s : subprogram lamp_spg; }; end periodic_task.lamp; thread implementation periodic_task.probe calls c : { s : subprogram probe_spg; }; end periodic_task.probe; thread thermostat features thread_cnt : requires data access Counter.Impl; end thermostat; thread implementation thermostat.Impl calls Mycalls: { call : subprogram thermostat_sequence.Impl; }; connections C1 : data access thread_cnt -> call.seq_cnt; properties Dispatch_Protocol => periodic; end thermostat.Impl; thread alarm features thread_cnt : requires data access Counter.Impl; end alarm; thread implementation alarm.Impl calls Mycalls: { call : subprogram alarm_sequence.Impl; }; connections C1 : data access thread_cnt -> call.seq_cnt; properties Dispatch_Protocol => periodic; end alarm.Impl; --------------- -- Processor -- --------------- processor cpu properties Deployment::Execution_Platform => native; end cpu; processor implementation cpu.impl properties Scheduling_Protocol => (Posix_1003_Highest_Priority_First_Protocol); end cpu.impl; --------------- -- Processes -- --------------- process node_a end node_a; process implementation node_a.impl subcomponents door : thread periodic_task.door; lamp : thread periodic_task.lamp; probe : thread periodic_task.probe; thermostat: thread thermostat.impl; alarm: thread alarm.impl; Counter_Data : data counter.impl; connections C1 : data access Counter_Data -> alarm.thread_cnt; C2 : data access Counter_Data -> thermostat.thread_cnt; properties Deadline => 30 ms applies to door; Period => 30 ms applies to door; Compute_Execution_Time => 1 ms .. 2 ms applies to door; Priority => 60 applies to door; Deadline => 7 ms applies to lamp; Period => 7 ms applies to lamp; Compute_Execution_Time => 1 ms .. 1 ms applies to lamp; Priority => 100 applies to lamp; Deadline => 14 ms applies to probe; Period => 14 ms applies to probe; Compute_Execution_Time => 1 ms .. 2 ms applies to probe; Priority => 80 applies to probe; Deadline => 15 ms applies to thermostat; Period => 15 ms applies to thermostat; Compute_Execution_Time => 1 ms .. 2 ms applies to thermostat; Priority => 70 applies to thermostat; Deadline => 10 ms applies to alarm; Period => 10 ms applies to alarm; Compute_Execution_Time => 2 ms .. 3 ms applies to alarm; Priority => 90 applies to alarm; end node_a.Impl; ------------ -- System -- ------------ system cold end cold; system implementation cold.Impl subcomponents node_a : process node_a.impl; cpu_a : processor cpu.impl; properties Actual_Processor_Binding => (reference (cpu_a)) applies to node_a; end cold.Impl; end fridge;