/* tasks.h * * This include file contains all constants and structures associated * with RTEMS tasks. This manager provides a comprehensive set of directives * to create, delete, and administer tasks. * * Directives provided are: * * + create a task * + get an ID of a task * + start a task * + restart a task * + delete a task * + suspend a task * + resume a task * + set a task's priority * + change the current task's mode * + get a task notepad entry * + set a task notepad entry * + wake up after interval * + wake up when specified * * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994. * On-Line Applications Research Corporation (OAR). * All rights assigned to U.S. Government, 1994. * * This material may be reproduced by or for the U.S. Government pursuant * to the copyright license under the clause at DFARS 252.227-7013. This * notice must appear in all copies of this file and its derivatives. * * $Id$ */ #ifndef __RTEMS_RTEMS_TASKS_h #define __RTEMS_RTEMS_TASKS_h #ifdef __cplusplus extern "C" { #endif #include #include #include #include #include #include #include /* * Constant to be used as the ID of current task */ #define RTEMS_SELF OBJECTS_ID_OF_SELF /* * This constant is passed to the rtems_task_wake_after directive as the * interval when a task wishes to yield the CPU. */ #define RTEMS_YIELD_PROCESSOR WATCHDOG_NO_TIMEOUT /* * Define the type for an RTEMS API task priority. */ typedef Priority_Control rtems_task_priority; #define RTEMS_NO_PRIORITY RTEMS_CURRENT_PRIORITY #define RTEMS_MINIMUM_PRIORITY (PRIORITY_MINIMUM + 1) #define RTEMS_MAXIMUM_PRIORITY PRIORITY_MAXIMUM /* * The following constant is passed to rtems_task_set_priority when the * caller wants to obtain the current priority. */ #define RTEMS_CURRENT_PRIORITY PRIORITY_MINIMUM /* * Notepads constants (indices into notepad array) */ #define RTEMS_NOTEPAD_FIRST 0 /* lowest numbered notepad */ #define RTEMS_NOTEPAD_0 0 /* notepad location 0 */ #define RTEMS_NOTEPAD_1 1 /* notepad location 1 */ #define RTEMS_NOTEPAD_2 2 /* notepad location 2 */ #define RTEMS_NOTEPAD_3 3 /* notepad location 3 */ #define RTEMS_NOTEPAD_4 4 /* notepad location 4 */ #define RTEMS_NOTEPAD_5 5 /* notepad location 5 */ #define RTEMS_NOTEPAD_6 6 /* notepad location 6 */ #define RTEMS_NOTEPAD_7 7 /* notepad location 7 */ #define RTEMS_NOTEPAD_8 8 /* notepad location 8 */ #define RTEMS_NOTEPAD_9 9 /* notepad location 9 */ #define RTEMS_NOTEPAD_10 10 /* notepad location 10 */ #define RTEMS_NOTEPAD_11 11 /* notepad location 11 */ #define RTEMS_NOTEPAD_12 12 /* notepad location 12 */ #define RTEMS_NOTEPAD_13 13 /* notepad location 13 */ #define RTEMS_NOTEPAD_14 14 /* notepad location 14 */ #define RTEMS_NOTEPAD_15 15 /* notepad location 15 */ #define RTEMS_NOTEPAD_LAST RTEMS_NOTEPAD_15 /* highest numbered notepad */ #define RTEMS_NUMBER_NOTEPADS (RTEMS_NOTEPAD_LAST+1) /* * External API name for Thread_Control */ typedef Thread_Control rtems_tcb; /* * The following defines the "return type" of an RTEMS task. */ typedef void rtems_task; /* * The following defines the argument to an RTEMS task. */ typedef unsigned32 rtems_task_argument; /* * The following defines the type for the entry point of an RTEMS task. */ typedef rtems_task ( *rtems_task_entry )( rtems_task_argument ); /* * The following records define the Initialization Tasks Table. * Each entry contains the information required by RTEMS to * create and start a user task automatically at executive * initialization time. */ typedef struct { rtems_name name; /* task name */ unsigned32 stack_size; /* task stack size */ rtems_task_priority initial_priority; /* task priority */ rtems_attribute attribute_set; /* task attributes */ rtems_task_entry entry_point; /* task entry point */ rtems_mode mode_set; /* task initial mode */ unsigned32 argument; /* task argument */ } rtems_initialization_tasks_table; /* * This is the API specific information required by each thread for * the RTEMS API to function correctly. */ typedef struct { unsigned32 Notepads[ RTEMS_NUMBER_NOTEPADS ]; rtems_event_set pending_events; rtems_event_set event_condition; ASR_Information Signal; } RTEMS_API_Control; /* * The following defines the information control block used to * manage this class of objects. */ EXTERN Objects_Information _RTEMS_tasks_Information; /* * These are used to manage the user initialization tasks. */ EXTERN rtems_initialization_tasks_table *_RTEMS_tasks_User_initialization_tasks; EXTERN unsigned32 _RTEMS_tasks_Number_of_initialization_tasks; /* * _RTEMS_tasks_Manager_initialization * * DESCRIPTION: * * This routine initializes all Task Manager related data structures. */ void _RTEMS_tasks_Manager_initialization( unsigned32 maximum_tasks, unsigned32 number_of_initialization_tasks, rtems_initialization_tasks_table *user_tasks ); /* * rtems_task_create * * DESCRIPTION: * * This routine implements the rtems_task_create directive. The task * will have the name name. The attribute_set can be used to indicate * that the task will be globally accessible or utilize floating point. * The task's stack will be stack_size bytes. The task will begin * execution with initial_priority and initial_modes. It returns the * id of the created task in ID. */ rtems_status_code rtems_task_create( rtems_name name, rtems_task_priority initial_priority, unsigned32 stack_size, rtems_mode initial_modes, rtems_attribute attribute_set, Objects_Id *id ); /* * rtems_task_ident * * DESCRIPTION: * * This routine implements the rtems_task_ident directive. * This directive returns the task ID associated with name. * If more than one task is named name, then the task to * which the ID belongs is arbitrary. node indicates the * extent of the search for the ID of the task named name. * The search can be limited to a particular node or allowed to * encompass all nodes. */ rtems_status_code rtems_task_ident( rtems_name name, unsigned32 node, Objects_Id *id ); /* * rtems_task_delete * * DESCRIPTION: * * This routine implements the rtems_task_delete directive. The * task indicated by ID is deleted. */ rtems_status_code rtems_task_delete( Objects_Id id ); /* * rtems_task_get_note * * DESCRIPTION: * * This routine implements the rtems_task_get_note directive. The * value of the indicated notepad for the task associated with ID * is returned in note. */ rtems_status_code rtems_task_get_note( Objects_Id id, unsigned32 notepad, unsigned32 *note ); /* * rtems_task_set_note * * DESCRIPTION: * * This routine implements the rtems_task_set_note directive. The * value of the indicated notepad for the task associated with ID * is returned in note. */ rtems_status_code rtems_task_set_note( Objects_Id id, unsigned32 notepad, unsigned32 note ); /* * rtems_task_mode * * DESCRIPTION: * * This routine implements the rtems_task_mode directive. The current * values of the modes indicated by mask of the calling task are changed * to that indicated in mode_set. The former mode of the task is * returned in mode_set. */ rtems_status_code rtems_task_mode( rtems_mode mode_set, rtems_mode mask, rtems_mode *previous_mode_set ); /* * rtems_task_restart * * DESCRIPTION: * * This routine implements the rtems_task_restart directive. The * task associated with ID is restarted at its initial entry * point with the new argument. */ rtems_status_code rtems_task_restart( Objects_Id id, unsigned32 arg ); /* * rtems_task_suspend * * DESCRIPTION: * * This routine implements the rtems_task_suspend directive. The * SUSPENDED state is set for task associated with ID. */ rtems_status_code rtems_task_suspend( Objects_Id id ); /* * rtems_task_resume * * DESCRIPTION: * * This routine implements the rtems_task_resume Directive. The * SUSPENDED state is cleared for task associated with ID. */ rtems_status_code rtems_task_resume( Objects_Id id ); /* * rtems_task_set_priority * * DESCRIPTION: * * This routine implements the rtems_task_set_priority directive. The * current priority of the task associated with ID is set to * new_priority. The former priority of that task is returned * in old_priority. */ rtems_status_code rtems_task_set_priority( Objects_Id id, rtems_task_priority new_priority, rtems_task_priority *old_priority ); /* * rtems_task_start * * DESCRIPTION: * * This routine implements the rtems_task_start directive. The * starting execution point of the task associated with ID is * set to entry_point with the initial argument. */ rtems_status_code rtems_task_start( Objects_Id id, rtems_task_entry entry_point, unsigned32 argument ); /* * rtems_task_wake_when * * DESCRIPTION: * * This routine implements the rtems_task_wake_when directive. The * calling task is blocked until the current time of day is * equal to that indicated by time_buffer. */ rtems_status_code rtems_task_wake_when( rtems_time_of_day *time_buffer ); /* * rtems_task_wake_after * * DESCRIPTION: * * This routine implements the rtems_task_wake_after directive. The * calling task is blocked until the indicated number of clock * ticks have occurred. */ rtems_status_code rtems_task_wake_after( rtems_interval ticks ); /* * _RTEMS_tasks_Allocate * * DESCRIPTION: * * This function allocates a task control block from * the inactive chain of free task control blocks. */ STATIC INLINE Thread_Control *_RTEMS_tasks_Allocate( void ); /* * _RTEMS_tasks_Free * * DESCRIPTION: * * This routine frees a task control block to the * inactive chain of free task control blocks. */ STATIC INLINE void _RTEMS_tasks_Free ( Thread_Control *the_task ); /* * _RTEMS_tasks_Priority_to_Core * * DESCRIPTION: * * This function converts an RTEMS API priority into a core priority. */ STATIC INLINE Priority_Control _RTEMS_tasks_Priority_to_Core( rtems_task_priority priority ); /*PAGE * * _RTEMS_tasks_Initialize_user_tasks * * This routine creates and starts all configured user * initialzation threads. * * Input parameters: NONE * * Output parameters: NONE */ void _RTEMS_tasks_Initialize_user_tasks( void ); /*PAGE * * _RTEMS_tasks_Priority_is_valid * */ STATIC INLINE boolean _RTEMS_tasks_Priority_is_valid ( rtems_task_priority the_priority ); #include #include #ifdef __cplusplus } #endif #endif /* end of include file */