BEEP-8 SDK 1.0.0
Loading...
Searching...
No Matches
os.h
Go to the documentation of this file.
1
14#pragma once
15
16#ifdef __cplusplus
17extern "C" {
18#endif
19
20#include <stddef.h>
21#include <b8/type.h>
22
23typedef u32 b8OsPid; // process id
24#define B8_OS_INVALID_PID (0)
25
26typedef u32 b8OsSid; // semaphore id
27#define B8_OS_INVALID_SID (0)
28
29typedef u64 b8OsCpuCycles;
30
31// scheduling policies
32#define B8_OS_SCHED_FIFO 1 // FIFO priority scheduling policy
33#define B8_OS_SCHED_RR 2 // Round robin scheduling policy
34#define B8_OS_SCHED_SPORADIC 3 // Sporadic scheduling policy
35#define B8_OS_SCHED_IRQ 4 // Irq handler scheduling policy
36#define B8_OS_SCHED_OTHER 5 // Not supported
37
38#define B8_OS_NOT_USING_IRQ (0xffff)
39
40#define B8_OS_SEM_WAIT (0)
41#define B8_OS_SEM_TRYWAIT (1)
42#define B8_OS_SEM_TIMEDWAIT (2)
43
44#define B8_OS_CLOCKID_REALTIME (0x10)
45#define B8_OS_CLOCKID_MONOTONIC (0x11)
46#define B8_OS_CLOCKID_PROCESS_CPUTIME_ID (0x12) // Not supported
47#define B8_OS_CLOCKID_THREAD_CPUTIME_ID (0x13) // Not supported
48
49// Maximum value the semaphore can have.
50#define SEM_VALUE_MAX (32767)
51typedef enum {
52 B8_OS_SYSCALL_NULL = 0,
53
54 B8_OS_SYSCALL_GET_BRIDGE,
55
56 /*
57 in:
58 [0] = B8_OS_SYSCALL_SCHED_YIELD
59 */
60 B8_OS_SYSCALL_SCHED_YIELD,
61
62 /*
63 in:
64 [0] = B8_OS_SYSCALL_SCHED_SLEEP
65 [1] = u32 SleepTime.HI [us]
66 [2] = u32 SleepTime.LO [us]
67 */
68 B8_OS_SYSCALL_SCHED_SLEEP,
69
70 /*
71 in:
72 [0] = B8_OS_SYSCALL_THREAD_CREATE
73 [1] = void* StackAddr
74 [2] = size_t StackSize
75 [3] = void* StartRoutine
76 [4] = void* Arg
77 [5] = u32 SchedulingPolicy B8_OS_SCHED_*
78 [6] = u32 IrqNo
79
80 out:
81 b8OsBridgeUsr2Svc::ret_pid
82 */
83 B8_OS_SYSCALL_THREAD_CREATE,
84
85 /*
86 in:
87 [0] = B8_OS_SYSCALL_EXIT
88 */
89 B8_OS_SYSCALL_EXIT,
90
91 /*
92 in:
93 [0] = B8_OS_SYSCALL_SET_ERRNO
94 [1] = int errcode
95 */
96 B8_OS_SYSCALL_SET_ERRNO,
97
98 /*
99 in:
100 [0] = B8_OS_SYSCALL_GET_ERRNO
101 */
102 B8_OS_SYSCALL_GET_ERRNO,
103
104 /*
105 in:
106 [0] = B8_OS_SYSCALL_SEM_INIT
107 [1] = int pshared (DON'T CARE)
108 [2] = int value
109 */
110 B8_OS_SYSCALL_SEM_INIT,
111
112 /*
113 in:
114 [0] = B8_OS_SYSCALL_SEM_POST
115 [1] = b8OsSid SemaphoreID
116 */
117 B8_OS_SYSCALL_SEM_POST,
118
119 /*
120 in:
121 [0] = B8_OS_SYSCALL_SEM_WAIT
122 [1] = b8OsSid SemaphoreID
123 [2] =
124 B8_OS_SEM_WAIT : sem_wait()
125 B8_OS_SEM_TRYWAIT : sem_trywait()
126 B8_OS_SEM_TIMEDWAIT : sem_timedwait()
127 */
128 B8_OS_SYSCALL_SEM_WAIT,
129
130 /*
131 in:
132 [0] = B8_OS_SYSCALL_SEM_GETVALUE
133 [1] = b8OsSid SemaphoreID
134
135 out:
136 b8OsBridgeUsr2Svc::ret_semcount
137 */
138 B8_OS_SYSCALL_SEM_GETVALUE,
139
140 B8_OS_SYSCALL_CLOCK_GETRES,
141
142 /*
143 in:
144 [0] = B8_OS_SYSCALL_CLOCK_GETTIME
145 [1] = B8_OS_CLOCKID_*
146
147 out:
148 b8OsBridgeUsr2Svc::tv_sec : sec
149 b8OsBridgeUsr2Svc::tv_nsec : nsec
150 */
151 B8_OS_SYSCALL_CLOCK_GETTIME,
152
153 /*
154 in:
155 [0] = B8_OS_SYSCALL_CLOCK_SETTIME
156 [1] = sec
157 [2] = nsec
158 */
159 B8_OS_SYSCALL_CLOCK_SETTIME,
160
161 /* --- */
162 B8_OS_SYSCALL_MAX,
163} b8OsSysCallNum;
164
165typedef enum {
166 B8_OS_SYSCALL_THREAD_CREATE_PID=1,
167 B8_OS_SYSCALL_SEM_INIT_SID=1,
168 B8_OS_SYSCALL_SEM_GETVALUE_RESULT=1,
169} b8OsSysCallResultIdx;
170
171typedef enum {
172 B8_OS_OK = 0,
173
174 ERRBEGIN = 1000,
175 #if 0
176 ERRPERM, // "Operation not permitted"
177 ERRIO, // "I/O error"
178 ERRAGAIN, // "Try again"
179 ERRNOMEM, // "Out of memory"
180 ERRACCES, // "Permission denied"
181 ERRINVAL, // "Invalid argument"
182 ERROVFLOW, // "The semaphore value exceeds SEM_VALUE_MAX"
183 ERRMPROC, // "Too many process"
184 ERRNOSPC, // "No space left on device"
185 ERRTIMEDOUT, // "Connection timed out"
186 ERRNOTSUP, // "Not supported"
187 ERRNOSYS, // "Function not implemented"
188 ERRENFILE, // "Too many open files in system"
189 ERRBADF, // "Bad file number"
190 ERREMLINK, // "Too many links"
191 ERRNOHEAP, // "Out of heap memory"
192 #endif
193
194 /* --- */
195 ERREND
196} b8OsSysErrNo;
197
198typedef struct _b8OsBridgeUsr2Svc{
199 u32 signature;
200 b8OsPid pid;
201 b8OsPid ret_pid;
202 b8OsSid ret_sid;
203 int ret_semcount;
204 u64 tv_sec;
205 u32 tv_nsec;
206 s32 errcode;
208extern b8OsBridgeUsr2Svc* b8OsGetBridge(void);
209
210typedef struct _sem_t sem_t;
211
212extern b8OsBridgeUsr2Svc* b8OsSysCall( b8OsSysCallNum syscall,u32 arg0,u32 arg1,u32 arg2,u32 arg3,u32 arg4,u32 arg5);
213typedef struct _b8OsConfig{
214 void* StackTop;
215 size_t StackSize;
216
217 b8OsCpuCycles CpuCyclesPerSec;
218
219 // 100Hz:10ms = 10*1000us = 10000
220 // 1000Hz: 1ms = 1*1000us = 1000
221 u32 UsecPerTick;
222
223 sem_t* sem_heap;
224
225 // driver
226 int (*ArchDriverGetTimerIrq)(u16* irq);
227 int (*ArchDriverOnStartTimer)(u32 hz);
228 int (*ArchDriverOnStartCycleCnt)(void);
229 void (*ArchDriverGetCycle)(u32* cyccnt );
230 void (*ArchDriverGetCycleAndClear)(u32* cyccnt );
231 void (*ArchDriverPicDistributor)(u8 enable );
232 void (*ArchDriverGetClockTime)( u64* clock );
233} b8OsConfig;
234extern int b8OsReset( b8OsConfig* cfg_ );
235extern int b8OsIsRunning(void);
236
237#ifdef __cplusplus
238}
239#endif
Definition os.h:198
Definition os.h:213
Definition semaphore.h:35