1 /*
2 * Copyright (c) 2010, Texas Instruments Incorporated
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *
12 * * Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * * Neither the name of Texas Instruments Incorporated nor the names of
17 * its contributors may be used to endorse or promote products derived
18 * from this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32
33 /*
34 * @file timm_osal_task.c
35 * This file contains methods that provides the functionality
36 * for creating/destroying tasks.
37 *
38 * @path \
39 *
40 */
41 /* -------------------------------------------------------------------------- */
42 /* =========================================================================
43 *!
44 *! Revision History
45 *! ===================================
46 *! 21-Oct-2008 Maiya ShreeHarsha: Linux specific changes
47 *! 0.1: Created the first draft version, ksrini@ti.com
48 * ========================================================================= */
49
50 /******************************************************************************
51 * Includes
52 ******************************************************************************/
53
54 #include <stdio.h>
55 #include <pthread.h> /*for POSIX calls */
56 #include <sched.h> /*for sched structure */
57 #include <unistd.h>
58
59
60
61 #include "timm_osal_types.h"
62 #include "timm_osal_trace.h"
63 #include "timm_osal_error.h"
64 #include "timm_osal_memory.h"
65 #include "timm_osal_task.h"
66
67
68
69
70 /**
71 * TIMM_OSAL_TASK describe the different task information
72 */
73 typedef struct TIMM_OSAL_TASK
74 {
75 pthread_t threadID; /*SHM check */
76 /* To set the priority and stack size */
77 pthread_attr_t ThreadAttr; /*For setting the priority and stack size */
78 /** Name of the task */
79 /* TIMM_OSAL_S8 name[8];*//* eight character plus null char */
80 /** Pointer to the task stack memory */
81 /* TIMM_OSAL_PTR stackPtr;*/
82 /** Size of the task stack */
83 /* TIMM_OSAL_S32 stackSize;*/
84 /*parameters to the task */
85 TIMM_OSAL_U32 uArgc;
86 TIMM_OSAL_PTR pArgv;
87 /** task priority */
88 /* TIMM_OSAL_S32 priority;*/
89 /** flag to check if task got created */
90 TIMM_OSAL_BOOL isCreated;
91 } TIMM_OSAL_TASK;
92
93
94 /******************************************************************************
95 * Function Prototypes
96 ******************************************************************************/
97
98
99 /* ========================================================================== */
100 /**
101 * @fn TIMM_OSAL_CreateTask function
102 *
103 * @see
104 */
105 /* ========================================================================== */
106
TIMM_OSAL_CreateTask(TIMM_OSAL_PTR * pTask,TIMM_OSAL_TaskProc pFunc,TIMM_OSAL_U32 uArgc,TIMM_OSAL_PTR pArgv,TIMM_OSAL_U32 uStackSize,TIMM_OSAL_U32 uPriority,TIMM_OSAL_S8 * pName)107 TIMM_OSAL_ERRORTYPE TIMM_OSAL_CreateTask(TIMM_OSAL_PTR * pTask,
108 TIMM_OSAL_TaskProc pFunc,
109 TIMM_OSAL_U32 uArgc,
110 TIMM_OSAL_PTR pArgv,
111 TIMM_OSAL_U32 uStackSize, TIMM_OSAL_U32 uPriority, TIMM_OSAL_S8 * pName)
112 {
113
114 TIMM_OSAL_ERRORTYPE bReturnStatus = TIMM_OSAL_ERR_UNKNOWN;
115 TIMM_OSAL_TASK *pHandle = TIMM_OSAL_NULL;
116 struct sched_param sched;
117 size_t stackSize;
118 *pTask = TIMM_OSAL_NULL;
119
120
121 /*Task structure allocation */
122 pHandle =
123 (TIMM_OSAL_TASK *) TIMM_OSAL_Malloc(sizeof(TIMM_OSAL_TASK), 0, 0,
124 0);
125 if (pHandle == TIMM_OSAL_NULL)
126 {
127 bReturnStatus = TIMM_OSAL_ERR_ALLOC;
128 goto EXIT;
129 }
130
131 /* Initial cleaning of the task structure */
132 TIMM_OSAL_Memset((TIMM_OSAL_PTR) pHandle, 0, sizeof(TIMM_OSAL_TASK));
133
134 /*Arguments for task */
135 pHandle->uArgc = uArgc;
136 pHandle->pArgv = pArgv;
137
138 pHandle->isCreated = TIMM_OSAL_FALSE;
139
140
141 if (SUCCESS != pthread_attr_init(&pHandle->ThreadAttr))
142 {
143 /*TIMM_OSAL_Error("Task Init Attr Init failed!"); */
144 goto EXIT;
145 }
146 /* Updation of the priority and the stack size */
147
148 if (SUCCESS != pthread_attr_getschedparam(&pHandle->ThreadAttr,
149 &sched))
150 {
151 /*TIMM_OSAL_Error("Task Init Get Sched Params failed!"); */
152 goto EXIT;
153 }
154
155 sched.sched_priority = uPriority; /* relative to the default priority */
156 if (SUCCESS != pthread_attr_setschedparam(&pHandle->ThreadAttr,
157 &sched))
158 {
159 /*TIMM_OSAL_Error("Task Init Set Sched Paramsfailed!"); */
160 goto EXIT;
161 }
162
163 /*First get the default stack size */
164 if (SUCCESS != pthread_attr_getstacksize(&pHandle->ThreadAttr,
165 &stackSize))
166 {
167 /*TIMM_OSAL_Error("Task Init Set Stack Size failed!"); */
168 goto EXIT;
169 }
170
171 /*Check if requested stack size is larger than the current default stack size */
172 if (uStackSize > stackSize)
173 {
174 stackSize = uStackSize;
175 if (SUCCESS != pthread_attr_setstacksize(&pHandle->ThreadAttr,
176 stackSize))
177 {
178 /*TIMM_OSAL_Error("Task Init Set Stack Size failed!"); */
179 goto EXIT;
180 }
181 }
182
183
184
185 if (SUCCESS != pthread_create(&pHandle->threadID,
186 &pHandle->ThreadAttr, pFunc, pArgv))
187 {
188 /*TIMM_OSAL_Error ("Create_Task failed !"); */
189 goto EXIT;
190 }
191
192
193 /* Task was successfully created */
194 pHandle->isCreated = TIMM_OSAL_TRUE;
195 *pTask = (TIMM_OSAL_PTR) pHandle;
196 bReturnStatus = TIMM_OSAL_ERR_NONE;
197 /**pTask = (TIMM_OSAL_PTR *)pHandle;*/
198
199 EXIT:
200 /* if((TIMM_OSAL_ERR_NONE != bReturnStatus) && (TIMM_OSAL_NULL != pHandle)) {
201 TIMM_OSAL_Free (pHandle->stackPtr);*/
202 if ((TIMM_OSAL_ERR_NONE != bReturnStatus))
203 {
204 TIMM_OSAL_Free(pHandle);
205 }
206 return bReturnStatus;
207
208 }
209
210 /* ========================================================================== */
211 /**
212 * @fn TIMM_OSAL_DeleteTask
213 *
214 * @see
215 */
216 /* ========================================================================== */
217
TIMM_OSAL_DeleteTask(TIMM_OSAL_PTR pTask)218 TIMM_OSAL_ERRORTYPE TIMM_OSAL_DeleteTask(TIMM_OSAL_PTR pTask)
219 {
220 TIMM_OSAL_ERRORTYPE bReturnStatus = TIMM_OSAL_ERR_UNKNOWN;
221
222 TIMM_OSAL_TASK *pHandle = (TIMM_OSAL_TASK *) pTask;
223 void *retVal;
224
225 if ((NULL == pHandle) || (TIMM_OSAL_TRUE != pHandle->isCreated))
226 {
227 /* this task was never created */
228 bReturnStatus = TIMM_OSAL_ERR_PARAMETER;
229 goto EXIT;
230 }
231 if (pthread_attr_destroy(&pHandle->ThreadAttr))
232 {
233 /*TIMM_OSAL_Error("Delete_Task failed !"); */
234 goto EXIT;
235 }
236 if (pthread_join(pHandle->threadID, &retVal))
237 {
238 /*TIMM_OSAL_Error("Delete_Task failed !"); */
239 goto EXIT;
240 /* bReturnStatus = TIMM_OSAL_ERR_CREATE(TIMM_OSAL_ERR, TIMM_OSAL_COMP_TASK, status);*//*shm to be done */
241 }
242 bReturnStatus = TIMM_OSAL_ERR_NONE;
243 TIMM_OSAL_Free(pHandle);
244 EXIT:
245 return bReturnStatus;
246 }
247
248
TIMM_OSAL_SleepTask(TIMM_OSAL_U32 mSec)249 TIMM_OSAL_ERRORTYPE TIMM_OSAL_SleepTask(TIMM_OSAL_U32 mSec)
250 {
251 TIMM_OSAL_S32 nReturn = 0;
252
253 #ifdef _POSIX_VERSION_1_
254 usleep(1000 * mSec);
255 #else
256 nReturn = usleep(1000 * mSec);
257 #endif
258 if (nReturn == 0)
259 return TIMM_OSAL_ERR_NONE;
260 else
261 return TIMM_OSAL_ERR_UNKNOWN;
262 }
263