1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
/*
* COPYRIGHT (c) 1989-2008.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.com/license/LICENSE.
*
* $Id$
*/
#if HAVE_CONFIG_H
#include "config.h"
#endif
#include <rtems/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/score/apimutex.h>
#include <rtems/itron/task.h>
/*
* cre_tsk - Create Task
*/
ER cre_tsk(
ID tskid,
T_CTSK *pk_ctsk
)
{
register Thread_Control *the_thread;
bool status;
Priority_Control core_priority;
Objects_Name name;
/*
* Validate Parameters.
*/
if ( pk_ctsk == NULL )
return E_PAR;
if ((pk_ctsk->tskatr != TA_ASM ) &&
(pk_ctsk->tskatr != TA_HLNG) &&
(pk_ctsk->tskatr != TA_COP0) &&
(pk_ctsk->tskatr != TA_COP1) &&
(pk_ctsk->tskatr != TA_COP2) &&
(pk_ctsk->tskatr != TA_COP3) &&
(pk_ctsk->tskatr != TA_COP4) &&
(pk_ctsk->tskatr != TA_COP5) &&
(pk_ctsk->tskatr != TA_COP6) &&
(pk_ctsk->tskatr != TA_COP7))
return E_RSATR;
if (( pk_ctsk->itskpri <= 0 ) || ( pk_ctsk->itskpri >= 256 ))
return E_PAR;
if ( pk_ctsk->task == NULL )
return E_PAR;
if ( pk_ctsk->stksz < 0 )
return E_PAR;
/*
* Lock the allocator mutex for protection
*/
_RTEMS_Lock_allocator();
/*
* allocate the thread.
*/
the_thread = _ITRON_Task_Allocate( tskid );
if ( !the_thread ) {
_RTEMS_Unlock_allocator();
return _ITRON_Task_Clarify_allocation_id_error( tskid );
}
/*
* Initialize the core thread for this task.
*/
name.name_u32 = 0;
core_priority = _ITRON_Task_Priority_to_Core( pk_ctsk->itskpri );
status = _Thread_Initialize(
&_ITRON_Task_Information,
the_thread,
NULL,
pk_ctsk->stksz,
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
TRUE, /* XXX - All tasks FP (if the HW supports it) for now */
#else
FALSE,
#endif
core_priority,
TRUE, /* preemptible */
THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE,
NULL, /* no budget algorithm callout */
0,
name
);
if ( !status ) {
_ITRON_Task_Free( the_thread );
_RTEMS_Unlock_allocator();
return E_NOMEM;
}
/*
* This insures we evaluate the process-wide signals pending when we
* first run.
*
* NOTE: Since the thread starts with all unblocked, this is necessary.
*/
the_thread->do_post_task_switch_extension = true;
the_thread->Start.entry_point = (Thread_Entry) pk_ctsk->task;
_RTEMS_Unlock_allocator();
return E_OK;
}
|