changeset 341:fcbdb2ae1a47

OSL: os_CreateTask() done
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Sat, 03 May 2014 12:24:56 +0000
parents de7141ad907e
children 1c94c36ca3e4
files gsm-fw/gpf/osl/os_pro_fl.c
diffstat 1 files changed, 43 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/gsm-fw/gpf/osl/os_pro_fl.c	Sat May 03 00:33:45 2014 +0000
+++ b/gsm-fw/gpf/osl/os_pro_fl.c	Sat May 03 12:24:56 2014 +0000
@@ -16,10 +16,10 @@
 
 typedef unsigned char u_char;
 
+extern VOID *TCD_Current_Thread;
 extern T_OS_TASK_TABLE_ENTRY TaskTable[];
-extern VOID *TCD_Current_Thread;
+extern VOID os_TaskEntry(UNSIGNED, VOID *);
 
-/* .bss */
 static NU_SEMAPHORE ProSemCB;
 
 #define	OS_NU_TASK_MAGIC	0xdeafbeef
@@ -63,7 +63,7 @@
 		return(OS_ERROR);
 	Untouched = 0;
 	for (sp = StackBase; sp < StackBase + Size; sp++) {
-		if (*sp != 0xFE)
+		if (*sp != INITIAL_STACK_VALUE)
 			break;
 		Untouched++;
 	}
@@ -186,3 +186,43 @@
 		NU_Release_Semaphore(&ProSemCB);
 	return(OS_OK);
 }
+
+GLOBAL LONG
+os_CreateTask(OS_HANDLE Caller, char *Name,
+		void (*TaskEntry)(OS_HANDLE, ULONG), ULONG StackSize,
+		USHORT Priority, OS_HANDLE *TaskHandle, OS_HANDLE MemPoolHandle)
+{
+	STATUS sem_sts;
+	USHORT Handle;
+	u_char *stack;
+
+	sem_sts = NU_Obtain_Semaphore(&ProSemCB, NU_SUSPEND);
+	for (Handle = 1; Handle <= MaxTasks; Handle++)
+		if (!TaskTable[Handle].Name[0])
+			break;
+	if (Handle > MaxTasks) {
+return_error:	if (sem_sts == NU_SUCCESS)
+			NU_Release_Semaphore(&ProSemCB);
+		return(OS_ERROR);
+	}
+	if (os_AllocateMemory(Handle, &TaskTable[Handle].Stack, StackSize + 4,
+				0, MemPoolHandle) != OS_OK)
+		goto return_error;
+	stack = (u_char *)TaskTable[Handle].Stack + 4;
+	memset(stack, INITIAL_STACK_VALUE, StackSize);
+	*TaskTable[Handle].Stack = GUARD_PATTERN;
+	if (NU_Create_Task(&TaskTable[Handle].TaskCB.TCB, Name, os_TaskEntry,
+				Handle, 0, stack, StackSize,
+				255 - Priority, 0, NU_PREEMPT, NU_NO_START)
+			!= NU_SUCCESS)
+		goto return_error;
+	strncpy(TaskTable[Handle].Name, Name, RESOURCE_NAMELEN);
+	TaskTable[Handle].Name[RESOURCE_NAMELEN-1] = 0;
+	TaskTable[Handle].TaskEntry = TaskEntry;
+	TaskTable[Handle].TaskCB.magic_nr = OS_NU_TASK_MAGIC;
+	TaskTable[Handle].TaskCB.handle = Handle;
+	*TaskHandle = Handle;
+	if (sem_sts == NU_SUCCESS)
+		NU_Release_Semaphore(&ProSemCB);
+	return(OS_OK);
+}