OpenCores
URL https://opencores.org/ocsvn/mlite/mlite/trunk

Subversion Repositories mlite

[/] [mlite/] [trunk/] [kernel/] [rtos_test.c] - Blame information for rev 312

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 138 rhoads
/*--------------------------------------------------------------------
2
 * TITLE: Test Plasma Real Time Operating System
3
 * AUTHOR: Steve Rhoads (rhoadss@yahoo.com)
4
 * DATE CREATED: 1/1/06
5
 * FILENAME: rtos_test.c
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
 *    Test Plasma Real Time Operating System
11
 *--------------------------------------------------------------------*/
12
#include "plasma.h"
13
#include "rtos.h"
14 226 rhoads
#include "tcpip.h"
15 138 rhoads
 
16 190 rhoads
/* Including mmu.h will cause all OS calls to use SYSCALL */
17
//#include "mmu.h"
18
 
19 312 rhoads
//#define DLL_SETUP
20
//#define DLL_CALL
21
//#include "dll.h"
22
 
23 190 rhoads
#define SEMAPHORE_COUNT 50
24
#define TIMER_COUNT     10
25
 
26 138 rhoads
extern void TestMathFull(void);
27
 
28 190 rhoads
typedef struct {
29
   OS_Thread_t *MyThread[TIMER_COUNT];
30
   OS_Semaphore_t *MySemaphore[SEMAPHORE_COUNT];
31
   OS_Mutex_t *MyMutex;
32
   OS_Timer_t *MyTimer[TIMER_COUNT];
33
   OS_MQueue_t *MyQueue[TIMER_COUNT];
34
   int TimerDone;
35
} TestInfo_t;
36
 
37
int Global;
38
 
39 138 rhoads
//******************************************************************
40
static void TestCLib(void)
41
{
42
   char s1[80], s2[80], *ptr;
43
   int rc, v1, v2, v3;
44
 
45
   printf("TestCLib\n");
46
   strcpy(s1, "Hello ");
47
   strncpy(s2, "World wide", 5);
48
   strcat(s1, s2);
49
   strncat(s1, "!\nthing", 14);
50
   printf("%s", s1);
51
   rc = strcmp(s1, "Hello World!\n");
52
   assert(rc == 0);
53
   rc = strcmp(s1, "Hello WOrld!\n");
54
   assert(rc > 0);
55
   rc = strcmp(s1, "Hello world!\n");
56
   assert(rc < 0);
57
   rc = strncmp(s1, "Hellx", 4);
58
   assert(rc == 0);
59
   ptr = strstr(s1, "orl");
60
   assert(ptr[0] = 'o');
61
   rc = strlen(s1);
62
   assert(rc == 13);
63
   memcpy(s2, s1, rc+1);
64
   rc = memcmp(s1, s2, 8);
65
   assert(rc == 0);
66
   s2[5] = 'z';
67
   rc = memcmp(s1, s2, 8);
68
   assert(rc != 0);
69
   memset(s2, 0, 5);
70
   memset(s2, 'a', 3);
71
   rc = abs(-5);
72 154 rhoads
   itoa(1234, s1, 10);
73
   itoa(0, s1, 10);
74
   itoa(-1234, s1, 10);
75
   itoa(0xabcd, s1, 16);
76
   itoa(0x12ab, s1, 16);
77
   sprintf(s1, "test c%c d%d 0x%x s%s End\n", 'C', 1234, 0xabcd, "String");
78 138 rhoads
   printf("%s", s1);
79 154 rhoads
   sprintf(s1, "test c%c d%6d 0x%6x s%8s End\n", 'C', 1234, 0xabcd, "String");
80 138 rhoads
   printf("%s", s1);
81
   sscanf("1234 -1234 0xabcd text h", "%d %d %x %s", &v1, &v2, &v3, s1);
82
   assert(v1 == 1234 && v2 == -1234 && v3 == 0xabcd);
83
   assert(strcmp(s1, "text") == 0);
84
   //UartScanf("%d %d", &v1, &v2);
85
   //printf("v1 = %d v2 = %d\n", v1, v2);
86
   printf("Done.\n");
87
}
88
 
