FreeCalypso > hg > freecalypso-sw
comparison gsm-fw/gpf/osl/os_pro_fl.c @ 339:2f88c5b89113
OSL reconstruction: got to os_GetTaskData()
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Fri, 02 May 2014 23:44:12 +0000 |
parents | 42bc1d7068ac |
children | de7141ad907e |
comparison
equal
deleted
inserted
replaced
338:42bc1d7068ac | 339:2f88c5b89113 |
---|---|
15 #include "os_glob.h" | 15 #include "os_glob.h" |
16 | 16 |
17 typedef unsigned char u_char; | 17 typedef unsigned char u_char; |
18 | 18 |
19 extern T_OS_TASK_TABLE_ENTRY TaskTable[]; | 19 extern T_OS_TASK_TABLE_ENTRY TaskTable[]; |
20 extern VOID *TCD_Current_Thread; | |
20 | 21 |
21 /* .bss */ | 22 /* .bss */ |
22 static NU_SEMAPHORE ProSemCB; | 23 static NU_SEMAPHORE ProSemCB; |
24 | |
25 #define OS_NU_TASK_MAGIC 0xdeafbeef | |
23 | 26 |
24 static int | 27 static int |
25 os_GetTaskEntry(USHORT Index, OS_HANDLE *Handle) | 28 os_GetTaskEntry(USHORT Index, OS_HANDLE *Handle) |
26 { | 29 { |
27 static USHORT Idx; | 30 static USHORT Idx; |
50 CHAR Name[NU_MAX_NAME]; | 53 CHAR Name[NU_MAX_NAME]; |
51 u_char *StackBase, *sp; | 54 u_char *StackBase, *sp; |
52 USHORT Untouched; | 55 USHORT Untouched; |
53 | 56 |
54 if (os_GetTaskEntry(Index, &Handle) < 0) | 57 if (os_GetTaskEntry(Index, &Handle) < 0) |
55 return(-1); | 58 return(OS_ERROR); |
56 if (NU_Task_Information(&TaskTable[Handle].TaskCB.TCB, Name, | 59 if (NU_Task_Information(&TaskTable[Handle].TaskCB.TCB, Name, |
57 &TaskStatus, &Count, &Prio, &Preempt, | 60 &TaskStatus, &Count, &Prio, &Preempt, |
58 &TimeSlice, (VOID **) &StackBase, | 61 &TimeSlice, (VOID **) &StackBase, |
59 &Size, &MinStack) != NU_SUCCESS) | 62 &Size, &MinStack) != NU_SUCCESS) |
60 return(-1); | 63 return(OS_ERROR); |
61 Untouched = 0; | 64 Untouched = 0; |
62 for (sp = StackBase; sp < StackBase + Size; sp++) { | 65 for (sp = StackBase; sp < StackBase + Size; sp++) { |
63 if (*sp != 0xFE) | 66 if (*sp != 0xFE) |
64 break; | 67 break; |
65 Untouched++; | 68 Untouched++; |
66 } | 69 } |
67 sprintf(Buffer, | 70 sprintf(Buffer, |
68 "Name:%s Stat:%d Count:%ld Prio:%d Stack:%lx Size:%ld Untouched:%d", | 71 "Name:%s Stat:%d Count:%ld Prio:%d Stack:%lx Size:%ld Untouched:%d", |
69 Name, TaskStatus, Count, 255 - Prio, (ULONG) StackBase, | 72 Name, TaskStatus, Count, 255 - Prio, (ULONG) StackBase, |
70 (ULONG) Size, Untouched); | 73 (LONG) Size, Untouched); |
71 return(0); | 74 return(OS_OK); |
72 } | 75 } |
76 | |
77 GLOBAL LONG | |
78 os_StopTask(OS_HANDLE Caller, OS_HANDLE TaskHandle) | |
79 { | |
80 if (NU_Suspend_Task(&TaskTable[TaskHandle].TaskCB.TCB) == NU_SUCCESS) | |
81 return(OS_OK); | |
82 else | |
83 return(OS_ERROR); | |
84 } | |
85 | |
86 GLOBAL LONG | |
87 os_StartTask(OS_HANDLE Caller, OS_HANDLE TaskHandle, ULONG Value) | |
88 { | |
89 if (NU_Resume_Task(&TaskTable[TaskHandle].TaskCB.TCB) == NU_SUCCESS) | |
90 return(OS_OK); | |
91 else | |
92 return(OS_ERROR); | |
93 } | |
94 | |
95 GLOBAL LONG | |
96 os_ProInit(void) | |
97 { | |
98 USHORT i; | |
99 | |
100 if (NU_Create_Semaphore(&ProSemCB, "PROSEM", 1, NU_PRIORITY) | |
101 != NU_SUCCESS) | |
102 return(OS_ERROR); | |
103 for (i = 1; i <= MaxTasks; i++) | |
104 bzero(&TaskTable[i], sizeof(T_OS_TASK_TABLE_ENTRY)); | |
105 return(OS_OK); | |
106 } | |
107 | |
108 GLOBAL unsigned char | |
109 os_GetTaskState(OS_HANDLE Caller, OS_HANDLE Handle) | |
110 { | |
111 if (TaskTable[Handle].Name[0]) | |
112 return(TaskTable[Handle].TaskCB.TCB.tc_status); | |
113 else | |
114 return(255); | |
115 } | |
116 | |
117 GLOBAL LONG | |
118 os_GetTaskHandle(OS_HANDLE Caller, char *Name, OS_HANDLE *TaskHandle) | |
119 { | |
120 USHORT i; | |
121 | |
122 if (!Name) { | |
123 OS_NU_TASK *os_nu_task = (OS_NU_TASK *) TCD_Current_Thread; | |
124 | |
125 if (os_nu_task && os_nu_task->magic_nr == OS_NU_TASK_MAGIC) | |
126 *TaskHandle = os_nu_task->handle; | |
127 else | |
128 *TaskHandle = OS_NOTASK; | |
129 return(OS_OK); | |
130 } | |
131 for (i = 1; i <= MaxTasks; i++) | |
132 if (TaskTable[i].Name[0] && | |
133 !strncmp(Name, TaskTable[i].Name, RESOURCE_NAMELEN - 1)) { | |
134 *TaskHandle = i; | |
135 return(OS_OK); | |
136 } | |
137 return(OS_ERROR); | |
138 } | |
139 | |
140 GLOBAL LONG | |
141 os_GetTaskData(OS_HANDLE Handle, unsigned **tcb, | |
142 u_char **stackbegin, u_char **stackend) | |
143 { | |
144 NU_TASK *task; | |
145 | |
146 if (!TaskTable[Handle].Name[0]) | |
147 return(OS_ERROR); | |
148 task = &TaskTable[Handle].TaskCB.TCB; | |
149 *tcb = (unsigned *) task; | |
150 *stackbegin = (u_char *) task->tc_stack_start; | |
151 *stackend = (u_char *) task->tc_stack_end; | |
152 return(OS_OK); | |
153 } |