00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #define ESOS_USE_IRQS
00031
00032
00033
00034 #include "esos.h"
00035 #ifdef __linux
00036 #include "esos_pc.h"
00037 #include "esos_pc_stdio.h"
00038 #else
00039 #include "esos_pic24.h"
00040 #include "esos_pic24_rs232.h"
00041 #endif
00042
00043
00044 #include <stdio.h>
00045 #include <sys/select.h>
00046 #include <termios.h>
00047 #include <unistd.h>
00048
00049
00050
00051
00052
00053
00054
00055 void reverseString(char *psz_s1, char *psz_s2);
00056 uint32 randomNumInRange(uint32 u32_lo, uint32 u32_hi);
00057
00058
00059
00060 static uint8 psz_CRNL[3]= {0x0D, 0x0A, 0};
00061
00062
00063
00064 uint32 u32_myT1Count = 0;
00065 uint8 LED1 = TRUE;
00066 uint8 LED2 = TRUE;
00067
00068 ESOS_SEMAPHORE(sem_BCanRun);
00069 ESOS_SEMAPHORE(sem_CCanRun);
00070 ESOS_SEMAPHORE(sem_mutex);
00071
00072 struct stTask* pst_MyTasks[3];
00073
00074
00075
00076
00077
00078
00079
00080
00081 ESOS_USER_TASK( __simulated_isr ) {
00082 ESOS_TASK_BEGIN();
00083 while (TRUE) {
00084
00085 __esos_tmrSvcsExecute();
00086 ESOS_TASK_WAIT_TICKS( 1 );
00087
00088 }
00089 ESOS_TASK_END();
00090 }
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105 uint32 randomNumInRange(uint32 u32_lo, uint32 u32_hi) {
00106 uint32 u32_d1, u32_d2, u32_d4, u32_ret;
00107 UINT32 U32_temp;
00108
00109 while (TRUE) {
00110 u32_d4 = esos_GetRandomUint32();
00111 u32_ret = u32_lo + u32_d4;
00112 if (u32_ret <= u32_hi) return u32_ret;
00113
00114 U32_temp._uint32 = u32_d4;
00115 u32_d2 = U32_temp.u16LoWord ^ U32_temp.u16HiWord;
00116 u32_ret = u32_lo + u32_d2;
00117 if (u32_ret <= u32_hi) return u32_ret;
00118
00119 u32_d1 = U32_temp.u8LoLsb ^ U32_temp.u8LoMsb ^ U32_temp.u8HiLsb ^ U32_temp.u8HiMsb;
00120 u32_ret = u32_lo + u32_d1;
00121 if (u32_ret <= u32_hi) return u32_ret;
00122 }
00123 }
00124
00125
00126
00127 ESOS_USER_TIMER( swTimerCounter ) {
00128 u32_myT1Count++;
00129 }
00130
00131
00132 ESOS_USER_TIMER( swTimerLED ) {
00133 LED2 = !LED2;
00134 printf("\a");
00135 fflush(stdout);
00136 }
00137
00138
00139 ESOS_USER_TIMER( swTimerPrintA ) {
00140 static uint32 u32_cnt;
00141
00142 printf("A:%d\n", u32_cnt++);
00143 fflush(stdout);
00144 }
00145
00146 ESOS_USER_TIMER( swTimerPrintB ) {
00147 static uint32 u32_cnt;
00148
00149 printf("B:%d\n", u32_cnt++);
00150 fflush(stdout);
00151 }
00152
00153 ESOS_USER_TIMER( swTimerPrintC ) {
00154 static uint32 u32_cnt;
00155
00156 printf("C:%d\n", u32_cnt++);
00157 fflush(stdout);
00158 }
00159
00160
00161
00162
00163
00164
00165
00166
00167 ESOS_USER_TASK( task1 ) {
00168 uint32 u32_rnd;
00169
00170 ESOS_TASK_BEGIN();
00171 while (TRUE) {
00172 u32_rnd = 1+(0x0F & esos_GetRandomUint32());
00173 u32_rnd <<= 8;
00174 printf("T1 (%d)\n", u32_rnd);
00175 ESOS_TASK_WAIT_TICKS( u32_rnd);
00176 }
00177 ESOS_TASK_END();
00178 }
00179
00180 ESOS_USER_TASK( task2 ) {
00181 uint32 u32_rnd;
00182
00183 ESOS_TASK_BEGIN();
00184 while (TRUE) {
00185 u32_rnd = 1+(0x0F & esos_GetRandomUint32());
00186 u32_rnd <<= 9;
00187 printf("T2 (%d)\n", u32_rnd);
00188 ESOS_TASK_WAIT_TICKS( u32_rnd);
00189 }
00190 ESOS_TASK_END();
00191 }
00192
00193 ESOS_USER_TASK( task3 ) {
00194 uint32 u32_rnd;
00195
00196 ESOS_TASK_BEGIN();
00197 while (TRUE) {
00198 u32_rnd = 1+(0x0F & esos_GetRandomUint32());
00199 u32_rnd <<= 10;
00200 printf("T3 (%d)\n", u32_rnd);
00201 ESOS_TASK_WAIT_TICKS( u32_rnd);
00202 }
00203 ESOS_TASK_END();
00204 }
00205
00206
00207
00208
00209
00210
00211
00212
00213 ESOS_USER_TASK( taskSemA ) {
00214 uint32 u32_rnd;
00215 static u8_cnt;
00216
00217 ESOS_TASK_BEGIN();
00218 u8_cnt = 0;
00219 while (TRUE) {
00220 u8_cnt++;
00221 if (u8_cnt == 10) {
00222 ESOS_SIGNAL_SEMAPHORE( sem_BCanRun, 1 );
00223 }
00224 if (u8_cnt == 20) {
00225 ESOS_SIGNAL_SEMAPHORE( sem_CCanRun, 1 );
00226 }
00227 u32_rnd = 1+(0x0F & esos_GetRandomUint32());
00228 u32_rnd <<= 7;
00229 printf("taskSemA %d (%d)\n", u8_cnt, u32_rnd);
00230 ESOS_TASK_WAIT_TICKS( u32_rnd);
00231 }
00232 ESOS_TASK_END();
00233 }
00234
00235 ESOS_USER_TASK( taskSemB ) {
00236 uint32 u32_rnd;
00237 static u8_cnt;
00238
00239 ESOS_TASK_BEGIN();
00240 u8_cnt = 0;
00241 ESOS_TASK_WAIT_SEMAPHORE( sem_BCanRun, 1 );
00242 while (TRUE) {
00243 u8_cnt++;
00244 u32_rnd = 1+(0x0F & esos_GetRandomUint32());
00245 u32_rnd <<= 8;
00246 printf("taskSemB %d (%d)\n", u8_cnt, u32_rnd);
00247 ESOS_TASK_WAIT_TICKS( u32_rnd);
00248 }
00249 ESOS_TASK_END();
00250 }
00251
00252 ESOS_USER_TASK( taskSemC ) {
00253 uint32 u32_rnd;
00254 static u8_cnt;
00255
00256 ESOS_TASK_BEGIN();
00257 u8_cnt = 0;
00258 ESOS_TASK_WAIT_SEMAPHORE( sem_CCanRun, 1 );
00259 while (TRUE) {
00260 u8_cnt++;
00261 u32_rnd = 1+(0x0F & esos_GetRandomUint32());
00262 u32_rnd <<= 8;
00263 printf("taskSemC %d (%d)\n", u8_cnt, u32_rnd);
00264 ESOS_TASK_WAIT_TICKS( u32_rnd);
00265 }
00266 ESOS_TASK_END();
00267 }
00268
00269
00270 ESOS_USER_TASK( taskMutexA ) {
00271 uint32 u32_rnd;
00272 static u8_cnt;
00273
00274 ESOS_TASK_BEGIN();
00275 u8_cnt = 0;
00276 while (TRUE) {
00277 ESOS_TASK_WAIT_SEMAPHORE( sem_mutex, 1);
00278 u8_cnt++;
00279 u32_rnd = 1+(0x0F & esos_GetRandomUint32());
00280 u32_rnd <<= 8;
00281 printf("taskMutexA %d (%d)\n", u8_cnt, u32_rnd);
00282 ESOS_SIGNAL_SEMAPHORE( sem_mutex, 1);
00283 ESOS_TASK_WAIT_TICKS( u32_rnd);
00284 }
00285 ESOS_TASK_END();
00286 }
00287
00288
00289 ESOS_USER_TASK( taskMutexB ) {
00290 uint32 u32_rnd;
00291 static u8_cnt;
00292
00293 ESOS_TASK_BEGIN();
00294 u8_cnt = 0;
00295 while (TRUE) {
00296 ESOS_TASK_WAIT_SEMAPHORE( sem_mutex, 1);
00297 u8_cnt++;
00298 u32_rnd = 1+(0x0F & esos_GetRandomUint32());
00299 u32_rnd <<= 8;
00300 printf("taskMutexB %d (%d)\n", u8_cnt, u32_rnd);
00301 ESOS_SIGNAL_SEMAPHORE( sem_mutex, 1);
00302 ESOS_TASK_WAIT_TICKS( u32_rnd );
00303 }
00304 ESOS_TASK_END();
00305 }
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317 ESOS_USER_TASK( task_LED ) {
00318 ESOS_TASK_BEGIN();
00319 while (TRUE) {
00320 LED2 = !LED2;
00321 ESOS_TASK_WAIT_TICKS( 1000);
00322 printf("\a");
00323 fflush(stdout);
00324 }
00325 ESOS_TASK_END();
00326 }
00327
00328
00329
00330
00331
00332
00333
00334
00335 ESOS_USER_TASK( query_swTmrCnt ) {
00336 static uint8 u8_char;
00337
00338 ESOS_TASK_BEGIN();
00339 while (TRUE) {
00340 ESOS_TASK_WAIT_ON_AVAILABLE_IN_COMM();
00341 ESOS_TASK_SIGNAL_BUSY_IN_COMM();
00342 ESOS_TASK_WAIT_ON_GET_UINT8( u8_char );
00343 ESOS_TASK_RELEASE_IN_COMM();
00344 if (u8_char == ' ') {
00345 ESOS_TASK_WAIT_ON_AVAILABLE_OUT_COMM();
00346 ESOS_TASK_SIGNAL_BUSY_OUT_COMM();
00347 ESOS_TASK_WAIT_ON_SEND_UINT32_AS_HEX_STRING( u32_myT1Count );
00348 ESOS_TASK_WAIT_ON_SEND_UINT8( '\n' );
00349 ESOS_TASK_RELEASE_OUT_COMM();
00350 }
00351 }
00352 ESOS_TASK_END();
00353 }
00354
00355
00356
00357
00358
00359 ESOS_USER_TASK( upper_case ) {
00360 static uint8 u8_char;
00361
00362 ESOS_TASK_BEGIN();
00363 while (TRUE) {
00364 ESOS_TASK_WAIT_ON_AVAILABLE_IN_COMM();
00365 ESOS_TASK_SIGNAL_BUSY_IN_COMM();
00366 ESOS_TASK_WAIT_ON_GET_UINT8( u8_char );
00367 ESOS_TASK_RELEASE_IN_COMM();
00368 if ((u8_char >= 'a') && (u8_char <= 'z') )
00369 u8_char = u8_char - 'a' + 'A';
00370 ESOS_TASK_WAIT_ON_AVAILABLE_OUT_COMM();
00371 ESOS_TASK_SIGNAL_BUSY_OUT_COMM();
00372 ESOS_TASK_WAIT_ON_SEND_UINT8( u8_char);
00373 ESOS_TASK_RELEASE_OUT_COMM();
00374 }
00375 ESOS_TASK_END();
00376 }
00377
00378
00379
00380
00381
00382
00383
00384 ESOS_USER_TASK( upper_case2 ) {
00385 static uint8 u8_i;
00386 static uint8 au8_x[257];
00387 static uint8 au8_y[257];
00388
00389 ESOS_TASK_BEGIN();
00390 while (TRUE) {
00391 ESOS_TASK_WAIT_ON_AVAILABLE_IN_COMM();
00392 ESOS_TASK_SIGNAL_BUSY_IN_COMM();
00393 ESOS_TASK_WAIT_ON_GET_STRING( au8_x );
00394 ESOS_TASK_RELEASE_IN_COMM();
00395 u8_i = 0;
00396 while (TRUE) {
00397 if ((au8_x[u8_i] >= 'a') && (au8_x[u8_i] <= 'z') )
00398 au8_y[u8_i] = au8_x[u8_i] - 'a' + 'A';
00399 else
00400 au8_y[u8_i] = au8_x[u8_i];
00401 if (au8_x[u8_i] == 0) break;
00402 u8_i++;
00403 }
00404 ESOS_TASK_WAIT_ON_AVAILABLE_OUT_COMM();
00405 ESOS_TASK_SIGNAL_BUSY_OUT_COMM();
00406 ESOS_TASK_WAIT_ON_SEND_STRING( au8_y );
00407 ESOS_TASK_RELEASE_OUT_COMM();
00408 }
00409 ESOS_TASK_END();
00410 }
00411
00412
00413
00414
00415 ESOS_USER_TASK( reverse_string ) {
00416 static uint8 u8_char;
00417 static char sz_in[257];
00418 static char sz_out[257];
00419
00420 ESOS_TASK_BEGIN();
00421 while (TRUE) {
00422 ESOS_TASK_WAIT_ON_AVAILABLE_IN_COMM();
00423 ESOS_TASK_SIGNAL_BUSY_IN_COMM();
00424 ESOS_TASK_WAIT_ON_GET_STRING( sz_in );
00425 ESOS_TASK_RELEASE_IN_COMM();
00426 reverseString( sz_in, sz_out );
00427 ESOS_TASK_WAIT_ON_AVAILABLE_OUT_COMM();
00428 ESOS_TASK_SIGNAL_BUSY_OUT_COMM();
00429 ESOS_TASK_WAIT_ON_SEND_STRING( sz_out );
00430 ESOS_TASK_WAIT_ON_SEND_UINT8('\n');
00431 ESOS_TASK_RELEASE_OUT_COMM();
00432 }
00433 ESOS_TASK_END();
00434 }
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446 void reverseString(char *psz_s1, char *psz_s2) {
00447 char *psz_s1end;
00448 if (!(*psz_s1)) {
00449 *psz_s2 = 0;
00450 return;
00451 }
00452 psz_s1end = psz_s1;
00453
00454 while (*psz_s1end) psz_s1end++;
00455 psz_s1end--;
00456
00457 while (psz_s1end != psz_s1) {
00458 *psz_s2 = *psz_s1end;
00459 psz_s1end--;
00460 psz_s2++;
00461 }
00462
00463 *psz_s2 = *psz_s1end;
00464 psz_s2++;
00465
00466 *psz_s2 = 0;
00467 }
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502 void user_init(void) {
00503 uint16* pu16_ptr;
00504 uint16 u16_junk;
00505 ESOS_TMR_HANDLE tmrhnd_t1,tmrhnd_t2,tmrhnd_t3;
00506
00507 __esos_unsafe_PutString( HELLO_MSG );
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518 esos_RegisterTask( __simulated_isr );
00519
00520
00521
00522
00523
00524
00525
00526
00527 #if 0
00528 esos_RegisterTask( upper_case );
00529 #endif
00530 #if 0
00531 tmrhnd_t1 = esos_RegisterTimer( swTimerLED, 500 );
00532 #endif
00533 #if 0
00534 esos_RegisterTask( upper_case );
00535 tmrhnd_t1 = esos_RegisterTimer( swTimerLED, 500 );
00536 #endif
00537 #if 0
00538 esos_RegisterTask( query_swTmrCnt );
00539 tmrhnd_t1 = esos_RegisterTimer( swTimerLED, 500 );
00540 tmrhnd_t2 = esos_RegisterTimer( swTimerCounter, 10 );
00541 #endif
00542 #if 0
00543 esos_RegisterTask( upper_case2 );
00544 tmrhnd_t1 = esos_RegisterTimer( swTimerLED, 1000 );
00545 #endif
00546 #if 0
00547 esos_RegisterTask( reverse_string );
00548 tmrhnd_t1 = esos_RegisterTimer( swTimerLED, 1000 );
00549 #endif
00550 #if 0
00551 esos_RegisterTimer( swTimerLED, 1000 );
00552 esos_RegisterTask( task1 );
00553 esos_RegisterTask( task2 );
00554 esos_RegisterTask( task3 );
00555 #endif
00556 #if 0
00557 esos_RegisterTask( reverse_string );
00558 esos_RegisterTask( task_LED );
00559 #endif
00560 #if 0
00561 esos_RegisterTask( upper_case2 );
00562 esos_RegisterTask( task_LED );
00563 tmrhnd_t1 = esos_RegisterTimer( swTimerPrintA, 400 );
00564 tmrhnd_t2 = esos_RegisterTimer( swTimerPrintB, 500 );
00565 tmrhnd_t3 = esos_RegisterTimer( swTimerPrintC, 750 );
00566 #endif
00567
00568
00569 #if 0
00570 esos_RegisterTask( query_swTmrCnt );
00571 esos_RegisterTimer( swTimerCounter, 10 );
00572 esos_RegisterTimer( swTimerLED, 1000 );
00573 tmrhnd_t1 = esos_RegisterTimer( swTimerPrintA, 400 );
00574 tmrhnd_t2 = esos_RegisterTimer( swTimerPrintB, 500 );
00575 tmrhnd_t3 = esos_RegisterTimer( swTimerPrintC, 750 );
00576 esos_RegisterTask( task1 );
00577 esos_RegisterTask( task2 );
00578 esos_RegisterTask( task3 );
00579 #endif
00580
00581
00582 #if 0
00583 esos_RegisterTask( reverse_string );
00584 esos_RegisterTimer( swTimerLED, 1000 );
00585 tmrhnd_t1 = esos_RegisterTimer( swTimerPrintA, 400 );
00586 tmrhnd_t2 = esos_RegisterTimer( swTimerPrintB, 500 );
00587 tmrhnd_t3 = esos_RegisterTimer( swTimerPrintC, 750 );
00588 esos_RegisterTask( task1 );
00589 esos_RegisterTask( task2 );
00590 esos_RegisterTask( task3 );
00591 #endif
00592
00593 #if 0
00594 ESOS_INIT_SEMAPHORE(sem_BCanRun, 0);
00595 ESOS_INIT_SEMAPHORE(sem_CCanRun, 0);
00596 esos_RegisterTask( taskSemA );
00597 esos_RegisterTask( taskSemB );
00598 esos_RegisterTask( taskSemC );
00599 #endif
00600
00601 #if 1
00602
00603
00604 ESOS_INIT_SEMAPHORE(sem_mutex, 1);
00605 esos_RegisterTask( taskMutexA );
00606 esos_RegisterTask( taskMutexB );
00607 #endif
00608
00609 }