89
//******************************************************************
90
static void TestHeap(void)
91
{
92
   uint8 *ptrs[256], size[256], *ptr;
93
   int i, j, k, value;
94
 
95
   printf("TestHeap\n");
96
   memset(ptrs, 0, sizeof(ptrs));
97
   for(i = 0; i < 1000; ++i)
98
   {
99
      j = rand() & 255;
100
      if(ptrs[j])
101
      {
102
         ptr = ptrs[j];
103
         value = size[j];
104
         for(k = 0; k < value; ++k)
105
         {
106
            if(ptr[k] != value)
107
               printf("Error\n");
108
         }
109
         OS_HeapFree(ptrs[j]);
110
      }
111
      size[j] = (uint8)(rand() & 255);
112
      ptrs[j] = OS_HeapMalloc(NULL, size[j]);
113 190 rhoads
      if(ptrs[j] == NULL)
114
         printf("malloc NULL\n");
115
      else
116
         memset(ptrs[j], size[j], size[j]);
117 138 rhoads
   }
118
   for(i = 0; i < 256; ++i)
119
   {
120
      if(ptrs[i])
121
         OS_HeapFree(ptrs[i]);
122
   }
123
   printf("Done.\n");
124
}
125
 
126
//******************************************************************
127 190 rhoads
static void MyThreadMain(void *arg)
128 138 rhoads
{
129
   OS_Thread_t *thread;
130
   int priority;
131
 
132
   thread = OS_ThreadSelf();
133
   priority = OS_ThreadPriorityGet(thread);
134
   OS_ThreadSleep(10);
135
   printf("Arg=%d thread=0x%x info=0x%x priority=%d\n",
136 255 rhoads
      (uint32)arg, thread, OS_ThreadInfoGet(thread, 0), priority);
137 190 rhoads
   OS_ThreadExit();
138 138 rhoads
}
139
 
140
static void TestThread(void)
141
{
142
   OS_Thread_t *thread;
143
   int i, priority;
144
 
145
   printf("TestThread\n");
146
   for(i = 0; i < 32; ++i)
147
   {
148
      priority = 50 + i;
149
      thread = OS_ThreadCreate("MyThread", MyThreadMain, (uint32*)i, priority, 0);
150 255 rhoads
      OS_ThreadInfoSet(thread, 0, (void*)(0xabcd + i));
151 138 rhoads
      //printf("Created thread 0x%x\n", thread);
152
   }
153
 
154
   thread = OS_ThreadSelf();
155
   priority = OS_ThreadPriorityGet(thread);
156
   printf("Priority = %d\n", priority);
157
   OS_ThreadPrioritySet(thread, 200);
158
   printf("Priority = %d\n", OS_ThreadPriorityGet(thread));
159
   OS_ThreadPrioritySet(thread, priority);
160
 
161
   printf("Thread time = %d\n", OS_ThreadTime());
162
   OS_ThreadSleep(100);
163
   printf("Thread time = %d\n", OS_ThreadTime());
164
}
165
 
166
//******************************************************************
167 190 rhoads
static void TestSemThread(void *arg)
168 138 rhoads
{
169
   int i;
170 190 rhoads
   TestInfo_t *info = (TestInfo_t*)arg;
171 138 rhoads
 
172 190 rhoads
   for(i = 0; i < SEMAPHORE_COUNT/2; ++i)
173 138 rhoads
   {
174
      printf("s");
175 190 rhoads
      OS_SemaphorePend(info->MySemaphore[i], OS_WAIT_FOREVER);
176
      OS_SemaphorePost(info->MySemaphore[i + SEMAPHORE_COUNT/2]);
177 138 rhoads
   }
178 190 rhoads
   OS_ThreadExit();
179 138 rhoads
}
180
 
181
static void TestSemaphore(void)
182
{
183
   int i, rc;
184 190 rhoads
   TestInfo_t info;
185 138 rhoads
   printf("TestSemaphore\n");
186 190 rhoads
   for(i = 0; i < SEMAPHORE_COUNT; ++i)
187 138 rhoads
   {
188 190 rhoads
      info.MySemaphore[i] = OS_SemaphoreCreate("MySem", 0);
189 138 rhoads
      //printf("sem[%d]=0x%x\n", i, MySemaphore[i]);
190
   }
191
 
192 190 rhoads
   OS_ThreadCreate("TestSem", TestSemThread, &info, 50, 0);
193 138 rhoads
 
194 190 rhoads
   for(i = 0; i < SEMAPHORE_COUNT/2; ++i)
195 138 rhoads
   {
196
      printf("S");
197 190 rhoads
      OS_SemaphorePost(info.MySemaphore[i]);
198
      rc = OS_SemaphorePend(info.MySemaphore[i + SEMAPHORE_COUNT/2], 500);
199 138 rhoads
      assert(rc == 0);
200
   }
201
 
202
   printf(":");
203 190 rhoads
   rc = OS_SemaphorePend(info.MySemaphore[0], 10);
204 138 rhoads
   assert(rc != 0);
205
   printf(":");
206 190 rhoads
   OS_SemaphorePend(info.MySemaphore[0], 100);
207 138 rhoads
   printf(":");
208
 
209 190 rhoads
   for(i = 0; i < SEMAPHORE_COUNT; ++i)
210
      OS_SemaphoreDelete(info.MySemaphore[i]);
211 138 rhoads
 
212
   printf("\nDone.\n");
213
}
214
 
