diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 1999-11-09 22:07:23 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 1999-11-09 22:07:23 +0000 |
commit | 352c9b2035e32e56f10f261d94955d97f4ab0f1c (patch) | |
tree | f433e95ae0ab8d8854ea19b7f4bfab3ffb431726 /c/src/exec/itron/src/task.c | |
parent | Fixed warning where initialized default POSIX API structure did (diff) | |
download | rtems-352c9b2035e32e56f10f261d94955d97f4ab0f1c.tar.bz2 |
This patch adds the basic framework for the ITRON 3.0 API implementation
for RTEMS.
Diffstat (limited to 'c/src/exec/itron/src/task.c')
-rw-r--r-- | c/src/exec/itron/src/task.c | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/c/src/exec/itron/src/task.c b/c/src/exec/itron/src/task.c new file mode 100644 index 0000000000..f646b29d49 --- /dev/null +++ b/c/src/exec/itron/src/task.c @@ -0,0 +1,217 @@ +/* + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include <itron.h> + +#include <rtems/score/thread.h> +#include <rtems/score/userext.h> +#include <rtems/score/wkspace.h> +#include <rtems/score/apiext.h> +#include <rtems/score/sysstate.h> + +#include <rtems/itron/task.h> + +/* + * _ITRON_Task_Create_extension + * + * This routine is an extension routine that is invoked as part + * of creating any type of task or thread in the system. If the + * task is created via another API, then this routine is invoked + * and this API given the opportunity to initialize its extension + * area. + */ + +boolean _ITRON_Task_Create_extension( + Thread_Control *executing, + Thread_Control *created +) +{ + ITRON_API_Control *api; + + api = _Workspace_Allocate( sizeof( ITRON_API_Control ) ); + + if ( !api ) + return FALSE; + + created->API_Extensions[ THREAD_API_ITRON ] = api; + + /* + * Initialize the ITRON API extension + */ + + return TRUE; +} + +/* + * _ITRON_Task_Delete_extension + * + * This extension routine is invoked when a task is deleted. + */ + +User_extensions_routine _ITRON_Task_Delete_extension( + Thread_Control *executing, + Thread_Control *deleted +) +{ + (void) _Workspace_Free( deleted->API_Extensions[ THREAD_API_ITRON ] ); + + deleted->API_Extensions[ THREAD_API_ITRON ] = NULL; +} + +/* + * _ITRON_Task_Initialize_user_tasks + * + * This routine creates and starts all configured user + * initialzation threads. + */ + +void _ITRON_Task_Initialize_user_tasks( void ) +{ + unsigned32 index; + unsigned32 maximum; + ER return_value; + itron_initialization_tasks_table *user_tasks; + + /* + * NOTE: This is slightly different from the Ada implementation. + */ + + user_tasks = _ITRON_Task_User_initialization_tasks; + maximum = _ITRON_Task_Number_of_initialization_tasks; + + if ( !user_tasks || maximum == 0 ) + return; + + for ( index=0 ; index < maximum ; index++ ) { + + return_value = cre_tsk( + user_tasks[ index ].id, + &user_tasks[ index ].attributes + ); + + if ( return_value != E_OK ) + _Internal_error_Occurred( INTERNAL_ERROR_ITRON_API, TRUE, return_value ); + + return_value = sta_tsk( user_tasks[ index ].id, 0 ); + + if ( return_value != E_OK ) + _Internal_error_Occurred( INTERNAL_ERROR_ITRON_API, TRUE, return_value ); + + } +} + +/*PAGE + * + * _ITRON_Delete_task + */ + +ER _ITRON_Delete_task( + Thread_Control *the_thread +) +{ + Objects_Information *the_information; + + the_information = _Objects_Get_information( the_thread->Object.id ); + + if ( !the_information ) { + return -1; /* XXX */ + /* This should never happen if _Thread_Get() works right */ + } + + _Thread_Close( the_information, the_thread ); + + _ITRON_Task_Free( the_thread ); + + return E_OK; +} + +/* + * At this point in time, the ITRON API does not need any other + * extensions. See the POSIX and RTEMS API extensions for + * examples of how they can be used. + */ + +/* + * Extension Tables + */ + +API_extensions_Control _ITRON_Task_API_extensions = { + { NULL, NULL }, + NULL, /* predriver */ + _ITRON_Task_Initialize_user_tasks, /* postdriver */ + NULL /* post switch */ +}; + +User_extensions_Control _ITRON_Task_User_extensions = { + { NULL, NULL }, + { _ITRON_Task_Create_extension, /* create */ + NULL, /* start */ + NULL, /* restart */ + _ITRON_Task_Delete_extension, /* delete */ + NULL, /* switch */ + NULL, /* begin */ + NULL, /* exitted */ + NULL /* fatal */ + } +}; + +/* + * _ITRON_Task_Manager_initialization + * + * This routine initializes all Task Manager related data structures. + * + * Input parameters: + * maximum_tasks - number of tasks to initialize + * + * Output parameters: NONE + */ + +void _ITRON_Task_Manager_initialization( + unsigned32 maximum_tasks, + unsigned32 number_of_initialization_tasks, + itron_initialization_tasks_table *user_tasks +) +{ + + _ITRON_Task_Number_of_initialization_tasks = number_of_initialization_tasks; + _ITRON_Task_User_initialization_tasks = user_tasks; + + /* + * There may not be any ITRON_initialization tasks configured. + */ + +#if 0 + if ( user_tasks == NULL || number_of_initialization_tasks == 0 ) + _Internal_error_Occurred( INTERNAL_ERROR_ITRON_API, TRUE, -1 ); +#endif + + _Objects_Initialize_information( + &_ITRON_Task_Information, /* object information table */ + OBJECTS_ITRON_TASKS, /* object class */ + FALSE, /* TRUE if this is a global object class */ + maximum_tasks, /* maximum objects of this class */ + sizeof( Thread_Control ), /* size of this object's control block */ + FALSE, /* TRUE if names for this object are strings */ + ITRON_MAXIMUM_NAME_LENGTH, /* maximum length of each object's name */ + TRUE /* TRUE if this class is threads */ + ); + + /* + * Add all the extensions for this API + */ + + _User_extensions_Add_API_set( &_ITRON_Task_User_extensions ); + + _API_extensions_Add( &_ITRON_Task_API_extensions ); + + /* + * XXX MP not supported + * Register the MP Process Packet routine. + */ + +} |