package data_tictac public with Deployment; with Data_Model; ------------------------ -- Code des threads -- ------------------------ subprogram tic_spg properties source_language => C; source_name => "tic_spg"; source_text => ("tic.c"); end tic_spg; subprogram tac_spg properties source_language => C; source_name => "tac_spg"; source_text => ("tac.c"); end tac_spg; ------------------------------------------------ -- Donnee partagee : c'est un compteur entier -- ------------------------------------------------ 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 => ("tac.c"); end Write_spg; subprogram Read_spg features this : requires data access Counter.Impl; properties source_language => C; source_name => "counter_read"; source_text => ("tic.c"); end Read_spg; ------------------------------------------- -- Code de chaque thread -- Sequence d'appel des sous programmes ------------------------------------------- subprogram tic_sequence features seq_cnt : requires data access Counter.Impl; end tic_sequence; subprogram implementation tic_sequence.Impl calls Mycalls: { Call_Read : subprogram Counter.Read_Counter; Call_Tic : subprogram Tic_Spg; }; connections C1 : data access seq_cnt -> Call_Read.this; end tic_sequence.Impl; subprogram tac_sequence features seq_cnt : requires data access Counter.Impl; end tac_sequence; subprogram implementation tac_sequence.Impl calls Mycalls: { Call_Tac : subprogram Tac_Spg; Call_Write : subprogram Counter.Write_Counter; }; connections C1 : data access seq_cnt -> Call_Write.this; end tac_sequence.Impl; ------------- -- Threads -- ------------- thread Tic features thread_cnt : requires data access Counter.Impl; end Tic; thread implementation Tic.Impl calls Mycalls: { call : subprogram tic_sequence.Impl; }; connections C1 : data access thread_cnt -> call.seq_cnt; properties Dispatch_Protocol => periodic; Period => 100ms; Priority => 1; end Tic.Impl; thread Tac features thread_cnt : requires data access Counter.Impl; end Tac; thread implementation Tac.Impl calls Mycalls: { call : subprogram tac_sequence.Impl; }; connections C1 : data access thread_cnt -> call.seq_cnt; properties Dispatch_Protocol => periodic; Period => 50ms; Priority => 2; end Tac.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; ------------- -- Process -- ------------- process node_a end node_a; process implementation node_a.impl subcomponents tic : thread Tic.Impl; tac : thread Tac.Impl; Counter_Data : data Counter.Impl; connections C1 : data access Counter_Data -> tic.thread_cnt; C2 : data access Counter_Data -> tac.thread_cnt; end node_a.impl; ------------ -- System -- ------------ system root end root; system implementation root.impl subcomponents node_a : process node_a.impl; cpu : processor cpu.impl; properties Actual_Processor_Binding => (reference (cpu)) applies to node_a; end root.impl; end data_tictac;