215
//******************************************************************
216 190 rhoads
static void TestMutexThread(void *arg)
217 138 rhoads
{
218 190 rhoads
   TestInfo_t *info = (TestInfo_t*)arg;
219 138 rhoads
 
220
   printf("Waiting for mutex\n");
221 190 rhoads
   OS_MutexPend(info->MyMutex);
222 138 rhoads
   printf("Have Mutex1\n");
223 190 rhoads
   OS_MutexPend(info->MyMutex);
224 138 rhoads
   printf("Have Mutex2\n");
225 190 rhoads
   OS_MutexPend(info->MyMutex);
226 138 rhoads
   printf("Have Mutex3\n");
227
 
228
   OS_ThreadSleep(100);
229
 
230 190 rhoads
   OS_MutexPost(info->MyMutex);
231
   OS_MutexPost(info->MyMutex);
232
   OS_MutexPost(info->MyMutex);
233
 
234
   OS_ThreadExit();
235 138 rhoads
}
236
 
237
static void TestMutex(void)
238
{
239 190 rhoads
   TestInfo_t info;
240 138 rhoads
   printf("TestMutex\n");
241 190 rhoads
   info.MyMutex = OS_MutexCreate("MyMutex");
242
   OS_MutexPend(info.MyMutex);
243
   OS_MutexPend(info.MyMutex);
244
   OS_MutexPend(info.MyMutex);
245 138 rhoads
 
246 190 rhoads
   OS_ThreadSleep(100);
247 138 rhoads
 
248 190 rhoads
   OS_ThreadCreate("TestMutex", TestMutexThread, &info, 50, 0);
249
 
250 138 rhoads
   OS_ThreadSleep(50);
251 190 rhoads
   OS_MutexPost(info.MyMutex);
252
   OS_MutexPost(info.MyMutex);
253
   OS_MutexPost(info.MyMutex);
254 138 rhoads
 
255
   printf("Try get mutex\n");
256 190 rhoads
   OS_MutexPend(info.MyMutex);
257 138 rhoads
   printf("Gotit\n");
258
 
259 190 rhoads
   OS_MutexDelete(info.MyMutex);
260 138 rhoads
   printf("Done.\n");
261
}
262
 
263
//******************************************************************
264
static void TestMQueue(void)
265
{
266
   OS_MQueue_t *mqueue;
267
   char data[16];
268
   int i, rc;
269
 
270
   printf("TestMQueue\n");
271
   mqueue = OS_MQueueCreate("MyMQueue", 10, 16);
272
   strcpy(data, "Test0");
273
   for(i = 0; i < 16; ++i)
274
   {
275
      data[4] = (char)('0' + i);
276
      OS_MQueueSend(mqueue, data);
277
   }
278
   for(i = 0; i < 16; ++i)
279
   {
280
      memset(data, 0, sizeof(data));
281
      rc = OS_MQueueGet(mqueue, data, 20);
282
      if(rc == 0)
283
         printf("message=(%s)\n", data);
284
      else
285
         printf("timeout\n");
286
   }
287
 
288
   OS_MQueueDelete(mqueue);
289
   printf("Done.\n");
290
}
291
 
292
//******************************************************************
293 190 rhoads
static void TestTimerThread(void *arg)
294 138 rhoads
{
295 190 rhoads
   int index;
296 138 rhoads
   uint32 data[4];
297
   OS_Timer_t *timer;
298 190 rhoads
   TestInfo_t *info = (TestInfo_t*)arg;
299 138 rhoads
 
300 190 rhoads
   //printf("TestTimerThread\n");
301
 
302
   OS_ThreadSleep(1);
303 255 rhoads
   index = (int)OS_ThreadInfoGet(OS_ThreadSelf(), 0);
304 190 rhoads
   //printf("index=%d\n", index);
305
   OS_MQueueGet(info->MyQueue[index], data, 1000);
306 138 rhoads
   timer = (OS_Timer_t*)data[1];
307
   printf("%d ", data[2]);
308 190 rhoads
   OS_MQueueGet(info->MyQueue[index], data, 1000);
309 138 rhoads
   printf("%d ", data[2]);
310 190 rhoads
   ++info->TimerDone;
311
   OS_ThreadExit();
312 138 rhoads
}
313
 
