diff options
Diffstat (limited to 'cpukit/include/adainclude/rtems.ads')
-rw-r--r-- | cpukit/include/adainclude/rtems.ads | 546 |
1 files changed, 546 insertions, 0 deletions
diff --git a/cpukit/include/adainclude/rtems.ads b/cpukit/include/adainclude/rtems.ads new file mode 100644 index 0000000000..2b59c74186 --- /dev/null +++ b/cpukit/include/adainclude/rtems.ads @@ -0,0 +1,546 @@ +-- RTEMS / Specification +-- +-- DESCRIPTION: +-- +-- This package provides the interface to the RTEMS API. +-- +-- DEPENDENCIES: +-- +-- NOTES: +-- RTEMS initialization and configuration are called from +-- the BSP side, therefore should never be called from ADA. +-- +-- COPYRIGHT (c) 1997-2011. +-- On-Line Applications Research Corporation (OAR). +-- +-- The license and distribution terms for this file may in +-- the file LICENSE in this distribution or at +-- http://www.rtems.org/license/LICENSE. +-- + +with System; +with System.Storage_Elements; use System.Storage_Elements; +with Interfaces; +with Interfaces.C; + +package RTEMS is +pragma Elaborate_Body (RTEMS); + + Structure_Alignment : constant := 8; + + -- + -- RTEMS Base Types + -- + + subtype Unsigned8 is Interfaces.Unsigned_8; + subtype Unsigned16 is Interfaces.Unsigned_16; + subtype Unsigned32 is Interfaces.Unsigned_32; + subtype Signed32 is Interfaces.Integer_32; + + type Unsigned32_Pointer is access all RTEMS.Unsigned32; + type Unsigned16_Pointer is access all RTEMS.Unsigned16; + type Unsigned8_Pointer is access all RTEMS.Unsigned8; + type Signed32_Pointer is access all RTEMS.Signed32; + + subtype Boolean is RTEMS.Unsigned8; + subtype Address is System.Address; + subtype Single is Interfaces.C.C_float; + subtype Double is Interfaces.C.Double; + + -- + -- The following define the size of each of the base types in + -- both bits and system units. + -- + + Unsigned8_Bits : constant := 7; + Unsigned16_Bits : constant := 15; + Unsigned32_Bits : constant := 31; + Boolean_Bits : constant := 7; + Address_Bits : constant := 31; + Single_Bits : constant := 31; + Double_Bits : constant := 63; + + Unsigned8_Units : constant := 1; + Unsigned16_Units : constant := 2; + Unsigned32_Units : constant := 4; + Boolean_Units : constant := 1; + Address_Units : constant := 4; + Single_Units : constant := 4; + Double_Units : constant := 8; + + Null_Address : constant RTEMS.Address := + System.Storage_Elements.To_Address(0); + + True : constant RTEMS.Boolean := 1; + False : constant RTEMS.Boolean := 0; + + -- + -- More Types + -- + + subtype Name is RTEMS.Unsigned32; + subtype ID is RTEMS.Unsigned32; + subtype Interval is RTEMS.Unsigned32; + subtype Attribute is RTEMS.Unsigned32; + subtype Mode is RTEMS.Unsigned32; + subtype Option is RTEMS.Unsigned32; + subtype Notepad_Index is RTEMS.Unsigned32 range 0 .. 15; + + subtype Event_Set is RTEMS.Unsigned32; + subtype Signal_Set is RTEMS.Unsigned32; + subtype Device_Major_Number is RTEMS.Unsigned32; + subtype Device_Minor_Number is RTEMS.Unsigned32; + subtype ISR_Level is RTEMS.Unsigned32; + + subtype Node is RTEMS.Unsigned32; + + type Driver_Name_t is + record + Device_Name : RTEMS.Address; + Device_Name_Length : RTEMS.Unsigned32; + Major : RTEMS.Device_Major_Number; + Minor : RTEMS.Device_Minor_Number; + + end record; + + + -- + -- Task Related Types + -- + + subtype TCB is RTEMS.Unsigned32; + type TCB_Pointer is access all RTEMS.TCB; + + -- + -- Time of Day Type + -- + + type Time_Of_Day is + record + Year : RTEMS.Unsigned32; -- year, A.D. + Month : RTEMS.Unsigned32; -- month, 1 .. 12 + Day : RTEMS.Unsigned32; -- day, 1 .. 31 + Hour : RTEMS.Unsigned32; -- hour, 0 .. 23 + Minute : RTEMS.Unsigned32; -- minute, 0 .. 59 + Second : RTEMS.Unsigned32; -- second, 0 .. 59 + Ticks : RTEMS.Unsigned32; -- elapsed ticks between seconds + end record; + + type Time_T is new Interfaces.C.Long; + + type Timespec is record + TV_Sec : Time_T; + TV_Nsec : Interfaces.C.Long; + end record; + pragma Convention (C, Timespec); + + type Time_Value is + record + Seconds : RTEMS.Unsigned32; + Microseconds : RTEMS.Unsigned32; + end record; + + -- + -- Ident Options + -- + + Search_All_Nodes : constant RTEMS.Node := 0; + Search_Other_Nodes : constant RTEMS.Node := 16#7FFFFFFE#; + Search_Local_Node : constant RTEMS.Node := 16#7FFFFFFF#; + Who_Am_I : constant RTEMS.Node := 0; + + -- + -- Options + -- + + Default_Options : constant RTEMS.Option := 16#0000#; + + Wait : constant RTEMS.Option := 16#0000#; + No_Wait : constant RTEMS.Option := 16#0001#; + + Event_All : constant RTEMS.Option := 16#0000#; + Event_Any : constant RTEMS.Option := 16#0002#; + + -- + -- Mode constants + -- + + Default_Modes : constant RTEMS.Mode := 16#0000#; + + All_Mode_Masks : constant RTEMS.Mode := 16#0000_ffff#; + Current_Mode : constant RTEMS.Mode := 16#0000_0000#; + Preempt_Mask : constant RTEMS.Mode := 16#0000_0100#; + Timeslice_Mask : constant RTEMS.Mode := 16#0000_0200#; + ASR_Mask : constant RTEMS.Mode := 16#0000_0400#; + Interrupt_Mask : RTEMS.Mode; + Preempt : constant RTEMS.Mode := 16#0000_0000#; + No_Preempt : constant RTEMS.Mode := 16#0000_0100#; + No_Timeslice : constant RTEMS.Mode := 16#0000_0000#; + Timeslice : constant RTEMS.Mode := 16#0000_0200#; + ASR : constant RTEMS.Mode := 16#0000_0000#; + No_ASR : constant RTEMS.Mode := 16#0000_0400#; + + pragma Import (C, Interrupt_Mask, "rtems_interrupt_mask"); + + -- + -- Attribute constants + -- + + Default_Attributes : constant RTEMS.Attribute := 16#00000000#; + No_Floating_Point : constant RTEMS.Attribute := 16#00000000#; + Floating_Point : constant RTEMS.Attribute := 16#00000001#; + Local : constant RTEMS.Attribute := 16#00000000#; + Global : constant RTEMS.Attribute := 16#00000002#; + FIFO : constant RTEMS.Attribute := 16#00000000#; + Priority : constant RTEMS.Attribute := 16#00000004#; + Counting_Semaphore : constant RTEMS.Attribute := 16#00000000#; + Binary_Semaphore : constant RTEMS.Attribute := 16#00000010#; + Simple_Binary_Semaphore : constant RTEMS.Attribute := 16#00000020#; + No_Inherit_Priority : constant RTEMS.Attribute := 16#00000000#; + Inherit_Priority : constant RTEMS.Attribute := 16#00000040#; + No_Priority_Ceiling : constant RTEMS.Attribute := 16#00000000#; + Priority_Ceiling : constant RTEMS.Attribute := 16#00000080#; + + function Interrupt_Level ( + Level : in RTEMS.Unsigned32 + ) return RTEMS.Mode; + pragma Import (C, Interrupt_Level, "rtems_interrupt_level_body"); + + Minimum_Stack_Size : RTEMS.Unsigned32; + pragma Import (C, Minimum_Stack_Size, "rtems_minimum_stack_size"); + + -- + -- Notepad index constants + -- + + Notepad_0 : constant RTEMS.Unsigned32 := 0; + Notepad_1 : constant RTEMS.Unsigned32 := 1; + Notepad_2 : constant RTEMS.Unsigned32 := 2; + Notepad_3 : constant RTEMS.Unsigned32 := 3; + Notepad_4 : constant RTEMS.Unsigned32 := 4; + Notepad_5 : constant RTEMS.Unsigned32 := 5; + Notepad_6 : constant RTEMS.Unsigned32 := 6; + Notepad_7 : constant RTEMS.Unsigned32 := 7; + Notepad_8 : constant RTEMS.Unsigned32 := 8; + Notepad_9 : constant RTEMS.Unsigned32 := 9; + Notepad_10 : constant RTEMS.Unsigned32 := 10; + Notepad_11 : constant RTEMS.Unsigned32 := 11; + Notepad_12 : constant RTEMS.Unsigned32 := 12; + Notepad_13 : constant RTEMS.Unsigned32 := 13; + Notepad_14 : constant RTEMS.Unsigned32 := 14; + Notepad_15 : constant RTEMS.Unsigned32 := 15; + + -- + -- Miscellaneous + -- + + No_Timeout : constant RTEMS.Interval := 0; + Self : constant RTEMS.ID := 0; + Yield_Processor : constant RTEMS.Interval := 0; + Rate_Monotonic_Period_Status : constant RTEMS.Interval := 0; + + + -- + -- Extension Callouts and Table + -- + + type Thread_Create_Extension is access function ( + Current_Task : in RTEMS.TCB_Pointer; + New_Task : in RTEMS.TCB_Pointer + ) return RTEMS.Boolean; + pragma Convention (C, Thread_Create_Extension); + + type Thread_Start_Extension is access procedure ( + Current_Task : in RTEMS.TCB_Pointer; + Started_Task : in RTEMS.TCB_Pointer + ); + pragma Convention (C, Thread_Start_Extension); + + type Thread_Restart_Extension is access procedure ( + Current_Task : in RTEMS.TCB_Pointer; + Restarted_Task : in RTEMS.TCB_Pointer + ); + pragma Convention (C, Thread_Restart_Extension); + + type Thread_Delete_Extension is access procedure ( + Current_Task : in RTEMS.TCB_Pointer; + Deleted_Task : in RTEMS.TCB_Pointer + ); + pragma Convention (C, Thread_Delete_Extension); + + type Thread_Switch_Extension is access procedure ( + Current_Task : in RTEMS.TCB_Pointer; + Heir_Task : in RTEMS.TCB_Pointer + ); + pragma Convention (C, Thread_Switch_Extension); + + type Thread_Post_Switch_Extension is access procedure ( + Current_Task : in RTEMS.TCB_Pointer + ); + pragma Convention (C, Thread_Post_Switch_Extension); + + type Thread_Begin_Extension is access procedure ( + Current_Task : in RTEMS.TCB_Pointer + ); + pragma Convention (C, Thread_Begin_Extension); + + type Thread_Exitted_Extension is access procedure ( + Current_Task : in RTEMS.TCB_Pointer + ); + pragma Convention (C, Thread_Exitted_Extension); + + type Fatal_Error_Extension is access procedure ( + Error : in RTEMS.Unsigned32 + ); + pragma Convention (C, Fatal_Error_Extension); + + type Extensions_Table is + record + Thread_Create : RTEMS.Thread_Create_Extension; + Thread_Start : RTEMS.Thread_Start_Extension; + Thread_Restart : RTEMS.Thread_Restart_Extension; + Thread_Delete : RTEMS.Thread_Delete_Extension; + Thread_Switch : RTEMS.Thread_Switch_Extension; + Thread_Post_Switch : RTEMS.Thread_Post_Switch_Extension; + Thread_Begin : RTEMS.Thread_Begin_Extension; + Thread_Exitted : RTEMS.Thread_Exitted_Extension; + Fatal : RTEMS.Fatal_Error_Extension; + end record; + + type Extensions_Table_Pointer is access all Extensions_Table; + + -- + -- The following type define a pointer to a signal service routine. + -- + + type ASR_Handler is access procedure ( + Signals : in RTEMS.Signal_Set + ); + pragma Convention (C, ASR_Handler); + + -- + -- Method Completions Status Codes + -- + + type Status_Codes is ( + Successful, -- successful completion + Task_Exitted, -- returned from a task + MP_Not_Configured, -- multiprocessing not configured + Invalid_Name, -- invalid object name + Invalid_ID, -- invalid object id + Too_Many, -- too many + Timeout, -- timed out waiting + Object_Was_Deleted, -- object deleted while waiting + Invalid_Size, -- specified size was invalid + Invalid_Address, -- address specified is invalid + Invalid_Number, -- number was invalid + Not_Defined, -- item has not been initialized + Resource_In_Use, -- resources still outstanding + Unsatisfied, -- request not satisfied + Incorrect_State, -- task is in wrong state + Already_Suspended, -- task already in state + Illegal_On_Self, -- illegal on calling task + Illegal_On_Remote_Object, -- illegal for remote object + Called_From_ISR, -- called from wrong environment + Invalid_Priority, -- invalid task priority + Invalid_Clock, -- invalid date/time + Invalid_Node, -- invalid node id + Not_Configured, -- directive not configured + Not_Owner_Of_Resource, -- not owner of resource + Not_Implemented, -- directive not implemented + Internal_Error, -- RTEMS inconsistency detected + No_Memory, -- no memory left in heap + IO_Error, -- driver IO error + Proxy_Blocking -- internal multiprocessing only + ); + + for Status_Codes'Size use 32; + + for Status_Codes use ( + Successful => 0, + Task_Exitted => 1, + MP_Not_Configured => 2, + Invalid_Name => 3, + Invalid_ID => 4, + Too_Many => 5, + Timeout => 6, + Object_Was_Deleted => 7, + Invalid_Size => 8, + Invalid_Address => 9, + Invalid_NumbeR => 10, + Not_Defined => 11, + Resource_In_Use => 12, + Unsatisfied => 13, + Incorrect_State => 14, + Already_Suspended => 15, + Illegal_On_Self => 16, + Illegal_On_Remote_Object => 17, + Called_From_ISR => 18, + Invalid_Priority => 19, + Invalid_Clock => 20, + Invalid_Node => 21, + Not_Configured => 22, + Not_Owner_Of_Resource => 23, + Not_ImplementeD => 24, + Internal_Error => 25, + No_Memory => 26, + IO_Error => 27, + Proxy_Blocking => 28 + ); + + -- + -- RTEMS Events + -- + + Pending_Events : constant RTEMS.Event_Set := 16#0000_0000#; + All_Events : constant RTEMS.Event_Set := 16#FFFF_FFFF#; + Event_0 : constant RTEMS.Event_Set := 16#0000_0001#; + Event_1 : constant RTEMS.Event_Set := 16#0000_0002#; + Event_2 : constant RTEMS.Event_Set := 16#0000_0004#; + Event_3 : constant RTEMS.Event_Set := 16#0000_0008#; + Event_4 : constant RTEMS.Event_Set := 16#0000_0010#; + Event_5 : constant RTEMS.Event_Set := 16#0000_0020#; + Event_6 : constant RTEMS.Event_Set := 16#0000_0040#; + Event_7 : constant RTEMS.Event_Set := 16#0000_0080#; + Event_8 : constant RTEMS.Event_Set := 16#0000_0100#; + Event_9 : constant RTEMS.Event_Set := 16#0000_0200#; + Event_10 : constant RTEMS.Event_Set := 16#0000_0400#; + Event_11 : constant RTEMS.Event_Set := 16#0000_0800#; + Event_12 : constant RTEMS.Event_Set := 16#0000_1000#; + Event_13 : constant RTEMS.Event_Set := 16#0000_2000#; + Event_14 : constant RTEMS.Event_Set := 16#0000_4000#; + Event_15 : constant RTEMS.Event_Set := 16#0000_8000#; + Event_16 : constant RTEMS.Event_Set := 16#0001_0000#; + Event_17 : constant RTEMS.Event_Set := 16#0002_0000#; + Event_18 : constant RTEMS.Event_Set := 16#0004_0000#; + Event_19 : constant RTEMS.Event_Set := 16#0008_0000#; + Event_20 : constant RTEMS.Event_Set := 16#0010_0000#; + Event_21 : constant RTEMS.Event_Set := 16#0020_0000#; + Event_22 : constant RTEMS.Event_Set := 16#0040_0000#; + Event_23 : constant RTEMS.Event_Set := 16#0080_0000#; + Event_24 : constant RTEMS.Event_Set := 16#0100_0000#; + Event_25 : constant RTEMS.Event_Set := 16#0200_0000#; + Event_26 : constant RTEMS.Event_Set := 16#0400_0000#; + Event_27 : constant RTEMS.Event_Set := 16#0800_0000#; + Event_28 : constant RTEMS.Event_Set := 16#1000_0000#; + Event_29 : constant RTEMS.Event_Set := 16#2000_0000#; + Event_30 : constant RTEMS.Event_Set := 16#4000_0000#; + Event_31 : constant RTEMS.Event_Set := 16#8000_0000#; + + -- + -- RTEMS Signals + -- + + All_Signals : constant RTEMS.Signal_Set := 16#7FFFFFFF#; + Signal_0 : constant RTEMS.Signal_Set := 16#00000001#; + Signal_1 : constant RTEMS.Signal_Set := 16#00000002#; + Signal_2 : constant RTEMS.Signal_Set := 16#00000004#; + Signal_3 : constant RTEMS.Signal_Set := 16#00000008#; + Signal_4 : constant RTEMS.Signal_Set := 16#00000010#; + Signal_5 : constant RTEMS.Signal_Set := 16#00000020#; + Signal_6 : constant RTEMS.Signal_Set := 16#00000040#; + Signal_7 : constant RTEMS.Signal_Set := 16#00000080#; + Signal_8 : constant RTEMS.Signal_Set := 16#00000100#; + Signal_9 : constant RTEMS.Signal_Set := 16#00000200#; + Signal_10 : constant RTEMS.Signal_Set := 16#00000400#; + Signal_11 : constant RTEMS.Signal_Set := 16#00000800#; + Signal_12 : constant RTEMS.Signal_Set := 16#00001000#; + Signal_13 : constant RTEMS.Signal_Set := 16#00002000#; + Signal_14 : constant RTEMS.Signal_Set := 16#00004000#; + Signal_15 : constant RTEMS.Signal_Set := 16#00008000#; + Signal_16 : constant RTEMS.Signal_Set := 16#00010000#; + Signal_17 : constant RTEMS.Signal_Set := 16#00020000#; + Signal_18 : constant RTEMS.Signal_Set := 16#00040000#; + Signal_19 : constant RTEMS.Signal_Set := 16#00080000#; + Signal_20 : constant RTEMS.Signal_Set := 16#00100000#; + Signal_21 : constant RTEMS.Signal_Set := 16#00200000#; + Signal_22 : constant RTEMS.Signal_Set := 16#00400000#; + Signal_23 : constant RTEMS.Signal_Set := 16#00800000#; + Signal_24 : constant RTEMS.Signal_Set := 16#01000000#; + Signal_25 : constant RTEMS.Signal_Set := 16#02000000#; + Signal_26 : constant RTEMS.Signal_Set := 16#04000000#; + Signal_27 : constant RTEMS.Signal_Set := 16#08000000#; + Signal_28 : constant RTEMS.Signal_Set := 16#10000000#; + Signal_29 : constant RTEMS.Signal_Set := 16#20000000#; + Signal_30 : constant RTEMS.Signal_Set := 16#40000000#; + Signal_31 : constant RTEMS.Signal_Set := 16#80000000#; + + -- + -- Utility Functions + -- + + function From_Ada_Boolean ( + Ada_Boolean : Standard.Boolean + ) return RTEMS.Boolean; + + function To_Ada_Boolean ( + RTEMS_Boolean : RTEMS.Boolean + ) return Standard.Boolean; + + function Milliseconds_To_Microseconds ( + Milliseconds : RTEMS.Unsigned32 + ) return RTEMS.Unsigned32; + + function Microseconds_To_Ticks ( + Microseconds : RTEMS.Unsigned32 + ) return RTEMS.Interval; + + function Milliseconds_To_Ticks ( + Milliseconds : RTEMS.Unsigned32 + ) return RTEMS.Interval; + + procedure Name_To_Characters ( + Name : in RTEMS.Name; + C1 : out Character; + C2 : out Character; + C3 : out Character; + C4 : out Character + ); + + function Get_Node ( + ID : in RTEMS.ID + ) return RTEMS.Unsigned32; + + function Get_Index ( + ID : in RTEMS.ID + ) return RTEMS.Unsigned32; + + function Are_Statuses_Equal ( + Status : in RTEMS.Status_Codes; + Desired : in RTEMS.Status_Codes + ) return Standard.Boolean; + + function Is_Status_Successful ( + Status : in RTEMS.Status_Codes + ) return Standard.Boolean; + + function Subtract ( + Left : in RTEMS.Address; + Right : in RTEMS.Address + ) return RTEMS.Unsigned32; + + function Are_Equal ( + Left : in RTEMS.Address; + Right : in RTEMS.Address + ) return Standard.Boolean; + + -- + -- RTEMS API + -- + + function Build_Name ( + C1 : in Character; + C2 : in Character; + C3 : in Character; + C4 : in Character + ) return RTEMS.Name; + + -- + -- Initialization Manager -- Shutdown Only + -- + procedure Shutdown_Executive ( + Status : in RTEMS.Unsigned32 + ); + +end RTEMS; + |