------------------------------------------------------------------------------ ------------------------------------------------------------------------------ -- Cheddar is a GNU GPL real time scheduling analysis tool. -- This program provides services to automatically check performances -- of real time architectures. -- -- Copyright (C) 2002-2010, by Frank Singhoff, Alain Plantec, Jerome Legrand -- -- The Cheddar project was started in 2002 by -- the LISyC Team, University of Western Britanny. -- -- Since 2008, Ellidiss technologies also contributes to the development of -- Cheddar and provides industrial support. -- -- This program is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation; either version 2 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program; if not, write to the Free Software -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -- -- -- Contact : cheddar@listes.univ-brest.fr -- ------------------------------------------------------------------------------ -- Last update : -- $Rev: 97 $ -- $Date: 2007-07-20 15:17:15 +0200 (Fri, 20 Jul 2007) $ -- $Author: singhoff $ ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ with Ada.Numerics.Aux; use Ada.Numerics.Aux; with Text_IO; use Text_IO; with Ada.Strings.Unbounded; use Ada.Strings.Unbounded; with unbounded_strings; use unbounded_strings; with Ada.Text_IO.Unbounded_IO; with Framework_Config; use Framework_Config; with Processor_Set; use Processor_Set; use Processor_Set.Generic_Processor_Set; with Ada.Strings.Unbounded; use Ada.Strings.Unbounded; with unbounded_strings; use unbounded_strings; use unbounded_strings.strings_table_package; use unbounded_strings.unbounded_string_list_package; with Parameters; use Parameters; with Parameters.extended; use Parameters.extended; use Parameters.Framework_Parameters_Table_Package; with Scheduling_Analysis; use Scheduling_Analysis.Double_Tasks_Parameters_Package; with Scheduler_Interface; use Scheduler_Interface; with Processor_Set; use Processor_Set; use Processor_Set.Generic_Processor_Set; with Processors; use Processors; with processor_interface; use processor_interface; with Caches; use Caches; use Caches.Caches_Table_Package; use Processors.Core_Units_Table_Package; with Address_Space_Set; use Address_Space_Set; use Address_Space_Set.Generic_Address_Space_Set; with Task_Set; use Task_Set; use Task_Set.Generic_Task_Set; with Offsets; use Offsets; with Systems; use Systems; with Call_Framework; use Call_Framework; with Call_Framework_Interface; use Call_Framework_Interface; use Call_Framework_Interface.Framework_Response_Package; use Call_Framework_Interface.Framework_Request_Package; with framework; use framework; with Call_Scheduling_Framework; use Call_Scheduling_Framework; with Multiprocessor_Services; use Multiprocessor_Services; with Multiprocessor_Services_Interface; use Multiprocessor_Services_Interface; use Multiprocessor_Services_Interface.Scheduling_Result_Per_Processor_Package; with Feasibility_Test.Wort_Case_Response_Time; use Feasibility_Test.Wort_Case_Response_Time; with Scheduling_Analysis; use Scheduling_Analysis; with GNAT.Command_Line; with GNAT.OS_Lib; use GNAT.OS_Lib; with Version; use Version; with Ada.Exceptions; use Ada.Exceptions; with GNAT.Traceback.Symbolic; with Task_Groups; use Task_Groups; with Task_Group_Set; use Task_Group_Set; with Tasks; use Tasks; with Task_Dependencies; use Task_Dependencies; with Dependencies; use Dependencies; with Architecture_Factory; use Architecture_Factory; with Task_Group_Transformation; use Task_Group_Transformation; with Comprehensive_Call; with Initialize_Framework; use initialize_framework; procedure TDMA_Mac is use Double_Tasks_Parameters_Package; function Search_Task_In_Response_Times_Table (Response_Times : Response_Time_Table; Name : Unbounded_String) return Integer is Task_Not_Found : exception; begin for i in 0 .. Response_Times.nb_entries - 1 loop if Response_Times.entries(i).item.name = Name then return Integer(i); end if; end loop; raise Task_Not_Found; end Search_Task_In_Response_Times_Table; function Pred (My_System : System; tau_ij : Generic_Task_Ptr) return Generic_Task_Ptr is use Task_Dependencies.Half_Dep_Set; pred_ij : Generic_Task_Ptr; A_Task_Dependencies_Iterator : Tasks_Dependencies_Iterator; A_Half_Dep : Dependency_Ptr; begin if not is_empty(My_System.Dependencies.Depends) then reset_iterator(My_System.Dependencies.Depends, A_Task_Dependencies_Iterator); loop current_element(My_System.Dependencies.Depends, A_Half_Dep, A_Task_Dependencies_Iterator); if A_Half_Dep.type_of_dependency = Precedence_Dependency then if A_Half_Dep.precedence_sink.name = tau_ij.name then pred_ij := A_Half_Dep.precedence_source; return pred_ij; end if; end if; exit when is_last_element(My_system.Dependencies.Depends, A_Task_Dependencies_Iterator); next_element(My_System.Dependencies.Depends, A_Task_Dependencies_Iterator); end loop; end if; return null; end Pred; Response_Times_NIMP : Response_Time_Table; Response_Times_WCDOPS_P : Response_Time_Table; Total : Double; N : Integer; Average : Double; J : Integer; pred_ij : Generic_Task_Ptr; Ghost : constant String := "wcdops"; Output_File_Name : Unbounded_String := To_Unbounded_String("default.csv"); F : Ada.Text_IO.File_Type; Sys_Transaction : System; A_core1 : Core_Unit_Ptr; Cores1 : Core_Units_Table; A_core2 : Core_Unit_Ptr; Cores2 : Core_Units_Table; A_core3 : Core_Unit_Ptr; Cores3 : Core_Units_Table; No_core : Core_Unit_Ptr; No_cores : Core_Units_Table; New_Offset : Offset_Type_Ptr; New_Offset_Table : Offsets_Table_Ptr; -- Params S_Duration : constant Integer := 6157; B_Duration : constant Integer := 1310; T_Duration : constant Integer := 6157; Frame_Duration : constant Integer := S_Duration + 5 * B_Duration + 8 * T_Duration; C_Frame_Cycle_1 : constant Integer := 1050; C_Frame_Cycle_2 : constant Integer := 1100; C_Frame_Cycle_3 : constant Integer := 573; D_Frame_Cycle : constant Integer := 30000; C_Receive_Slot_1 : constant Integer := 144; D_Receive_Slot_B : constant Integer := 1200; D_Receive_Slot_T : constant Integer := 1200; C_Analyse_Beacon_1 : constant Integer := 500; C_Analyse_Beacon_2 : constant Integer := 1500; C_Analyse_Beacon_3 : constant Integer := 597; C_Analyse_Beacon_Total : constant Integer := C_Analyse_Beacon_1 + C_Analyse_Beacon_2 + C_Analyse_Beacon_3; D_Analyse_Beacon : constant Integer := 12000; C_Analyse_Data_1 : constant Integer := 651; D_Analyse_Data : constant Integer := 7500; C_Request_Message_1 : constant Integer := 50; D_Request_Message : constant Integer := 1200; C_Build_SSlot_1 : constant Integer := 7193; C_Build_SSlot_2 : constant Integer := 6000; C_Build_SSlot_3 : constant Integer := 663; D_Build_SSlot : constant Integer := 25000; C_Build_BSlot_1 : constant Integer := 1017; C_Build_BSlot_2 : constant Integer := 1100; C_Build_BSlot_3 : constant Integer := 563; D_Build_BSlot : constant Integer := 25000; C_Build_TSlot_1 : constant Integer := 463; D_Build_TSlot : constant Integer := 6000; Prio_Request_Message : constant Integer := 60; Prio_Receive_Slot : constant Integer := 60; Prio_Build_TSlot : constant Integer := 50; Prio_Analyse_Data : constant Integer := 40; Prio_Analyse_Beacon : constant Integer := 30; Prio_Build_SSlot : constant Integer := 20; Prio_Build_BSlot : constant Integer := 20; Prio_Frame_Cycle : constant Integer := 10; taskOffsetValue : Integer; begin Set_Initialize; Initialize(Sys_Transaction); -- Platform entities Add_core_unit(Sys_Transaction.core_units, a_core1, to_unbounded_string("black_core"), preemptive, 100, 1.0, 101, 102, 103, to_unbounded_string(""), Posix_1003_Highest_Priority_First_Protocol); add(Cores1, a_core1); Add_core_unit(Sys_Transaction.core_units, a_core2, to_unbounded_string("red_core"), preemptive, 100, 1.0, 101, 102, 103, to_unbounded_string(""), Posix_1003_Highest_Priority_First_Protocol); add(Cores2, a_core2); Add_core_unit(Sys_Transaction.core_units, a_core3, to_unbounded_string("dsp_core"), preemptive, 100, 1.0, 101, 102, 103, to_unbounded_string(""), Posix_1003_Highest_Priority_First_Protocol); add(Cores3, a_core3); Add_core_unit(Sys_Transaction.core_units, no_core, to_unbounded_string("no_core"), preemptive, 100, 1.0, 101, 102, 103, to_unbounded_string(""), Posix_1003_Highest_Priority_First_Protocol); add(No_cores, no_core); add_processor(Sys_Transaction.processors, to_unbounded_string("black_cpu"), to_unbounded_string("a_network"), Cores1); Add_Address_Space(Sys_Transaction.address_spaces, to_unbounded_string("black_addr"), to_unbounded_string("black_cpu"), 0, 0, 0, 0); add_processor(Sys_Transaction.processors, to_unbounded_string("red_cpu"), to_unbounded_string("a_network"), Cores2); Add_Address_Space(Sys_Transaction.address_spaces, to_unbounded_string("red_addr"), to_unbounded_string("red_cpu"), 0, 0, 0, 0); add_processor(Sys_Transaction.processors, to_unbounded_string("dsp"), to_unbounded_string("a_network"), Cores3); Add_Address_Space(Sys_Transaction.address_spaces, to_unbounded_string("dsp_addr"), to_unbounded_string("dsp"), 0, 0, 0, 0); add_processor(Sys_Transaction.processors, to_unbounded_string("no_cpu"), to_unbounded_string("a_network"), No_cores); Add_Address_Space(Sys_Transaction.address_spaces, to_unbounded_string("no_addr"), to_unbounded_string("no_cpu"), 0, 0, 0, 0); -- Task Groups Add_Task_Group (Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), Transaction_Type); -- Tasks -- ** Tick Ghost @ S1 ** New_Offset := new Offset_Type; New_Offset.offset_value := 0; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Tick"), to_unbounded_string("red_cpu"), to_unbounded_string("red_addr"), Periodic_Type, 0, -- start_time 0, -- capacity Frame_Duration, -- period 9999999, -- deadline 0, -- jitter 0, -- blocking 250, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); -- ** Frame_Cycle @ S1 ** New_Offset := new Offset_Type; New_Offset.offset_value := 0; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Frame_Cycle_S1_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Frame_Cycle_1, -- capacity Frame_Duration, -- period D_Frame_Cycle, -- deadline 0, -- jitter 0, -- blocking Prio_Frame_Cycle, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Tick")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Frame_Cycle_S1_1"))); New_Offset := new Offset_Type; New_Offset.offset_value := C_Frame_Cycle_1; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Frame_Cycle_S1_2"), to_unbounded_string("dsp"), to_unbounded_string("dsp_addr"), Periodic_Type, 0, -- start_time C_Frame_Cycle_2, -- capacity Frame_Duration, -- period D_Frame_Cycle, -- deadline 0, -- jitter 0, -- blocking 1, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Frame_Cycle_S1_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Frame_Cycle_S1_2"))); New_Offset := new Offset_Type; New_Offset.offset_value := C_Frame_Cycle_1 + C_Frame_Cycle_2; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Frame_Cycle_S1_3"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Frame_Cycle_3, -- capacity Frame_Duration, -- period D_Frame_Cycle, -- deadline 0, -- jitter 0, -- blocking 1, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Frame_Cycle_S1_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Frame_Cycle_S1_3"))); ------------ Receptions ------------ -- ** Receive_Slot @ B1 ** New_Offset := new Offset_Type; New_Offset.offset_value := S_Duration; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Receive_Slot_B1_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Receive_Slot_1, -- capacity Frame_Duration, -- period D_Receive_Slot_B + S_Duration, -- deadline 0, -- jitter 0, -- blocking Prio_Receive_Slot, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Tick")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Receive_Slot_B1_1"))); New_Offset := new Offset_Type; New_Offset.offset_value := S_Duration + C_Receive_Slot_1; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Analyse_Beacon_B1_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Analyse_Beacon_1, -- capacity Frame_Duration, -- period D_Analyse_Beacon + S_Duration + C_Receive_Slot_1, -- deadline 0, -- jitter 0, -- blocking Prio_Analyse_Beacon, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Receive_Slot_B1_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Beacon_B1_1"))); New_Offset := new Offset_Type; New_Offset.offset_value := S_Duration + C_Receive_Slot_1 + C_Analyse_Beacon_1; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Analyse_Beacon_B1_2"), to_unbounded_string("dsp"), to_unbounded_string("dsp_addr"), Periodic_Type, 0, -- start_time C_Analyse_Beacon_2, -- capacity Frame_Duration, -- period D_Analyse_Beacon + S_Duration + C_Receive_Slot_1, -- deadline 0, -- jitter 0, -- blocking Prio_Analyse_Beacon, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Beacon_B1_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Beacon_B1_2"))); New_Offset := new Offset_Type; New_Offset.offset_value := S_Duration + C_Receive_Slot_1 + C_Analyse_Beacon_1 + C_Analyse_Beacon_2; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Analyse_Beacon_B1_3"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Analyse_Beacon_3, -- capacity Frame_Duration, -- period D_Analyse_Beacon + S_Duration + C_Receive_Slot_1, -- deadline 0, -- jitter 0, -- blocking Prio_Analyse_Beacon, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Beacon_B1_2")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Beacon_B1_3"))); -- ** Receive_Slot @ B2 ** New_Offset := new Offset_Type; New_Offset.offset_value := S_Duration + 1 * B_Duration; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Receive_Slot_B2_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Receive_Slot_1, -- capacity Frame_Duration, -- period D_Receive_Slot_B + S_Duration + 1 * B_Duration, -- deadline 0, -- jitter 0, -- blocking Prio_Receive_Slot, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Receive_Slot_B1_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Receive_Slot_B2_1"))); New_Offset := new Offset_Type; New_Offset.offset_value := S_Duration + C_Receive_Slot_1 + C_Analyse_Beacon_Total * 1; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Analyse_Beacon_B2_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Analyse_Beacon_1, -- capacity Frame_Duration, -- period D_Analyse_Beacon + S_Duration + C_Receive_Slot_1 + C_Analyse_Beacon_Total * 1, -- deadline 0, -- jitter 0, -- blocking Prio_Analyse_Beacon, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Beacon_B1_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Beacon_B2_1"))); New_Offset := new Offset_Type; New_Offset.offset_value := S_Duration + C_Receive_Slot_1 + C_Analyse_Beacon_Total * 1 + C_Analyse_Beacon_1; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Analyse_Beacon_B2_2"), to_unbounded_string("dsp"), to_unbounded_string("dsp_addr"), Periodic_Type, 0, -- start_time C_Analyse_Beacon_2, -- capacity Frame_Duration, -- period D_Analyse_Beacon + S_Duration + C_Receive_Slot_1 + C_Analyse_Beacon_Total * 1, -- deadline 0, -- jitter 0, -- blocking Prio_Analyse_Beacon, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Beacon_B2_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Beacon_B2_2"))); New_Offset := new Offset_Type; New_Offset.offset_value := S_Duration + C_Receive_Slot_1 + C_Analyse_Beacon_Total * 1 + C_Analyse_Beacon_1 + C_Analyse_Beacon_2; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Analyse_Beacon_B2_3"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Analyse_Beacon_3, -- capacity Frame_Duration, -- period D_Analyse_Beacon + S_Duration + C_Receive_Slot_1 + C_Analyse_Beacon_Total * 1, -- deadline 0, -- jitter 0, -- blocking Prio_Analyse_Beacon, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Beacon_B2_2")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Beacon_B2_3"))); -- ** Receive_Slot @ B3 ** New_Offset := new Offset_Type; New_Offset.offset_value := S_Duration + 2 * B_Duration; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Receive_Slot_B3_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Receive_Slot_1, -- capacity Frame_Duration, -- period D_Receive_Slot_B + S_Duration + 2 * B_Duration, -- deadline 0, -- jitter 0, -- blocking Prio_Receive_Slot, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Receive_Slot_B2_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Receive_Slot_B3_1"))); New_Offset := new Offset_Type; New_Offset.offset_value := S_Duration + C_Receive_Slot_1 + C_Analyse_Beacon_Total * 2; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Analyse_Beacon_B3_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Analyse_Beacon_1, -- capacity Frame_Duration, -- period D_Analyse_Beacon + S_Duration + C_Receive_Slot_1 + C_Analyse_Beacon_Total * 2, -- deadline 0, -- jitter 0, -- blocking Prio_Analyse_Beacon, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Beacon_B2_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Beacon_B3_1"))); New_Offset := new Offset_Type; New_Offset.offset_value := S_Duration + C_Receive_Slot_1 + C_Analyse_Beacon_Total * 2 + C_Analyse_Beacon_1; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Analyse_Beacon_B3_2"), to_unbounded_string("dsp"), to_unbounded_string("dsp_addr"), Periodic_Type, 0, -- start_time C_Analyse_Beacon_2, -- capacity Frame_Duration, -- period D_Analyse_Beacon + S_Duration + C_Receive_Slot_1 + C_Analyse_Beacon_Total * 2, -- deadline 0, -- jitter 0, -- blocking Prio_Analyse_Beacon, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Beacon_B3_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Beacon_B3_2"))); New_Offset := new Offset_Type; New_Offset.offset_value := S_Duration + C_Receive_Slot_1 + C_Analyse_Beacon_Total * 2 + C_Analyse_Beacon_1 + C_Analyse_Beacon_2; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Analyse_Beacon_B3_3"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Analyse_Beacon_3, -- capacity Frame_Duration, -- period D_Analyse_Beacon + S_Duration + 2 * B_Duration, -- deadline 0, -- jitter 0, -- blocking Prio_Analyse_Beacon, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Beacon_B3_2")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Beacon_B3_3"))); -- ** Receive_Slot @ B4 ** New_Offset := new Offset_Type; New_Offset.offset_value := S_Duration + 3 * B_Duration; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Receive_Slot_B4_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Receive_Slot_1, -- capacity Frame_Duration, -- period D_Receive_Slot_B + S_Duration + 3 * B_Duration, -- deadline 0, -- jitter 0, -- blocking Prio_Receive_Slot, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Receive_Slot_B3_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Receive_Slot_B4_1"))); New_Offset := new Offset_Type; New_Offset.offset_value := S_Duration + C_Receive_Slot_1 + C_Analyse_Beacon_Total * 3; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Analyse_Beacon_B4_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Analyse_Beacon_1, -- capacity Frame_Duration, -- period D_Analyse_Beacon + S_Duration + C_Receive_Slot_1 + C_Analyse_Beacon_Total * 3, -- deadline 0, -- jitter 0, -- blocking Prio_Analyse_Beacon, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Beacon_B3_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Beacon_B4_1"))); New_Offset := new Offset_Type; New_Offset.offset_value := S_Duration + C_Receive_Slot_1 + C_Analyse_Beacon_Total * 3 + C_Analyse_Beacon_1; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Analyse_Beacon_B4_2"), to_unbounded_string("dsp"), to_unbounded_string("dsp_addr"), Periodic_Type, 0, -- start_time C_Analyse_Beacon_2, -- capacity Frame_Duration, -- period D_Analyse_Beacon + S_Duration + C_Receive_Slot_1 + C_Analyse_Beacon_Total * 3, -- deadline 0, -- jitter 0, -- blocking Prio_Analyse_Beacon, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Beacon_B4_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Beacon_B4_2"))); New_Offset := new Offset_Type; New_Offset.offset_value := S_Duration + C_Receive_Slot_1 + C_Analyse_Beacon_Total * 3 + C_Analyse_Beacon_1 + C_Analyse_Beacon_2; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Analyse_Beacon_B4_3"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Analyse_Beacon_3, -- capacity Frame_Duration, -- period D_Analyse_Beacon + S_Duration + C_Receive_Slot_1 + C_Analyse_Beacon_Total * 3, -- deadline 0, -- jitter 0, -- blocking Prio_Analyse_Beacon, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Beacon_B4_2")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Beacon_B4_3"))); -- ** Receive_Slot @ T2 ** New_Offset := new Offset_Type; New_Offset.offset_value := S_Duration + 5 * B_Duration + 1 * T_Duration; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Receive_Slot_T2_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Receive_Slot_1, -- capacity Frame_Duration, -- period D_Receive_Slot_T + S_Duration + 5 * B_Duration + 1 * T_Duration, -- deadline 0, -- jitter 0, -- blocking Prio_Receive_Slot, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Receive_Slot_B4_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Receive_Slot_T2_1"))); New_Offset := new Offset_Type; New_Offset.offset_value := S_Duration + 5 * B_Duration + 1 * T_Duration + C_Receive_Slot_1; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Analyse_Data_T2_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Analyse_Data_1, -- capacity Frame_Duration, -- period D_Analyse_Data + S_Duration + 5 * B_Duration + 1 * T_Duration, -- deadline 0, -- jitter 0, -- blocking Prio_Analyse_Data, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Receive_Slot_T2_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Data_T2_1"))); -- ** Receive_Slot @ T4 ** New_Offset := new Offset_Type; New_Offset.offset_value := S_Duration + 5 * B_Duration + 3 * T_Duration; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Receive_Slot_T4_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Receive_Slot_1, -- capacity Frame_Duration, -- period D_Receive_Slot_T + S_Duration + 5 * B_Duration + 3 * T_Duration, -- deadline 0, -- jitter 0, -- blocking Prio_Receive_Slot, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Receive_Slot_T2_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Receive_Slot_T4_1"))); New_Offset := new Offset_Type; New_Offset.offset_value := S_Duration + 5 * B_Duration + 3 * T_Duration + C_Receive_Slot_1; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Analyse_Data_T4_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Analyse_Data_1, -- capacity Frame_Duration, -- period D_Analyse_Data + S_Duration + 5 * B_Duration + 3 * T_Duration, -- deadline 0, -- jitter 0, -- blocking Prio_Analyse_Data, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Receive_Slot_T4_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Data_T4_1"))); -- ** Receive_Slot @ T6 ** New_Offset := new Offset_Type; New_Offset.offset_value := S_Duration + 5 * B_Duration + 5 * T_Duration; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Receive_Slot_T6_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Receive_Slot_1, -- capacity Frame_Duration, -- period D_Receive_Slot_T + S_Duration + 5 * B_Duration + 5 * T_Duration, -- deadline 0, -- jitter 0, -- blocking Prio_Receive_Slot, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Receive_Slot_T4_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Receive_Slot_T6_1"))); New_Offset := new Offset_Type; New_Offset.offset_value := S_Duration + 5 * B_Duration + 5 * T_Duration + C_Receive_Slot_1; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Analyse_Data_T6_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Analyse_Data_1, -- capacity Frame_Duration, -- period D_Analyse_Data + S_Duration + 5 * B_Duration + 5 * T_Duration, -- deadline 0, -- jitter 0, -- blocking Prio_Analyse_Data, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Receive_Slot_T6_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Data_T6_1"))); -- ** Receive_Slot @ T8 ** New_Offset := new Offset_Type; New_Offset.offset_value := S_Duration + 5 * B_Duration + 7 * T_Duration; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Receive_Slot_T8_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Receive_Slot_1, -- capacity Frame_Duration, -- period D_Receive_Slot_T + S_Duration + 5 * B_Duration + 7 * T_Duration, -- deadline 0, -- jitter 0, -- blocking Prio_Receive_Slot, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Receive_Slot_T6_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Receive_Slot_T8_1"))); New_Offset := new Offset_Type; New_Offset.offset_value := S_Duration + 5 * B_Duration + 7 * T_Duration + C_Receive_Slot_1; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Analyse_Data_T8_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Analyse_Data_1, -- capacity Frame_Duration, -- period D_Analyse_Data + S_Duration + 5 * B_Duration + 7 * T_Duration, -- deadline 0, -- jitter 0, -- blocking Prio_Analyse_Data, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Receive_Slot_T8_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Analyse_Data_T8_1"))); ------------ Transmissions ------------ -- ** Request_Message -> Build_TSlot @ T1 Start - Total Deadline ** New_Offset := new Offset_Type; New_Offset.offset_value := (S_Duration + 5 * B_Duration + 0 * T_Duration - D_Build_TSlot - D_Request_Message); New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Request_Message_T1_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Request_Message_1, -- capacity Frame_Duration, -- period D_Request_Message + (S_Duration + 5 * B_Duration + 0 * T_Duration - D_Build_TSlot - D_Request_Message), -- deadline 0, -- jitter 0, -- blocking Prio_Request_Message, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Tick")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Request_Message_T1_1"))); New_Offset := new Offset_Type; New_Offset.offset_value := (S_Duration + 5 * B_Duration + 0 * T_Duration - D_Build_TSlot - D_Request_Message) + C_Receive_Slot_1; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Build_TSlot_T1_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Build_TSlot_1, -- capacity Frame_Duration, -- period D_Build_TSlot + (S_Duration + 5 * B_Duration + 0 * T_Duration - D_Build_TSlot - D_Request_Message) + C_Receive_Slot_1, -- deadline 0, -- jitter 0, -- blocking Prio_Build_TSlot, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Request_Message_T1_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Build_TSlot_T1_1"))); -- ** Request_Message @ T3 ** New_Offset := new Offset_Type; New_Offset.offset_value := (S_Duration + 5 * B_Duration + 2 * T_Duration - D_Build_TSlot - D_Request_Message); New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Request_Message_T3_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Request_Message_1, -- capacity Frame_Duration, -- period D_Request_Message + (S_Duration + 5 * B_Duration + 2 * T_Duration - D_Build_TSlot - D_Request_Message), -- deadline 0, -- jitter 0, -- blocking Prio_Request_Message, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Request_Message_T1_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Request_Message_T3_1"))); New_Offset := new Offset_Type; New_Offset.offset_value := (S_Duration + 5 * B_Duration + 2 * T_Duration - D_Build_TSlot - D_Request_Message) + C_Receive_Slot_1; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Build_TSlot_T3_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Build_TSlot_1, -- capacity Frame_Duration, -- period D_Build_TSlot + (S_Duration + 5 * B_Duration + 2 * T_Duration - D_Build_TSlot - D_Request_Message) + C_Receive_Slot_1, -- deadline 0, -- jitter 0, -- blocking Prio_Build_TSlot, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Request_Message_T3_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Build_TSlot_T3_1"))); -- ** Request_Message @ T5 ** New_Offset := new Offset_Type; New_Offset.offset_value := (S_Duration + 5 * B_Duration + 4 * T_Duration - D_Build_TSlot - D_Request_Message); New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Request_Message_T5_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Request_Message_1, -- capacity Frame_Duration, -- period D_Request_Message + (S_Duration + 5 * B_Duration + 4 * T_Duration - D_Build_TSlot - D_Request_Message), -- deadline 0, -- jitter 0, -- blocking Prio_Request_Message, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Request_Message_T3_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Request_Message_T5_1"))); New_Offset := new Offset_Type; New_Offset.offset_value := (S_Duration + 5 * B_Duration + 4 * T_Duration - D_Build_TSlot - D_Request_Message) + C_Receive_Slot_1; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Build_TSlot_T5_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Build_TSlot_1, -- capacity Frame_Duration, -- period D_Build_TSlot + (S_Duration + 5 * B_Duration + 4 * T_Duration - D_Build_TSlot - D_Request_Message) + C_Receive_Slot_1, -- deadline 0, -- jitter 0, -- blocking Prio_Build_TSlot, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Request_Message_T5_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Build_TSlot_T5_1"))); -- ** Request_Message -> Build_SSlot @ Next S1 Start - Total Deadline ** New_Offset := new Offset_Type; New_Offset.offset_value := (Frame_Duration - D_Build_SSlot - D_Request_Message); New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Request_Message_S1_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Request_Message_1, -- capacity Frame_Duration, -- period D_Request_Message + (Frame_Duration - D_Build_SSlot - D_Request_Message), -- deadline 0, -- jitter 0, -- blocking Prio_Request_Message, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Request_Message_T5_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Request_Message_S1_1"))); New_Offset := new Offset_Type; New_Offset.offset_value := (Frame_Duration - D_Build_SSlot - D_Request_Message) + C_Request_Message_1; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Build_SSlot_S1_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Build_SSlot_1, -- capacity Frame_Duration, -- period D_Build_SSlot + (Frame_Duration - D_Build_SSlot - D_Request_Message) + C_Request_Message_1, -- deadline 0, -- jitter 0, -- blocking Prio_Build_SSlot, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Request_Message_S1_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Build_SSlot_S1_1"))); New_Offset := new Offset_Type; New_Offset.offset_value := (Frame_Duration - D_Build_SSlot - D_Request_Message) + C_Request_Message_1 + C_Build_SSlot_1; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Build_SSlot_S1_2"), to_unbounded_string("dsp"), to_unbounded_string("dsp_addr"), Periodic_Type, 0, -- start_time C_Build_SSlot_2, -- capacity Frame_Duration, -- period D_Build_SSlot + (Frame_Duration - D_Build_SSlot - D_Request_Message) + C_Request_Message_1, -- deadline 0, -- jitter 0, -- blocking Prio_Build_SSlot, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Build_SSlot_S1_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Build_SSlot_S1_2"))); New_Offset := new Offset_Type; New_Offset.offset_value := (Frame_Duration - D_Build_SSlot - D_Request_Message) + C_Request_Message_1 + C_Build_SSlot_1 + C_Build_SSlot_2; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Build_SSlot_S1_3"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Build_SSlot_3, -- capacity Frame_Duration, -- period D_Build_SSlot + (Frame_Duration - D_Build_SSlot - D_Request_Message) + C_Request_Message_1, -- deadline 0, -- jitter 0, -- blocking Prio_Build_SSlot, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Build_SSlot_S1_2")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Build_SSlot_S1_3"))); -- ** Request_Message @ T7 ** New_Offset := new Offset_Type; New_Offset.offset_value := (S_Duration + 5 * B_Duration + 6 * T_Duration - D_Build_TSlot - D_Request_Message); New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Request_Message_T7_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Request_Message_1, -- capacity Frame_Duration, -- period D_Request_Message + (S_Duration + 5 * B_Duration + 6 * T_Duration - D_Build_TSlot - D_Request_Message), -- deadline 0, -- jitter 0, -- blocking Prio_Request_Message, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Request_Message_S1_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Request_Message_T7_1"))); New_Offset := new Offset_Type; New_Offset.offset_value := (S_Duration + 5 * B_Duration + 6 * T_Duration - D_Build_TSlot - D_Request_Message) + C_Receive_Slot_1; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Build_TSlot_T7_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Build_TSlot_1, -- capacity Frame_Duration, -- period D_Build_TSlot + (S_Duration + 5 * B_Duration + 6 * T_Duration - D_Build_TSlot - D_Request_Message), -- deadline 0, -- jitter 0, -- blocking Prio_Build_TSlot, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Request_Message_T7_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Build_TSlot_T7_1"))); -- ** Request_Message -> Build_BSlot @ Next B5 Start - Total Deadline ** New_Offset := new Offset_Type; New_Offset.offset_value := (Frame_Duration + S_Duration + 4* B_Duration - D_Build_BSlot - D_Request_Message); New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Request_Message_B5_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Request_Message_1, -- capacity Frame_Duration, -- period D_Request_Message + Frame_Duration - D_Build_BSlot - D_Request_Message, -- deadline 0, -- jitter 0, -- blocking Prio_Request_Message, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Request_Message_T7_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Request_Message_B5_1"))); New_Offset := new Offset_Type; New_Offset.offset_value := (Frame_Duration + S_Duration + 4* B_Duration - D_Build_BSlot - D_Request_Message) + C_Request_Message_1; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Build_BSlot_B5_1"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Build_BSlot_1, -- capacity Frame_Duration, -- period D_Build_BSlot + (Frame_Duration + S_Duration + 4* B_Duration - D_Build_BSlot - D_Request_Message) + C_Request_Message_1, -- deadline 0, -- jitter 0, -- blocking Prio_Build_BSlot, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Request_Message_B5_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Build_BSlot_B5_1"))); New_Offset := new Offset_Type; New_Offset.offset_value := (Frame_Duration + S_Duration + 4* B_Duration - D_Build_BSlot - D_Request_Message) + C_Request_Message_1 + C_Build_BSlot_1; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Build_BSlot_B5_2"), to_unbounded_string("dsp"), to_unbounded_string("dsp_addr"), Periodic_Type, 0, -- start_time C_Build_BSlot_2, -- capacity Frame_Duration, -- period D_Build_BSlot + (Frame_Duration + S_Duration + 4* B_Duration - D_Build_BSlot - D_Request_Message) + C_Request_Message_1, -- deadline 0, -- jitter 0, -- blocking Prio_Build_BSlot, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Build_BSlot_B5_1")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Build_BSlot_B5_2"))); New_Offset := new Offset_Type; New_Offset.offset_value := (Frame_Duration + S_Duration + 4* B_Duration - D_Build_BSlot - D_Request_Message) + C_Request_Message_1 + C_Build_BSlot_1 + C_Build_BSlot_2; New_Offset.activation := 0; New_Offset_Table := new Offsets_Table; Offsets_Table_Package.Add (New_Offset_Table.all, New_Offset.all); Add_Task (Sys_Transaction.Tasks, Sys_Transaction.Task_Groups, To_Unbounded_String("TDMA_Frame"), To_Unbounded_String("Build_BSlot_B5_3"), to_unbounded_string("black_cpu"), to_unbounded_string("black_addr"), Periodic_Type, 0, -- start_time C_Build_BSlot_3, -- capacity Frame_Duration, -- period D_Build_BSlot + (Frame_Duration + S_Duration + 4* B_Duration - D_Build_BSlot - D_Request_Message) + C_Request_Message_1, -- deadline 0, -- jitter 0, -- blocking Prio_Build_BSlot, -- priority 0, -- criticality SCHED_FIFO, New_Offset_Table.all); Add_One_Task_Dependency (Sys_Transaction.Dependencies, Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Build_BSlot_B5_2")), Search_Task(Sys_Transaction.Tasks, To_Unbounded_String("Build_BSlot_B5_3"))); Write_To_Xml_File(Sys_Transaction, To_Unbounded_String ("tdma_mac_full_tx.xml")); WCDOPS_Plus_NIMP(Sys_Transaction, Response_Times_NIMP, True); for i in 0 .. Response_Times_NIMP.nb_entries - 1 loop taskOffsetValue := Periodic_Task_Ptr(Response_Times_NIMP.entries(i).item).offsets.Entries(0).offset_value; put_line(to_string(Response_Times_NIMP.entries(i).item.name) & ";" & taskOffsetValue'Img & ";" & Integer(Response_Times_NIMP.entries(i).data)'Img); end loop; -- Add_Delta_Tasks(Sys_Transaction); -- WCDOPS_Plus_NIMP(Sys_Transaction, Response_Times_WCDOPS_P, True); -- -- J := 0; -- N := 0; -- Total := 0.0; -- for i in 0 .. Response_Times_WCDOPS_P.nb_entries - 1 loop -- if not (to_string(Response_Times_WCDOPS_P.entries(i).item.name)'Length >= Ghost'Length and then to_string(Response_Times_WCDOPS_P.entries(i).item.name) (to_string(Response_Times_WCDOPS_P.entries(i).item.name)'First .. to_string(Response_Times_WCDOPS_P.entries(i).item.name)'First + Ghost'Length - 1) = Ghost) then -- pred_ij := pred(Sys_Transaction, Response_Times_WCDOPS_P.entries(i).item); -- -- -- If predecessor is a delta task, then the task is non-immediate. -- -- We then compute its response times ratio: WCDOPS+ / NIMP -- --if pred_ij /= null and then (to_string(pred_ij.name)'Length >= Ghost'Length and then to_string(pred_ij.name) (to_string(pred_ij.name)'First .. to_string(pred_ij.name)'First + Ghost'Length - 1) = Ghost) then -- J := Search_Task_In_Response_Times_Table(Response_Times_NIMP, Response_Times_WCDOPS_P.entries(i).item.name); -- -- if Response_Times_WCDOPS_P.entries(i).data /= 0.0 then -- Total := Total + Response_Times_WCDOPS_P.entries(i).data / Response_Times_NIMP.entries(Double_Tasks_Parameters_Package.Indexed_Table_Range(j)).data; -- N := N + 1; -- end if; -- --end if; -- end if; -- end loop; -- Average := 0.0; -- if N > 0 then -- Average := Total / Double(N); -- end if; -- -- for i in 0 .. Response_Times_NIMP.nb_entries - 1 loop -- put_line(to_string(Response_Times_NIMP.entries(i).item.name) & " " & to_string(suppress_space("(" & Periodic_Task_Ptr(Response_Times_NIMP.entries(i).item).jitter'Img)) & ") = " & Integer(Response_Times_NIMP.entries(i).data)'Img); -- put_line("============="); -- end loop; -- -- put_line("*** Average = " & Average'Img); -- -- for i in 0 .. Response_Times_WCDOPS_P.nb_entries - 1 loop -- put_line(to_string(Response_Times_WCDOPS_P.entries(i).item.name) & " " & to_string(suppress_space("(" & Periodic_Task_Ptr(Response_Times_WCDOPS_P.entries(i).item).jitter'Img)) & ") = " & Integer(Response_Times_WCDOPS_P.entries(i).data)'Img); -- put_line("============="); -- end loop; -- end TDMA_Mac;