314
static void TestTimer(void)
315
{
316
   int i;
317 190 rhoads
   TestInfo_t info;
318 138 rhoads
 
319
   printf("TestTimer\n");
320 190 rhoads
   info.TimerDone = 0;
321 138 rhoads
   for(i = 0; i < TIMER_COUNT; ++i)
322
   {
323 190 rhoads
      info.MyQueue[i] = OS_MQueueCreate("MyQueue", 10, 16);
324
      info.MyTimer[i] = OS_TimerCreate("MyTimer", info.MyQueue[i], i);
325
      info.MyThread[i] = OS_ThreadCreate("TimerTest", TestTimerThread, &info, 50, 0);
326 255 rhoads
      OS_ThreadInfoSet(info.MyThread[i], 0, (void*)i);
327 190 rhoads
      OS_TimerStart(info.MyTimer[i], 10+i*2, 220+i);
328 138 rhoads
   }
329
 
330 190 rhoads
   while(info.TimerDone < TIMER_COUNT)
331 138 rhoads
      OS_ThreadSleep(10);
332
 
333
   for(i = 0; i < TIMER_COUNT; ++i)
334
   {
335 190 rhoads
      OS_MQueueDelete(info.MyQueue[i]);
336
      OS_TimerDelete(info.MyTimer[i]);
337 138 rhoads
   }
338
 
339
   printf("Done.\n");
340
}
341
 
342
//******************************************************************
343
#if 1
344
void TestMath(void)
345
{
346
   int i;
347
   float a, b, sum, diff, mult, div;
348
   uint32 compare;
349
 
350
   //Check add subtract multiply and divide
351
   for(i = -4; i < 4; ++i)
352
   {
353
      a = (float)(i * 10 + (float)63.2);
354
      b = (float)(-i * 5 + (float)3.5);
355
      sum = a + b;
356
      diff = a - b;
357
      mult = a * b;
358
      div = a / b;
359
      printf("a=%dE-3 b=%dE-3 sum=%dE-3 diff=%dE-3 mult=%dE-3 div=%dE-3\n",
360
         (int)(a*(float)1000), (int)(b*(float)1000),
361
         (int)(sum*(float)1000), (int)(diff*(float)1000),
362
         (int)(mult*(float)1000), (int)(div*(float)1000));
363
   }
364
 
365
   //Comparisons
366
   b = (float)2.0;
367
   compare = 0;
368
   for(i = 1; i < 4; ++i)
369
   {
370
      a = (float)i;
371
      compare = (compare << 1) | (a == b);
372
      compare = (compare << 1) | (a != b);
373
      compare = (compare << 1) | (a <  b);
374
      compare = (compare << 1) | (a <= b);
375
      compare = (compare << 1) | (a >  b);
376
      compare = (compare << 1) | (a >= b);
377
   }
378
   printf("Compare = %8x %s\n", compare,
379
      compare==0x1c953 ? "OK" : "ERROR");
380
 
381
   //Cosine
382
   for(a = (float)0.0; a <= (float)(3.1415); a += (float)(3.1415/16.0))
383
   {
384
      b = FP_Cos(a);
385
      printf("cos(%4dE-3) = %4dE-3\n",
386
         (int)(a*(float)1000.0), (int)(b*(float)1000.0));
387
   }
388
}
389
#endif
390
 
391 194 rhoads
//******************************************************************
392
#ifndef WIN32
393
static void MySyscall(void *arg)
394
{
395
   uint32 *stack = arg;
396
   stack[STACK_EPC] += 4;  //skip over SYSCALL
397
   printf("Inside MySyscall %d\n", stack[28/4]);
398
}
399
 
400
void TestSyscall(void)
401
{
402
   OS_InterruptRegister((uint32)(1<<31), MySyscall);
403
   OS_Syscall(57);
404
   OS_ThreadSleep(1);
405
   printf("Done\n");
406
}
407
#endif
408
 
409 190 rhoads
#ifdef __MMU_ENUM_H__
410
void TestProcess(void)
411
{
412
   OS_Process_t *process;
413
   process = (OS_Process_t*)OS_HeapMalloc(NULL, sizeof(OS_Process_t));
414
   process->name = "test";
415
   process->funcPtr = MainThread;
416
   process->arg = NULL;
417
   process->priority = 200;
418
   process->stackSize = 1024*32;
419
   process->heapSize = 1024*128;
420
   process->processId = 1;
421
   process->semaphoreDone = OS_SemaphoreCreate("processDone", 0);
422
   printf("Creating process\n");
423
   OS_MMUProcessCreate(process);
424
   OS_SemaphorePend(process->semaphoreDone, OS_WAIT_FOREVER);
425
   printf("Process done\n");
426
   OS_MMUProcessDelete(process);
427
}
428
#endif
429 138 rhoads
 
430 190 rhoads
 
431 138 rhoads
//******************************************************************
432 190 rhoads
void MMUTest(void);
433 221 rhoads
void HtmlThread(void *arg);
434
void ConsoleInit(void);
435 255 rhoads
void exit(int);
436 298 rhoads
static uint8 macAddress[] =  {0x00, 0x10, 0xdd, 0xce, 0x15, 0xd4};
437 221 rhoads
 
438 298 rhoads
 
439 138 rhoads
void MainThread(void *Arg)
440
{
441 283 rhoads
   int ch, i, display=1;
442 138 rhoads
   (void)Arg;
443 190 rhoads
#ifdef __MMU_ENUM_H__
444
   OS_MMUInit();
445
#endif
446 138 rhoads
 
447 298 rhoads
#ifdef INCLUDE_ETH
448
   EthernetInit(macAddress);
449
   IPInit(EthernetTransmit, macAddress, "plasma");
450
   HtmlInit(1);
451
#endif
452
 
453 221 rhoads
#ifdef INCLUDE_HTML
454 298 rhoads
   IPInit(NULL, macAddress, "plasma");
455 235 rhoads
   HtmlInit(1);
456 221 rhoads
#endif
457
 
458
#ifdef INCLUDE_CONSOLE
459
   ConsoleInit();
460
#endif
461
 
462 138 rhoads
   for(;;)
463
   {
464 283 rhoads
      if(display)
465
      {
466
         printf("\n");
467
         printf("1 CLib\n");
468
         printf("2 Heap\n");
469
         printf("3 Thread\n");
470
         printf("4 Semaphore\n");
471
         printf("5 Mutex\n");
472
         printf("6 MQueue\n");
473
         printf("7 Timer\n");
474
         printf("8 Math\n");
475
         printf("9 Syscall\n");
476 190 rhoads
#ifdef __MMU_ENUM_H__
477 283 rhoads
         printf("p MMU Process\n");
478 190 rhoads
#endif
479 283 rhoads
      }
480 138 rhoads
      printf("> ");
481 283 rhoads
      display = 1;
482 138 rhoads
      ch = UartRead();
483
      printf("%c\n", ch);
484
      switch(ch)
485
      {
486 255 rhoads
#ifdef WIN32
487
      case '0': exit(0);
488
#endif
489 138 rhoads
      case '1': TestCLib(); break;
490
      case '2': TestHeap(); break;
491
      case '3': TestThread(); break;
492
      case '4': TestSemaphore(); break;
493
      case '5': TestMutex(); break;
494
      case '6': TestMQueue(); break;
495
      case '7': TestTimer(); break;
496
      case '8': TestMath(); break;
497 190 rhoads
#ifndef WIN32
498 194 rhoads
      case '9': TestSyscall(); break;
499 190 rhoads
#endif
500
#ifdef __MMU_ENUM_H__
501
      case 'p': TestProcess(); break;
502
#endif
503 138 rhoads
#ifdef WIN32
504
      case 'm': TestMathFull(); break;
505
#endif
506 190 rhoads
      case 'g': printf("Global=%d\n", ++Global); break;
507 235 rhoads
      default:
508 283 rhoads
         printf("E");
509
         display = 0;
510 235 rhoads
         for(i = 0; i < 30; ++i)
511
         {
512 275 rhoads
            while(kbhit())
513 235 rhoads
               ch = UartRead();
514 275 rhoads
            OS_ThreadSleep(1);
515 235 rhoads
         }
516
         break;
517 138 rhoads
      }
518
   }
519
}
520
 
521
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.