FreeCalypso > hg > fc-tourmaline
comparison src/gpf/osl/os_tim_fl.c @ 0:4e78acac3d88
src/{condat,cs,gpf,nucleus}: import from Selenite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 16 Oct 2020 06:23:26 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4e78acac3d88 |
---|---|
1 /* | |
2 * This C module is a reconstruction based on the disassembly of | |
3 * os_tim.obj in frame_na7_db_fl.lib from the Leonardo package, | |
4 * subsequently reworked by Space Falcon. | |
5 */ | |
6 | |
7 /* set of included headers from COFF symtab: */ | |
8 #include <stdio.h> | |
9 #include "nucleus.h" | |
10 #include "typedefs.h" | |
11 #include "os.h" | |
12 #include "gdi.h" | |
13 #include "os_types.h" | |
14 #include "os_glob.h" | |
15 | |
16 extern UNSIGNED TMD_Timer; | |
17 extern INT TMD_Timer_State; | |
18 | |
19 extern T_OS_TIMER_ENTRY TimerTable[]; | |
20 extern T_OS_TIMER_TABLE_ENTRY *p_list[]; | |
21 | |
22 extern void os_Timeout(UNSIGNED t_handle); | |
23 extern void timer_error(int err); | |
24 | |
25 unsigned os_time_to_tick_multiplier = TIME_TO_TICK_TDMA_FRAME_MULTIPLIER; | |
26 unsigned os_tick_to_time_multiplier = TICK_TO_TIME_TDMA_FRAME_MULTIPLIER; | |
27 | |
28 unsigned volatile t_start_ticks; | |
29 T_OS_TIMER_TABLE_ENTRY *t_running; | |
30 int used_timers; | |
31 int next_t_handle; | |
32 int volatile t_list_access; | |
33 int max_used_timers; | |
34 NU_SEMAPHORE TimSemCB; | |
35 NU_TIMER os_timer_cb; | |
36 | |
37 #ifdef __GNUC__ | |
38 #define BARRIER asm volatile ("": : :"memory") | |
39 #else | |
40 #define BARRIER /* prayer */ | |
41 #endif | |
42 | |
43 GLOBAL LONG | |
44 os_set_tick(int os_system_tick) | |
45 { | |
46 switch (os_system_tick) { | |
47 case SYSTEM_TICK_TDMA_FRAME: | |
48 os_time_to_tick_multiplier = TIME_TO_TICK_TDMA_FRAME_MULTIPLIER; | |
49 os_tick_to_time_multiplier = TICK_TO_TIME_TDMA_FRAME_MULTIPLIER; | |
50 return(OS_OK); | |
51 case SYSTEM_TICK_10_MS: | |
52 os_time_to_tick_multiplier = TIME_TO_TICK_10MS_MULTIPLIER; | |
53 os_tick_to_time_multiplier = TICK_TO_TIME_10MS_MULTIPLIER; | |
54 return(OS_OK); | |
55 default: | |
56 return(OS_ERROR); | |
57 } | |
58 } | |
59 | |
60 GLOBAL LONG | |
61 os_TimerInformation(USHORT Index, char *Buffer) | |
62 { | |
63 static int t_info_read; | |
64 | |
65 if (t_info_read) { | |
66 t_info_read = 0; | |
67 return(OS_ERROR); | |
68 } | |
69 sprintf(Buffer, "Maximum %d of %d available timers running", | |
70 max_used_timers, MaxSimultaneousTimer); | |
71 t_info_read = 1; | |
72 return(OS_OK); | |
73 } | |
74 | |
75 GLOBAL LONG | |
76 os_TimInit(void) | |
77 { | |
78 int i; | |
79 | |
80 if (NU_Create_Semaphore(&TimSemCB, "TIMSEM", 1, NU_PRIORITY) | |
81 != NU_SUCCESS) | |
82 return(OS_ERROR); | |
83 if (NU_Create_Timer(&os_timer_cb, "OS_TIMER", os_Timeout, 0, 1, 0, | |
84 NU_DISABLE_TIMER) != NU_SUCCESS) | |
85 return(OS_ERROR); | |
86 used_timers = 0; | |
87 max_used_timers = 0; | |
88 next_t_handle = 1; | |
89 t_list_access = 0; | |
90 t_start_ticks = 0; | |
91 p_list[0] = 0; | |
92 for (i = 1; i < MaxSimultaneousTimer; i++) { | |
93 TimerTable[i].entry.status = TMR_FREE; | |
94 TimerTable[i].entry.next = 0; | |
95 TimerTable[i].entry.prev = 0; | |
96 TimerTable[i].next_t_handle = i + 1; | |
97 p_list[i] = 0; | |
98 } | |
99 TimerTable[MaxSimultaneousTimer].entry.status = TMR_FREE; | |
100 TimerTable[MaxSimultaneousTimer].next_t_handle = 0; | |
101 t_running = 0; | |
102 return(OS_OK); | |
103 } | |
104 | |
105 GLOBAL LONG | |
106 os_RecoverTick(OS_TICK ticks) | |
107 { | |
108 UNSIGNED current_system_clock; | |
109 | |
110 current_system_clock = NU_Retrieve_Clock(); | |
111 NU_Set_Clock(current_system_clock + ticks); | |
112 if (TMD_Timer_State == TM_ACTIVE) { | |
113 if (TMD_Timer <= ticks) { | |
114 TMD_Timer_State = TM_EXPIRED; | |
115 TMD_Timer = 0; | |
116 } else | |
117 TMD_Timer -= ticks; | |
118 } | |
119 return(OS_OK); | |
120 } | |
121 | |
122 GLOBAL LONG | |
123 os_QueryTimer(OS_HANDLE TaskHandle, OS_HANDLE TimerHandle, | |
124 OS_TIME *RemainingTime) | |
125 { | |
126 T_OS_TIMER_TABLE_ENTRY *timer, *t_iter; | |
127 OS_TICK c_ticks, r_ticks, e_ticks; | |
128 STATUS sts; | |
129 | |
130 if (TimerHandle > MaxSimultaneousTimer) | |
131 return(OS_ERROR); | |
132 sts = NU_Obtain_Semaphore(&TimSemCB, NU_SUSPEND); | |
133 timer = &TimerTable[TimerHandle].entry; | |
134 if (timer->status == TMR_FREE) { | |
135 if (sts == NU_SUCCESS) | |
136 NU_Release_Semaphore(&TimSemCB); | |
137 return(OS_ERROR); | |
138 } | |
139 t_list_access = 1; | |
140 BARRIER; | |
141 if (!t_running) { | |
142 r_ticks = 0; | |
143 goto out; | |
144 } | |
145 c_ticks = NU_Retrieve_Clock(); | |
146 e_ticks = c_ticks - t_start_ticks; | |
147 t_iter = t_running; | |
148 if (t_iter->r_ticks >= e_ticks) | |
149 r_ticks = t_iter->r_ticks - e_ticks; | |
150 else | |
151 r_ticks = 0; | |
152 while (t_iter != timer) { | |
153 t_iter = t_iter->next; | |
154 if (t_iter == t_running) { | |
155 r_ticks = 0; | |
156 goto out; | |
157 } | |
158 r_ticks += t_iter->r_ticks; | |
159 } | |
160 out: BARRIER; | |
161 t_list_access = 0; | |
162 if (sts == NU_SUCCESS) | |
163 NU_Release_Semaphore(&TimSemCB); | |
164 *RemainingTime = SYSTEM_TICKS_TO_TIME(r_ticks); | |
165 return(OS_OK); | |
166 } | |
167 | |
168 GLOBAL LONG | |
169 os_InactivityTicks(int *next_event, OS_TICK *next_event_ticks) | |
170 { | |
171 *next_event = 1; | |
172 switch (TMD_Timer_State) { | |
173 case TM_ACTIVE: | |
174 *next_event_ticks = TMD_Timer; | |
175 return(OS_OK); | |
176 case TM_NOT_ACTIVE: | |
177 *next_event_ticks = 0; | |
178 *next_event = 0; | |
179 return(OS_OK); | |
180 default: | |
181 *next_event_ticks = 0; | |
182 return(OS_OK); | |
183 } | |
184 } |