Commit 3a171a34 authored by Maxime Perrotin's avatar Maxime Perrotin
Browse files

Prepare the support of timers

parent 78e61a9b
......@@ -10,21 +10,21 @@ use TASTE.AADL_Parser,
procedure Kazoo is
begin
declare
Model : constant TASTE_Model := Parse_Project;
Transformed : TASTE_Model := Model.Transform;
Model : TASTE_Model := Parse_Project;
begin
if Model.Configuration.Debug_Flag then
TASTE.Dump.Dump_Input_Model (Model);
Transformed.Dump;
Model.Dump;
end if;
if Transformed.Configuration.Glue then
Transformed.Add_Concurrency_View;
Transformed.Concurrency_View.Generate_CV;
if Model.Configuration.Glue then
Model.Preprocessing;
Model.Add_Concurrency_View;
Model.Concurrency_View.Generate_CV;
end if;
Transformed.Generate_Build_Script;
Transformed.Generate_Code;
Model.Generate_Build_Script;
Model.Generate_Code;
end;
exception
when TASTE.Quit_TASTE =>
......
......@@ -711,13 +711,15 @@ package body TASTE.AADL_Parser is
return New_Functions;
end Process_Function;
function Transform (Model : TASTE_Model) return TASTE_Model is
Result : TASTE_Model := Model;
procedure Preprocessing (Model : in out TASTE_Model) is
New_Functions : Function_Maps.Map;
DV : Complete_Deployment_View := Model.Deployment_View.Element;
use Remote_Entities,
Parameters;
begin
-- Processing of user-defined functions (may return a list of new
-- functions that will be added to the model)
for F of Result.Interface_View.Flat_Functions loop
for F of Model.Interface_View.Flat_Functions loop
declare
Funcs : constant Function_Maps.Map := Process_Function (F);
begin
......@@ -727,7 +729,221 @@ package body TASTE.AADL_Parser is
end loop;
end;
end loop;
return Result;
end Transform;
-- For each partition generate a timer manager if needed
for Node : Taste_Node of DV.Nodes loop
for Partition : Taste_Partition of Node.Partitions loop
declare
Manager_Name : constant String :=
To_String (Partition.Name) & "_Timer_Manager";
Tick_PI : constant Taste_Interface :=
(Name => US ("Tick"),
Parent_Function => US (Manager_Name),
Language => US ("Timer_Manager"),
RCM => Cyclic_Operation,
Period_Or_MIAT => 10, -- Configurable parameter?
others => <>);
Timer_Manager : Taste_Terminal_Function :=
(Name => US (Manager_Name),
Language => US ("Timer_Manager"),
others => <>);
Need_Timer_Manager : Boolean := False;
begin
Timer_Manager.Provided.Insert (Key => Manager_Name,
New_Item => Tick_PI);
for Function_Name : String of Partition.Bound_Functions loop
for Timer_Name : String of
Model.Interface_View.Flat_Functions (Function_Name).Timers
loop
Need_Timer_Manager := True;
declare
Name_In_Manager : constant String :=
Function_Name & "_" & Timer_Name;
Manager_As_Remote : constant Remote_Entity :=
(Function_Name => Timer_Manager.Name,
Interface_Name => US (Name_In_Manager));
Function_As_Remote : constant Remote_Entity :=
(Function_Name => US (Function_Name),
Interface_Name => US (Timer_Name));
Timer_PI : constant Taste_Interface :=
(Name => US (Timer_Name),
Parent_Function => US (Function_Name),
Language =>
Model.Interface_View.Flat_Functions
(Function_Name).Language,
Remote_Interfaces =>
Remote_Entities.Empty_Vector & Manager_As_Remote,
Params => Parameters.Empty_Vector,
RCM => Sporadic_Operation,
Period_Or_Miat => 1,
Is_Timer => True,
others => <>);
Timer_RI : constant Taste_Interface :=
(Name => US (Name_In_Manager),
Parent_Function => US (Manager_Name),
Language => US ("Timer_Manager"),
Remote_Interfaces =>
Remote_Entities.Empty_Vector & Function_As_Remote,
Params => Parameters.Empty_Vector,
RCM => Sporadic_Operation,
Period_Or_Miat => 1,
others => <>);
-- Define protected functions to SET/RESET the timer
Set_Name_In_Manager : constant String :=
Function_Name & "_SET_" & Timer_Name;
Reset_Name_In_Manager : constant String :=
Function_Name & "_RESET_" & Timer_Name;
Set_Name_In_Function : constant String :=
"SET_" & Timer_Name;
Reset_Name_In_Function : constant String :=
"RESET_" & Timer_Name;
Set_PI_In_Manager : constant Taste_Interface :=
(Name => US (Set_Name_In_Manager),
Parent_Function => US (Manager_Name),
Language => US ("Timer_Manager"),
Remote_Interfaces => Remote_Entities.Empty_Vector &
(Function_Name => US (Function_Name),
Interface_Name => US (Set_Name_In_Function)),
Params => Parameters.Empty_Vector &
(Name => US ("Val"),
Sort => US ("T_UInt32"),
ASN1_Basic_Type => ASN1_Integer,
ASN1_Module => US ("TASTE_BasicTypes"),
ASN1_File_Name => US ("taste-types.asn"),
Encoding => Native,
Direction => Param_In),
RCM => Protected_Operation,
Period_Or_Miat => 1,
others => <>);
Reset_PI_In_Manager : constant Taste_Interface :=
(Name => US (Reset_Name_In_Manager),
Parent_Function => US (Manager_Name),
Language => US ("Timer_Manager"),
Remote_Interfaces => Remote_Entities.Empty_Vector &
(Function_Name => US (Function_Name),
Interface_Name => US (Reset_Name_In_Function)),
Params => Parameters.Empty_Vector,
RCM => Protected_Operation,
Period_Or_Miat => 1,
others => <>);
Set_RI_In_Function : constant Taste_Interface :=
(Name => US (Set_Name_In_Function),
Parent_Function => US (Function_Name),
Language =>
Model.Interface_View.Flat_Functions
(Function_Name).Language,
Remote_Interfaces => Remote_Entities.Empty_Vector &
(Function_Name => US (Manager_Name),
Interface_Name => US (Set_Name_In_Manager)),
Params => Parameters.Empty_Vector &
(Name => US ("Val"),
Sort => US ("T_UInt32"),
ASN1_Basic_Type => ASN1_Integer,
ASN1_Module => US ("TASTE_BasicTypes"),
ASN1_File_Name => US ("taste-types.asn"),
Encoding => Native,
Direction => Param_In),
RCM => Protected_Operation,
Is_Timer => True,
Period_Or_Miat => 1,
others => <>);
Reset_RI_In_Function : constant Taste_Interface :=
(Name => US (Reset_Name_In_Function),
Parent_Function => US (Function_Name),
Language =>
Model.Interface_View.Flat_Functions
(Function_Name).Language,
Remote_Interfaces => Remote_Entities.Empty_Vector &
(Function_Name => US (Manager_Name),
Interface_Name => US (Reset_Name_In_Manager)),
Params => Parameters.Empty_Vector,
RCM => Protected_Operation,
Period_Or_Miat => 1,
Is_Timer => True,
others => <>);
-- Create the connections in the interface view
Conn_Expire : constant Connection :=
(Caller => US (Manager_Name),
Callee => US (Function_Name),
RI_Name => US (Name_In_Manager),
PI_Name => US (Timer_Name),
Channels => String_Vectors.Empty_Vector);
Conn_Set : constant Connection :=
(Caller => US (Function_Name),
Callee => US (Manager_Name),
RI_Name => US (Set_Name_In_Function),
PI_Name => US (Set_Name_In_Manager),
Channels => String_Vectors.Empty_Vector);
Conn_Reset : constant Connection :=
(Caller => US (Function_Name),
Callee => US (Manager_Name),
RI_Name => US (Reset_Name_In_Function),
PI_Name => US (Reset_Name_In_Manager),
Channels => String_Vectors.Empty_Vector);
begin
-- Add timer expiration sporadic PI to the function
-- (modify the interface view in place)
Model.Interface_View.Flat_Functions (Function_Name)
.Provided.Insert (Key => Timer_Name,
New_Item => Timer_PI);
-- Add corresponding RI in the timer manager
Timer_Manager.Required.Insert (Key => Name_In_Manager,
New_Item => Timer_RI);
-- Add Set/Reset required interfaces to the function
Model.Interface_View.Flat_Functions (Function_Name)
.Required.Insert (Key => Set_Name_In_Function,
New_Item => Set_RI_In_Function);
Model.Interface_View.Flat_Functions (Function_Name)
.Required.Insert (Key => Reset_Name_In_Function,
New_Item => Reset_RI_In_Function);
-- Add corresponding Set/Reset PIs in the manager
Timer_Manager.Provided.Insert
(Key => Set_Name_In_Manager,
New_Item => Set_PI_In_Manager);
Timer_Manager.Provided.Insert
(Key => Reset_Name_In_Manager,
New_Item => Reset_PI_In_Manager);
Model.Interface_View.Connections.Append (Conn_Expire);
Model.Interface_View.Connections.Append (Conn_Set);
Model.Interface_View.Connections.Append (Conn_Reset);
end;
end loop;
end loop;
if Need_Timer_Manager then
-- Add the timer manager to the interface view
Model.Interface_View.Flat_Functions.Insert
(Key => Manager_Name,
New_Item => Timer_Manager);
-- Bind it in the deployment view
Partition.Bound_Functions.Insert (Manager_Name);
end if;
end;
end loop;
end loop;
Model.Deployment_View.Replace_Element (DV);
end Preprocessing;
end TASTE.AADL_Parser;
......@@ -38,7 +38,8 @@ package TASTE.AADL_Parser is
-- Transform: add Poll cyclic in GUIs, manage timers and taste api
-- This function can be called if there is a deployment view
function Transform (Model : TASTE_Model) return TASTE_Model;
procedure Preprocessing (Model : in out TASTE_Model)
with Pre => not Model.Deployment_View.Is_Empty;
-- Create the concurrency view and apply the templates for code generation
procedure Add_Concurrency_View (Model : in out TASTE_Model)
......
......@@ -465,7 +465,7 @@ package body TASTE.Backend.Code_Generators is
-- They are added here. At the moment the user-defined properties
-- of the interfaces themselves are not part of the template
-- This could be be added later if needed.
Interface_Tmplt := Each.To_Template
Interface_Tmplt := Each.Interface_To_Template
& Assoc ("Direction", "PI")
& Assoc ("Property_Names", Property_Names)
& Assoc ("Property_Values", Property_Values)
......@@ -474,15 +474,17 @@ package body TASTE.Backend.Code_Generators is
List_Of_PIs := List_Of_PIs & Each.Name;
case Each.RCM is
when Cyclic_Operation | Sporadic_Operation =>
List_Of_ASync_PIs := List_Of_ASync_PIs & Each.Name;
if not Each.Params.Is_Empty then
ASync_PI_Param_Name := ASync_PI_Param_Name
& Each.Params.First_Element.Name;
ASync_PI_Param_Type := ASync_PI_Param_Type &
Each.Params.First_Element.Sort;
else
ASync_PI_Param_Name := ASync_PI_Param_Name & "";
ASync_PI_Param_Type := ASync_PI_Param_Type & "";
if not Each.Is_Timer then
List_Of_ASync_PIs := List_Of_ASync_PIs & Each.Name;
if not Each.Params.Is_Empty then
ASync_PI_Param_Name := ASync_PI_Param_Name
& Each.Params.First_Element.Name;
ASync_PI_Param_Type := ASync_PI_Param_Type &
Each.Params.First_Element.Sort;
else
ASync_PI_Param_Name := ASync_PI_Param_Name & "";
ASync_PI_Param_Type := ASync_PI_Param_Type & "";
end if;
end if;
when others =>
List_Of_Sync_PIs := List_Of_Sync_PIs & Each.Name;
......@@ -494,7 +496,7 @@ package body TASTE.Backend.Code_Generators is
-- Add list of all RI names (both synchronous and asynchronous)
for Each of F.Required loop
Interface_Tmplt := Each.To_Template
Interface_Tmplt := Each.Interface_To_Template
& Assoc ("Direction", "RI")
& Assoc ("Property_Names", Property_Names)
& Assoc ("Property_Values", Property_Values)
......
......@@ -26,5 +26,5 @@ package TASTE.Backend is
elsif Func.Language = "vhdl" then "VHDL"
elsif Func.Language = "vhdl_brave" then "VHDL_BRAVE"
elsif Func.Language = "micropython" then "MicroPython"
else "None");
else To_String (Func.Language));
end TASTE.Backend;
......@@ -88,7 +88,7 @@ package body TASTE.Concurrency_View is
for PI of B.Provided loop
declare
Basic : constant Translate_Set := PI.PI.To_Template
Basic : constant Translate_Set := PI.PI.Interface_To_Template
& Assoc ("Protected_Block_Name", To_String (PI.Name))
& Assoc ("Caller_Is_Local", PI.Local_Caller)
& Assoc ("Calling_Threads", Calling_Threads);
......@@ -102,7 +102,7 @@ package body TASTE.Concurrency_View is
end loop;
for RI of B.Required loop
Result.Required.Append (RI.To_Template
Result.Required.Append (RI.Interface_To_Template
& Assoc ("Calling_Threads", Calling_Threads));
end loop;
......@@ -139,7 +139,7 @@ package body TASTE.Concurrency_View is
end loop;
return Result : constant Translate_Set :=
T.PI.To_Template -- Template of the PI used to create the thread
T.PI.Interface_To_Template -- PI used to create the thread
& Assoc ("Thread_Name", To_String (T.Name))
& Assoc ("Partition_Name", To_String (T.Partition_Name))
& Assoc ("Entry_Port_Name", To_String (T.Entry_Port_Name))
......
......@@ -1020,7 +1020,8 @@ package body TASTE.Interface_View is
end Debug_Dump;
-- Create a Templates_Parser translate set for an interface (PI or RI)
function To_Template (TI : Taste_Interface) return Translate_Set is
function Interface_To_Template (TI : Taste_Interface) return Translate_Set
is
Param_Names,
Param_Types,
Param_ASN1_Modules,
......@@ -1065,7 +1066,8 @@ package body TASTE.Interface_View is
& Assoc ("IF_Property_Names", Property_Names)
& Assoc ("IF_Property_Values", Property_Values)
& Assoc ("Remote_Function_Names", Remote_Function_Names)
& Assoc ("Remote_Interface_Names", Remote_Interface_Names);
end To_Template;
& Assoc ("Remote_Interface_Names", Remote_Interface_Names)
& Assoc ("Is_Timer", TI.Is_Timer);
end Interface_To_Template;
end TASTE.Interface_View;
......@@ -113,9 +113,10 @@ package TASTE.Interface_View is
WCET_ms : Option_ULL.Option := Option_ULL.Nothing;
Queue_Size : Option_ULL.Option := Option_ULL.Nothing;
User_Properties : Property_Maps.Map;
Is_Timer : Boolean := False;
end record;
function To_Template (TI : Taste_Interface) return Translate_Set;
function Interface_To_Template (TI : Taste_Interface) return Translate_Set;
package Interfaces_Maps is new Indefinite_Ordered_Maps (String,
Taste_Interface);
......
......@@ -32,7 +32,7 @@ SUBPROGRAM IMPLEMENTATION @_Name_@.GUI_PI
SUBPROGRAM IMPLEMENTATION @_Name_@.GUI_RI
@@ELSIF@@ @_Language_@ = "VHDL_BRAVE"
SUBPROGRAM IMPLEMENTATION @_Name_@.VHDL
@@ELSIF@@ @_Language_@ = "Blackbox_C"
@@ELSIF@@ @_Language_@ = "Blackbox_C" or @_Language_@ = Timer_Manager
SUBPROGRAM IMPLEMENTATION @_Name_@.C
@@ELSIF@@ @_Language_@ = SDL
SUBPROGRAM IMPLEMENTATION @_Name_@.Ada
......@@ -47,7 +47,7 @@ PROPERTIES
Source_Language => GUI_RI;
@@ELSIF@@ @_Language_@ = "VHDL_BRAVE"
Source_Language => VHDL;
@@ELSIF@@ @_Language_@ = "Blackbox_C" or @_Language_@ = CPP
@@ELSIF@@ @_Language_@ = "Blackbox_C" or @_Language_@ = CPP or @_Language_@ = Timer_Manager
Source_Language => C;
@@ELSIF@@ @_Language_@ = SIMULINK
Source_Language => Simulink; @@-- aadl2glueC is case sensitive here
......@@ -67,7 +67,7 @@ END @_Name_@.GUI_PI;
END @_Name_@.GUI_RI;
@@ELSIF@@ @_Language_@ = "VHDL_BRAVE"
END @_Name_@.VHDL;
@@ELSIF@@ @_Language_@ = "Blackbox_C"
@@ELSIF@@ @_Language_@ = "Blackbox_C" or @_Language_@ = Timer_Manager
END @_Name_@.C;
@@ELSIF@@ @_Language_@ = SDL
END @_Name_@.Ada;
......
......@@ -13,4 +13,4 @@
@@-- @_Param_Encodings_@ : |_ Corresponding encoding (Default, Native, UPER, ACN)
@@TABLE@@
#define __NEED_@_REPLACE_ALL(-/_):Param_Types_@_@_Param_Encodings_@
@@END_TABLE@@@@
@@END_TABLE@@
......@@ -15,6 +15,6 @@
@@-- @_Filename_Is_Present_@ : True if target function output already exists
@@-- @_Makefile_Is_Present_@ : True if target build script already exists
@@-- @_C_Middleware_@ : True if middleware is in C (e.g. PO-HI-C)
@@IF@@ not @_Is_Type_@ and (@_Language_@ = "C" or @_Language_@ = "GUI" or @_Language_@ = "Ada" or @_Language_@ = "VDM" or @_Language_@ = "QGenAda" or @_Language_@ = "QGenC" or @_Language_@ = "RTDS" or @_Language_@ = "CPP" or @_Language_@ = "SDL" or @_Language_@ = "Blackbox_C" or @_Language_@ = "MicroPython" or @_Language_@ = SIMULINK)
@@IF@@ not @_Is_Type_@ and (@_Language_@ = "C" or @_Language_@ = "GUI" or @_Language_@ = "Ada" or @_Language_@ = "VDM" or @_Language_@ = "QGenAda" or @_Language_@ = "QGenC" or @_Language_@ = "RTDS" or @_Language_@ = "CPP" or @_Language_@ = "SDL" or @_Language_@ = "Blackbox_C" or @_Language_@ = "MicroPython" or @_Language_@ = SIMULINK or @_Language_@ = Timer_Manager)
TRUE
@@END_IF@@
......@@ -15,6 +15,6 @@
@@-- @_Filename_Is_Present_@ : True if target function output already exists
@@-- @_Makefile_Is_Present_@ : True if target build script already exists
@@-- @_C_Middleware_@ : True if middleware is in C (e.g. PO-HI-C)
@@IF@@ not @_Is_Type_@ and (@_Language_@ = "C" or @_Language_@ = "GUI" or @_Language_@ = "Ada" or @_Language_@ = "VDM" or @_Language_@ = "QGenAda" or @_Language_@ = "QGenC" or @_Language_@ = "RTDS" or @_Language_@ = "CPP" or @_Language_@ = "SDL" or @_Language_@ = "Blackbox_C" or @_Language_@ = "MicroPython")
@@IF@@ not @_Is_Type_@ and (@_Language_@ = C or @_Language_@ = GUI or @_Language_@ = Ada or @_Language_@ = VDM or @_Language_@ = QGenAda or @_Language_@ = QGenC or @_Language_@ = RTDS or @_Language_@ = CPP or @_Language_@ = SDL or @_Language_@ = Blackbox_C or @_Language_@ = MicroPython or @_Language_@ = Timer_Manager)
TRUE
@@END_IF@@
......@@ -15,6 +15,6 @@
@@-- @_Filename_Is_Present_@ : True if target function output already exists
@@-- @_Makefile_Is_Present_@ : True if target build script already exists
@@-- @_C_Middleware_@ : True if middleware is in C (e.g. PO-HI-C)
@@IF@@ not @_Is_Type_@ and (@_Language_@ = "C" or @_Language_@ = "GUI" or @_Language_@ = "Ada" or @_Language_@ = "VDM" or @_Language_@ = "QGenAda" or @_Language_@ = "QGenC" or @_Language_@ = "RTDS" or @_Language_@ = "CPP" or @_Language_@ = "SDL" or @_Language_@ = "Blackbox_C" or @_Language_@ = "MicroPython")
@@IF@@ not @_Is_Type_@ and (@_Language_@ = C or @_Language_@ = GUI or @_Language_@ = Ada or @_Language_@ = VDM or @_Language_@ = QGenAda or @_Language_@ = QGenC or @_Language_@ = RTDS or @_Language_@ = CPP or @_Language_@ = SDL or @_Language_@ = Blackbox_C or @_Language_@ = MicroPython or @_Language_@ = Timer_Manager)
TRUE
@@END_IF@@
......@@ -7,6 +7,11 @@
@@-- @_Param_Names_@ : List of parameter names
@@-- @_Param_Types_@ : |_ Corresponding parameter types
@@-- @_Param_Directions_@ : |_ Corresponding direction
@@-- @_Param_Encodings_@ : |_ Corresponding ASN.1 encoding
@@-- @_Is_Timer_@ : Flag set to true if this is a timer interface
@@-- @_Period_@, @_WCET_@, @_Queue_Size_@ : Properties of the interface
@@-- @_IF_Property_Names_@, _Values_@ : User-defined properties (vector tag)
@@IF@@ not @_Is_Timer_@
@@IF@@ @_EXIST:Param_Names_@
@@INLINE@@
procedure @_CAPITALIZE:Name_@
......@@ -28,3 +33,4 @@ procedure @_CAPITALIZE:Name_@ is
-- Write your code here
null;
end @_CAPITALIZE:Name_@;
@@END_IF@@
......@@ -61,12 +61,7 @@ package @_CAPITALIZE:Name_@ is
@@END_TABLE@@
@@TABLE@@
-- Timer @_Timers_@
procedure @_CAPITALIZE:Timers_@
with Export,
Convention => C,
Link_Name => "@_LOWER:Name_@_PI_@_Timers_@";
-- Timer @_Timers_@ Set and Reset functions
procedure Set_@_CAPITALIZE:Timers_@ (Value : in out asn1SccT_UInt32)
with Import,
Convention => C,
......
......@@ -7,6 +7,7 @@
@@-- @_Param_Names_@ : List of parameter names
@@-- @_Param_Types_@ : |_ Corresponding parameter types
@@-- @_Param_Directions_@ : |_ Corresponding direction
@@IF@@ @_Direction_@ = PI or not @_Is_Timer_@
@@IF@@ @_EXIST:Param_Names_@
@@INLINE@@
procedure @_CAPITALIZE:Name_@
......@@ -33,3 +34,4 @@ procedure @_CAPITALIZE:Name_@
Link_Name => "@_LOWER:Parent_Function_@_RI_@_Name_@";
@@-- procedure RIÜ@_CAPITALIZE:Name_@ renames @_CAPITALIZE:Name_@;
@@END_IF@@
@@END_IF@@
......@@ -54,6 +54,6 @@ void @_LOWER:Name_@_startup(void)
@@TABLE@@
void @_LOWER:Name_@_PI_@_Timers_@(void)
{
// This function is called when the timer expires
// This function is called when the timer @_Timers_@ expires
}
@@END_TABLE@@
......@@ -4,12 +4,17 @@
@@-- @_Direction_@ : "PI" or "RI"
@@-- @_Kind_@ : The RCM Kind
@@-- @_Parent_Function_@ : The name of the function
@@-- @_Language_@ : The implementation language of the function
@@-- @_Property_Names_@ : All AADL properties (names) associated to the function
@@-- @_Property_Values_@ : ... and corresponding values
@@-- @_Param_Names_@ : List of parameter names
@@-- @_Param_Types_@ : |_ Corresponding parameter types
@@-- @_Param_Directions_@ : |_ Corresponding direction
@@-- @_Param_Encodings_@ : |_ Corresponding ASN.1 encoding
@@-- @_Is_Timer_@ : Flag set to true if this is a timer interface
@@-- @_Period_@, @_WCET_@, @_Queue_Size_@ : Properties of the interface
@@-- @_IF_Property_Names_@, _Values_@ : User-defined properties (vector tag)
@@IF@@ not @_Is_Timer_@
@@IF@@ @_EXIST:Param_Names_@
void @_LOWER:Parent_Function_@_PI_@_Name_@
@@INLINE( \()(,\n )(\)\n)@@
......@@ -27,3 +32,4 @@ void @_LOWER:Parent_Function_@_PI_@_Name_@(void)
{
// Write your code here
}
@@END_IF@@
......@@ -61,10 +61,9 @@ void @_LOWER:Name_@_startup(void);
@@END_TABLE@@
@@TABLE@@
void @_LOWER:Name_@_PI_@_Timers_@(void);
/* Call these functions to set/reset @_Timers_@ (value in milliseconds)*/
void @_LOWER:Name_@_RI_SET_@_Timers_@(asn1SccT_UInt32 *);
void @_LOWER:Name_@_RI_RESET_@_Timers_@(void);
// Functions to set/reset time "@_Timers_@" (parameter in milliseconds)
extern void @_LOWER:Name_@_RI_SET_@_Timers_@(asn1SccT_UInt32 *);
extern void @_LOWER:Name_@_RI_RESET_@_Timers_@(void);
@@END_TABLE@@
#ifdef __cplusplus
......
......@@ -10,8 +10,9 @@
@@-- @_Param_Encodings_@ : |_ Corresponding ASN.1 encoding
@@-- @_Period_@, @_WCET_@, @_Queue_Size_@ : Properties of the interface
@@-- @_IF_Property_Names_@, _Values_@ : User-defined properties (vector tag)
@@IF@@ @_Direction_@ = PI or not @_Is_Timer_@
@@INLINE@@
@@IF@@ @_Direction_@ = "PI"
@@IF@@ @_Direction_@ = PI
void @_LOWER:Parent_Function_@_PI_@_Name_@(
@@ELSE@@
extern void @_LOWER:Parent_Function_@_RI_@_Name_@(
......@@ -21,7 +22,7 @@ void
@@ELSE@@
@@INLINE(, )@@
@@TABLE@@
@@IF@@ @_Param_Directions_@ = "PARAM_IN"
@@IF@@ @_Param_Directions_@ = PARAM_IN
const asn1Scc@_REPLACE_ALL((-)/_):Param_Types_@ *
@@ELSE@@
asn1Scc@_REPLACE_ALL((-)/_):Param_Types_@ *
......@@ -31,3 +32,4 @@ void
@@END_IF@@
);
@@END_INLINE@@
@@END_IF@@
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment