Root/plasma/kernel/rtos.h

1/*--------------------------------------------------------------------
2 * TITLE: Plasma Real Time Operating System
3 * AUTHOR: Steve Rhoads (rhoadss@yahoo.com)
4 * DATE CREATED: 12/17/05
5 * FILENAME: rtos.h
6 * PROJECT: Plasma CPU core
7 * COPYRIGHT: Software placed into the public domain by the author.
8 * Software 'as is' without warranty. Author liable for nothing.
9 * DESCRIPTION:
10 * Plasma Real Time Operating System
11 *--------------------------------------------------------------------*/
12#ifndef __RTOS_H__
13#define __RTOS_H__
14
15// Symmetric Multi-Processing
16#define OS_CPU_COUNT 1
17
18// Typedefs
19typedef unsigned int uint32;
20typedef unsigned short uint16;
21typedef unsigned char uint8;
22
23// Memory Access
24#ifdef WIN32
25   uint32 MemoryRead(uint32 Address);
26   void MemoryWrite(uint32 Address, uint32 Value);
27#else
28   #define MemoryRead(A) (*(volatile uint32*)(A))
29   #define MemoryWrite(A,V) *(volatile uint32*)(A)=(V)
30#endif
31
32/***************** LibC ******************/
33#if !defined(_LIBC) && !defined(_CTYPE_DEFINED)
34#define printf UartPrintf
35//#define printf UartPrintfPoll
36#define scanf UartScanf
37#ifndef WIN32
38   #define malloc(S) OS_HeapMalloc(NULL, S)
39   #define free(S) OS_HeapFree(S)
40#endif
41
42#ifndef NULL
43#define NULL (void*)0
44#endif
45
46#define assert(A) if((A)==0){OS_Assert();UartPrintfCritical("\r\nAssert %s:%d\r\n", __FILE__, __LINE__);}
47
48#define isprint(c) (' '<=(c)&&(c)<='~')
49#define isspace(c) ((c)==' '||(c)=='\t'||(c)=='\n'||(c)=='\r')
50#define isdigit(c) ('0'<=(c)&&(c)<='9')
51#define islower(c) ('a'<=(c)&&(c)<='z')
52#define isupper(c) ('A'<=(c)&&(c)<='Z')
53#define isalpha(c) (islower(c)||isupper(c))
54#define isalnum(c) (isalpha(c)||isdigit(c))
55#undef min
56#define min(a,b) ((a)<(b)?(a):(b))
57#define strcpy strcpy2 //don't use intrinsic functions
58#define strcat strcat2
59#define strncat strncat2
60#define strcmp strcmp2
61#define strlen strlen2
62#define memcpy memcpy2
63#define memcmp memcmp2
64#define memset memset2
65#define abs abs2
66#define atoi atoi2
67
68char *strcpy(char *dst, const char *src);
69char *strncpy(char *dst, const char *src, int count);
70char *strcat(char *dst, const char *src);
71char *strncat(char *dst, const char *src, int count);
72int strcmp(const char *string1, const char *string2);
73int strncmp(const char *string1, const char *string2, int count);
74char *strstr(const char *string, const char *find);
75int strlen(const char *string);
76void *memcpy(void *dst, const void *src, unsigned long bytes);
77void *memmove(void *dst, const void *src, unsigned long bytes);
78int memcmp(const void *cs, const void *ct, unsigned long bytes);
79void *memset(void *dst, int c, unsigned long bytes);
80int abs(int n);
81int rand(void);
82void srand(unsigned int seed);
83long strtol(const char *s, char **end, int base);
84int atoi(const char *s);
85char *itoa(int num, char *dst, int base);
86#ifndef NO_ELLIPSIS
87   int sprintf(char *s, const char *format, ...);
88   int sscanf(const char *s, const char *format, ...);
89#endif
90#ifdef INCLUDE_DUMP
91   void dump(const unsigned char *data, int length);
92#endif
93#ifdef INCLUDE_QSORT
94   void qsort(void *base,
95              long n,
96              long size,
97              int (*cmp)(const void *,const void *));
98   void *bsearch(const void *key,
99                 const void *base,
100                 long n,
101                 long size,
102                 int (*cmp)(const void *,const void *));
103#endif
104#ifdef INCLUDE_TIMELIB
105   #define difftime(time2,time1) (time2-time1)
106   typedef unsigned long time_t; //start at 1/1/80
107   struct tm {
108      int tm_sec; //(0,59)
109      int tm_min; //(0,59)
110      int tm_hour; //(0,23)
111      int tm_mday; //(1,31)
112      int tm_mon; //(0,11)
113      int tm_year; //(0,n) from 1900
114      int tm_wday; //(0,6) calculated
115      int tm_yday; //(0,365) calculated
116      int tm_isdst; // calculated
117   };
118   time_t mktime(struct tm *tp);
119   void gmtime_r(const time_t *tp, struct tm *out);
120   void gmtimeDst(time_t dstTimeIn, time_t dstTimeOut);
121   void gmtimeDstSet(time_t *tp, time_t *dstTimeIn, time_t *dstTimeOut);
122#endif
123#define _LIBC
124#endif //_LIBC
125
126/***************** Assembly **************/
127typedef uint32 jmp_buf[20];
128extern uint32 OS_AsmInterruptEnable(uint32 state);
129extern void OS_AsmInterruptInit(void);
130extern int setjmp(jmp_buf env);
131extern void longjmp(jmp_buf env, int val);
132extern uint32 OS_AsmMult(uint32 a, uint32 b, unsigned long *hi);
133extern void *OS_Syscall();
134
135/***************** Heap ******************/
136#define HEAP_USER (void*)0
137#define HEAP_SYSTEM (void*)1
138#define HEAP_SMALL (void*)2
139#define HEAP_UI (void*)3
140typedef struct OS_Heap_s OS_Heap_t;
141OS_Heap_t *OS_HeapCreate(const char *name, void *memory, uint32 size);
142void OS_HeapDestroy(OS_Heap_t *heap);
143void *OS_HeapMalloc(OS_Heap_t *heap, int bytes);
144void OS_HeapFree(void *block);
145void OS_HeapAlternate(OS_Heap_t *heap, OS_Heap_t *alternate);
146void OS_HeapRegister(void *index, OS_Heap_t *heap);
147
148/***************** Critical Sections *****************/
149#if OS_CPU_COUNT <= 1
150   // Single CPU
151   #define OS_CpuIndex() 0
152   #define OS_CriticalBegin() OS_AsmInterruptEnable(0)
153   #define OS_CriticalEnd(S) OS_AsmInterruptEnable(S)
154   #define OS_SpinLock() 0
155   #define OS_SpinUnlock(S)
156#else
157   // Symmetric multiprocessing
158   uint32 OS_CpuIndex(void);
159   #define OS_CriticalBegin() OS_SpinLock()
160   #define OS_CriticalEnd(S) OS_SpinUnlock(S)
161   uint32 OS_SpinLock(void);
162   void OS_SpinUnlock(uint32 state);
163#endif
164
165/***************** Thread *****************/
166#ifdef WIN32
167   #define STACK_SIZE_MINIMUM (1024*4)
168#else
169   #define STACK_SIZE_MINIMUM (1024*1)
170#endif
171#define STACK_SIZE_DEFAULT 1024*2
172#undef THREAD_PRIORITY_IDLE
173#define THREAD_PRIORITY_IDLE 0
174#define THREAD_PRIORITY_MAX 255
175
176typedef void (*OS_FuncPtr_t)(void *arg);
177typedef struct OS_Thread_s OS_Thread_t;
178OS_Thread_t *OS_ThreadCreate(const char *name,
179                             OS_FuncPtr_t funcPtr,
180                             void *arg,
181                             uint32 priority,
182                             uint32 stackSize);
183void OS_ThreadExit(void);
184OS_Thread_t *OS_ThreadSelf(void);
185void OS_ThreadSleep(int ticks);
186uint32 OS_ThreadTime(void);
187void OS_ThreadInfoSet(OS_Thread_t *thread, uint32 index, void *info);
188void *OS_ThreadInfoGet(OS_Thread_t *thread, uint32 index);
189uint32 OS_ThreadPriorityGet(OS_Thread_t *thread);
190void OS_ThreadPrioritySet(OS_Thread_t *thread, uint32 priority);
191void OS_ThreadProcessId(OS_Thread_t *thread, uint32 processId, OS_Heap_t *heap);
192void OS_ThreadTick(void *arg);
193void OS_ThreadCpuLock(OS_Thread_t *thread, int cpuIndex);
194
195/***************** Semaphore **************/
196#define OS_SUCCESS 0
197#define OS_ERROR -1
198#define OS_WAIT_FOREVER -1
199#define OS_NO_WAIT 0
200typedef struct OS_Semaphore_s OS_Semaphore_t;
201OS_Semaphore_t *OS_SemaphoreCreate(const char *name, uint32 count);
202void OS_SemaphoreDelete(OS_Semaphore_t *semaphore);
203int OS_SemaphorePend(OS_Semaphore_t *semaphore, int ticks); //tick ~= 10ms
204void OS_SemaphorePost(OS_Semaphore_t *semaphore);
205
206/***************** Mutex ******************/
207typedef struct OS_Mutex_s OS_Mutex_t;
208OS_Mutex_t *OS_MutexCreate(const char *name);
209void OS_MutexDelete(OS_Mutex_t *semaphore);
210void OS_MutexPend(OS_Mutex_t *semaphore);
211void OS_MutexPost(OS_Mutex_t *semaphore);
212
213/***************** MQueue *****************/
214enum {
215   MESSAGE_TYPE_USER = 0,
216   MESSAGE_TYPE_TIMER = 5
217};
218typedef struct OS_MQueue_s OS_MQueue_t;
219OS_MQueue_t *OS_MQueueCreate(const char *name,
220                             int messageCount,
221                             int messageBytes);
222void OS_MQueueDelete(OS_MQueue_t *mQueue);
223int OS_MQueueSend(OS_MQueue_t *mQueue, void *message);
224int OS_MQueueGet(OS_MQueue_t *mQueue, void *message, int ticks);
225
226/***************** Job ********************/
227void OS_Job(void (*funcPtr)(), void *arg0, void *arg1, void *arg2);
228
229/***************** Timer ******************/
230typedef struct OS_Timer_s OS_Timer_t;
231typedef void (*OS_TimerFuncPtr_t)(OS_Timer_t *timer, uint32 info);
232OS_Timer_t *OS_TimerCreate(const char *name, OS_MQueue_t *mQueue, uint32 info);
233void OS_TimerDelete(OS_Timer_t *timer);
234void OS_TimerCallback(OS_Timer_t *timer, OS_TimerFuncPtr_t callback);
235void OS_TimerStart(OS_Timer_t *timer, uint32 ticks, uint32 ticksRestart);
236void OS_TimerStop(OS_Timer_t *timer);
237
238/***************** ISR ********************/
239#define STACK_EPC 88/4
240void OS_InterruptServiceRoutine(uint32 status, uint32 *stack);
241void OS_InterruptRegister(uint32 mask, OS_FuncPtr_t funcPtr);
242uint32 OS_InterruptStatus(void);
243uint32 OS_InterruptMaskSet(uint32 mask);
244uint32 OS_InterruptMaskClear(uint32 mask);
245
246/***************** Init ******************/
247void OS_Init(uint32 *heapStorage, uint32 bytes);
248void OS_Start(void);
249void OS_Assert(void);
250void OS_DebuggerInit(void);
251void MainThread(void *Arg);
252
253/***************** MMU ******************/
254typedef struct {
255   const char *name;
256   OS_FuncPtr_t funcPtr;
257   void *arg;
258   uint32 priority;
259   uint32 stackSize;
260   uint32 heapSize;
261   uint32 processId;
262   OS_Semaphore_t *semaphoreDone;
263   uint8 *memory; //private
264   OS_Heap_t *heap; //private
265   OS_Thread_t *thread; //private
266} OS_Process_t;
267void OS_MMUInit(void);
268void OS_MMUMemoryRegister(uint32 processId,
269                          uint32 virtualAddress,
270                          uint32 physicalAddress,
271                          uint32 size,
272                          uint32 writable);
273OS_Process_t *OS_MMUProcessCreate(OS_Process_t *process);
274void OS_MMUProcessDelete(OS_Process_t *process);
275void OS_MMUUartPrintf();
276void OS_MMUUartScanf();
277void OS_MMUUartPrintfCritical();
278
279/***************** UART ******************/
280typedef uint8* (*PacketGetFunc_t)(void);
281void UartInit(void);
282void UartWrite(int ch);
283uint8 UartRead(void);
284void UartWriteData(uint8 *data, int length);
285void UartReadData(uint8 *data, int length);
286#ifndef NO_ELLIPSIS2
287void UartPrintf(const char *format, ...);
288void UartPrintfPoll(const char *format, ...);
289void UartPrintfCritical(const char *format, ...);
290void UartPrintfNull(const char *format, ...);
291void UartScanf(const char *format, ...);
292#endif
293void UartPacketConfig(PacketGetFunc_t packetGetFunc,
294                      int packetSize,
295                      OS_MQueue_t *mQueue);
296void UartPacketSend(uint8 *data, int bytes);
297#ifdef WIN32
298#define puts puts2
299#define getch getch2
300#define kbhit kbhit2
301#endif
302int puts(const char *string);
303int getch(void);
304int kbhit(void);
305void LogWrite(int a);
306void LogDump(void);
307void Led(int mask, int value);
308
309/***************** Keyboard **************/
310#define KEYBOARD_RAW 0x100
311#define KEYBOARD_E0 0x200
312#define KEYBOARD_RELEASE 0x400
313void KeyboardInit(void);
314int KeyboardGetch(void);
315
316/***************** Math ******************/
317//IEEE single precision floating point math
318#ifndef WIN32
319#define FP_Neg __negsf2
320#define FP_Add __addsf3
321#define FP_Sub __subsf3
322#define FP_Mult __mulsf3
323#define FP_Div __divsf3
324#define FP_ToLong __fixsfsi
325#define FP_ToFloat __floatsisf
326#define sqrt FP_Sqrt
327#define cos FP_Cos
328#define sin FP_Sin
329#define atan FP_Atan
330#define log FP_Log
331#define exp FP_Exp
332#endif
333float FP_Neg(float a_fp);
334float FP_Add(float a_fp, float b_fp);
335float FP_Sub(float a_fp, float b_fp);
336float FP_Mult(float a_fp, float b_fp);
337float FP_Div(float a_fp, float b_fp);
338long FP_ToLong(float a_fp);
339float FP_ToFloat(long af);
340int FP_Cmp(float a_fp, float b_fp);
341float FP_Sqrt(float a);
342float FP_Cos(float rad);
343float FP_Sin(float rad);
344float FP_Atan(float x);
345float FP_Atan2(float y, float x);
346float FP_Exp(float x);
347float FP_Log(float x);
348float FP_Pow(float x, float y);
349
350/***************** Filesys ******************/
351#ifdef INCLUDE_FILESYS
352#define FILE OS_FILE
353#define fopen OS_fopen
354#define fclose OS_fclose
355#define fread OS_fread
356#define fwrite OS_fwrite
357#define fseek OS_fseek
358#endif
359#define _FILESYS_
360typedef struct OS_FILE_s OS_FILE;
361OS_FILE *OS_fopen(char *name, char *mode);
362void OS_fclose(OS_FILE *file);
363int OS_fread(void *buffer, int size, int count, OS_FILE *file);
364int OS_fwrite(void *buffer, int size, int count, OS_FILE *file);
365int OS_fseek(OS_FILE *file, int offset, int mode);
366int OS_fmkdir(char *name);
367int OS_fdir(OS_FILE *dir, char name[64]);
368void OS_fdelete(char *name);
369int OS_flength(char *entry);
370
371/***************** Flash ******************/
372void FlashRead(uint16 *dst, uint32 byteOffset, int bytes);
373void FlashWrite(uint16 *src, uint32 byteOffset, int bytes);
374void FlashErase(uint32 byteOffset);
375
376#endif //__RTOS_H__
377
378

Archive Download this file

Branches:
master



interactive