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 #include "esos_pc.h"
00036 #include "esos_pc_stdio.h"
00037
00038 #include <stdio.h>
00039 #include <sys/select.h>
00040 #include <termios.h>
00041 #include <unistd.h>
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 uint32 randomNumInRange(uint32 u32_lo, uint32 u32_hi);
00052
00053
00054
00055
00056 volatile uint32 u32_T2Count;
00057 volatile uint32 u32_T3Count;
00058 static uint8 psz_T2Is[]="T2 is ";
00059 static uint8 psz_T3Is[]="T3 is ";
00060 static uint8 psz_Enabled[]="enabled.";
00061 static uint8 psz_Disabled[]="disabled.";
00062 static uint8 psz_CRNL[3]= {0x0D, 0x0A, 0};
00063
00064
00065
00066 uint32 u32_myT1Count = 0;
00067 uint8 LED1 = TRUE;
00068 uint8 LED2 = TRUE;
00069
00070 struct stTask* pst_MyTasks[3];
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081 ESOS_USER_TASK( __simulated_isr ) {
00082 static uint32 u32_count, u32_tick;
00083
00084 ESOS_TASK_BEGIN(pstTask);
00085 u32_count = 0;
00086 while (TRUE) {
00087
00088 __esos_tmrSvcsExecute();
00089 ESOS_TASK_WAIT_TICKS( pstTask, 1 );
00090
00091 }
00092 ESOS_TASK_END(pstTask);
00093 }
00094
00095 uint32 randomNumInRange(uint32 u32_lo, uint32 u32_hi) {
00096 uint32 u32_d1, u32_d2, u32_d4, u32_ret;
00097 UINT32 U32_temp;
00098
00099 while (TRUE) {
00100 u32_d4 = esos_GetRandomUint32();
00101 u32_ret = u32_lo + u32_d4;
00102 if (u32_ret <= u32_hi) return u32_ret;
00103
00104 U32_temp._uint32 = u32_d4;
00105 u32_d2 = U32_temp.u16LoWord ^ U32_temp.u16HiWord;
00106 u32_ret = u32_lo + u32_d2;
00107 if (u32_ret <= u32_hi) return u32_ret;
00108
00109 u32_d1 = U32_temp.u8LoLsb ^ U32_temp.u8LoMsb ^ U32_temp.u8HiLsb ^ U32_temp.u8HiMsb;
00110 u32_ret = u32_lo + u32_d1;
00111 if (u32_ret <= u32_hi) return u32_ret;
00112 }
00113 }
00114
00115
00116
00117 ESOS_USER_TIMER( swTimerCounter ) {
00118 u32_myT1Count++;
00119 }
00120
00121
00122 ESOS_USER_TIMER( swTimerLED ) {
00123
00124 if (LED2)
00125 printf("\a");
00126 else
00127 printf("\a");
00128 fflush(stdout);
00129 LED2 = !LED2;
00130 }
00131
00132 uint32 u32_cnt1, u32_cnt2, u32_cnt3;
00133
00134
00135 ESOS_USER_TIMER( swTimerPrintA ) {
00136
00137 printf("A:%d\n", u32_cnt1++);
00138 fflush(stdout);
00139 }
00140
00141 ESOS_USER_TIMER( swTimerPrintB ) {
00142
00143 printf("B:%d\n", u32_cnt2++);
00144 fflush(stdout);
00145 }
00146
00147 ESOS_USER_TIMER( swTimerPrintC ) {
00148
00149 printf("C:%d\n", u32_cnt3++);
00150 fflush(stdout);
00151 }
00152
00153 ESOS_USER_TASK( task1 ) {
00154 uint32 u32_rnd;
00155
00156 ESOS_TASK_BEGIN(pstTask);
00157 while (TRUE) {
00158 u32_rnd = 100*randomNumInRange(1, 30);
00159 printf("T1 (%d)\n", u32_rnd);
00160 ESOS_TASK_WAIT_TICKS(pstTask, u32_rnd);
00161 }
00162 ESOS_TASK_END(pstTask);
00163 }
00164
00165 ESOS_USER_TASK( task2 ) {
00166 uint32 u32_rnd;
00167
00168 ESOS_TASK_BEGIN(pstTask);
00169 while (TRUE) {
00170 u32_rnd = 100*randomNumInRange(1, 30);
00171 printf("T2 (%d)\n", u32_rnd);
00172 ESOS_TASK_WAIT_TICKS(pstTask, u32_rnd);
00173 }
00174 ESOS_TASK_END(pstTask);
00175 }
00176
00177 ESOS_USER_TASK( task3 ) {
00178 uint32 u32_rnd;
00179
00180 ESOS_TASK_BEGIN(pstTask);
00181 while (TRUE) {
00182 u32_rnd = 100*randomNumInRange(1, 30);
00183 printf("T3 (%d)\n", u32_rnd);
00184 ESOS_TASK_WAIT_TICKS(pstTask, u32_rnd);
00185 }
00186 ESOS_TASK_END(pstTask);
00187 }
00188
00189 ESOS_USER_TASK( task_LED ) {
00190 ESOS_TASK_BEGIN(pstTask);
00191 while (TRUE) {
00192
00193 ESOS_TASK_WAIT_TICKS(pstTask, 1000);
00194 printf("\a\a");
00195 fflush(stdout);
00196 }
00197 ESOS_TASK_END(pstTask);
00198 }
00199
00200
00201
00202 ESOS_USER_TASK( random_tmr ) {
00203 static uint32 u32_RandomNumber;
00204 static uint8 u8_RandomNumber;
00205 static uint8 u8_Count;
00206 static ESOS_TMR_HANDLE tmrhnd_t1;
00207 UINT32 U32_Temp;
00208
00209 ESOS_TASK_BEGIN(pstTask);
00210 while (TRUE) {
00211 ESOS_TASK_WAIT_TICKS(pstTask, randomNumInRange( 5000, 15000 ) );
00212 ESOS_TASK_WAIT_ON_AVAILABLE_OUT_COMM();
00213 ESOS_TASK_SIGNAL_BUSY_OUT_COMM();
00214 ESOS_TASK_WAIT_ON_SEND_STRING( "starting timer 1 (");
00215 ESOS_TASK_WAIT_ON_SEND_UINT32_AS_HEX_STRING( u32_myT1Count );
00216 ESOS_TASK_WAIT_ON_SEND_STRING( ")");
00217 ESOS_TASK_WAIT_ON_SEND_STRING( psz_CRNL );
00218 ESOS_TASK_RELEASE_OUT_COMM();
00219 tmrhnd_t1 = esos_RegisterTimer( swTimerCounter, 500 );
00220 ESOS_TASK_WAIT_TICKS(pstTask, randomNumInRange( 5000, 15000 ) );
00221 ESOS_TASK_WAIT_ON_AVAILABLE_OUT_COMM();
00222 ESOS_TASK_SIGNAL_BUSY_OUT_COMM();
00223 ESOS_TASK_WAIT_ON_SEND_STRING( "stopping timer 1 by handle (");
00224 ESOS_TASK_WAIT_ON_SEND_UINT32_AS_HEX_STRING( u32_myT1Count );
00225 ESOS_TASK_WAIT_ON_SEND_STRING( ")");
00226 ESOS_TASK_WAIT_ON_SEND_STRING( psz_CRNL );
00227 ESOS_TASK_RELEASE_OUT_COMM();
00228 esos_UnregisterTimer( tmrhnd_t1 );
00229
00230 ESOS_TASK_WAIT_TICKS(pstTask, randomNumInRange( 5000, 15000 ) );
00231 ESOS_TASK_WAIT_ON_AVAILABLE_OUT_COMM();
00232 ESOS_TASK_SIGNAL_BUSY_OUT_COMM();
00233 ESOS_TASK_WAIT_ON_SEND_STRING( "starting timer 1 (");
00234 ESOS_TASK_WAIT_ON_SEND_UINT32_AS_HEX_STRING( u32_myT1Count );
00235 ESOS_TASK_WAIT_ON_SEND_STRING( ")");
00236 ESOS_TASK_WAIT_ON_SEND_STRING( psz_CRNL );
00237 ESOS_TASK_RELEASE_OUT_COMM();
00238 tmrhnd_t1 = esos_RegisterTimer( swTimerCounter, 500 );
00239 ESOS_TASK_WAIT_TICKS(pstTask, randomNumInRange( 5000, 15000 ) );
00240 ESOS_TASK_WAIT_ON_AVAILABLE_OUT_COMM();
00241 ESOS_TASK_SIGNAL_BUSY_OUT_COMM();
00242 ESOS_TASK_WAIT_ON_SEND_STRING( "stopping timer 1 by function (");
00243 ESOS_TASK_WAIT_ON_SEND_UINT32_AS_HEX_STRING( u32_myT1Count );
00244 ESOS_TASK_WAIT_ON_SEND_STRING( ")");
00245 ESOS_TASK_WAIT_ON_SEND_STRING( psz_CRNL );
00246 ESOS_TASK_RELEASE_OUT_COMM();
00247 esos_UnregisterTimer( esos_GetTimerHandle( swTimerCounter) );
00248
00249 }
00250 ESOS_TASK_END(pstTask);
00251 }
00252
00253
00254
00255 ESOS_USER_TASK( random_tmr_dbg ) {
00256 static uint32 u32_RandomNumber;
00257 static uint8 u8_RandomNumber;
00258 static uint8 u8_Count;
00259 static ESOS_TMR_HANDLE tmrhnd_t1;
00260 static ESOS_TMR_HANDLE tmrhnd_ret;
00261 UINT32 U32_Temp;
00262
00263 ESOS_TASK_BEGIN(pstTask);
00264 while (TRUE) {
00265 ESOS_TASK_WAIT_TICKS(pstTask, 1*1000 );
00266 u32_myT1Count = 0;
00267 ESOS_TASK_WAIT_ON_AVAILABLE_OUT_COMM();
00268 ESOS_TASK_SIGNAL_BUSY_OUT_COMM();
00269 ESOS_TASK_WAIT_ON_SEND_STRING( "starting timer 10s/0.1 (");
00270 ESOS_TASK_WAIT_ON_SEND_UINT32_AS_HEX_STRING( u32_myT1Count );
00271 ESOS_TASK_WAIT_ON_SEND_STRING( ")");
00272 ESOS_TASK_WAIT_ON_SEND_STRING( psz_CRNL );
00273 ESOS_TASK_RELEASE_OUT_COMM();
00274
00275 tmrhnd_t1 = esos_RegisterTimer( swTimerCounter, 1 );
00276 ESOS_TASK_WAIT_TICKS(pstTask, 10*1000 );
00277 ESOS_TASK_WAIT_ON_AVAILABLE_OUT_COMM();
00278 ESOS_TASK_SIGNAL_BUSY_OUT_COMM();
00279 ESOS_TASK_WAIT_ON_SEND_STRING( "stopping timer 1 by handle (");
00280 ESOS_TASK_WAIT_ON_SEND_UINT32_AS_HEX_STRING( u32_myT1Count );
00281 ESOS_TASK_WAIT_ON_SEND_STRING( ")");
00282 ESOS_TASK_WAIT_ON_SEND_STRING( psz_CRNL );
00283 ESOS_TASK_RELEASE_OUT_COMM();
00284 esos_UnregisterTimer( tmrhnd_t1 );
00285
00286 ESOS_TASK_WAIT_TICKS(pstTask, randomNumInRange( 1*1000, 10*1000 ) );
00287 u32_myT1Count = 0;
00288 ESOS_TASK_WAIT_ON_AVAILABLE_OUT_COMM();
00289 ESOS_TASK_SIGNAL_BUSY_OUT_COMM();
00290 ESOS_TASK_WAIT_ON_SEND_STRING( "starting timer 10s/0.2 (");
00291 ESOS_TASK_WAIT_ON_SEND_UINT32_AS_HEX_STRING( u32_myT1Count );
00292 ESOS_TASK_WAIT_ON_SEND_STRING( ")");
00293 ESOS_TASK_WAIT_ON_SEND_STRING( psz_CRNL );
00294 ESOS_TASK_RELEASE_OUT_COMM();
00295
00296 tmrhnd_t1 = esos_RegisterTimer( swTimerCounter, 2 );
00297 ESOS_TASK_WAIT_TICKS(pstTask, 10*1000 );
00298 ESOS_TASK_WAIT_ON_AVAILABLE_OUT_COMM();
00299 ESOS_TASK_SIGNAL_BUSY_OUT_COMM();
00300 ESOS_TASK_WAIT_ON_SEND_STRING( "stopping timer 1 by function (");
00301 ESOS_TASK_WAIT_ON_SEND_UINT32_AS_HEX_STRING( u32_myT1Count );
00302 ESOS_TASK_WAIT_ON_SEND_STRING( ")");
00303 ESOS_TASK_WAIT_ON_SEND_STRING( psz_CRNL );
00304 ESOS_TASK_RELEASE_OUT_COMM();
00305 esos_UnregisterTimer( esos_GetTimerHandle( swTimerCounter) );
00306
00307 ESOS_TASK_WAIT_TICKS(pstTask, randomNumInRange( 1*1000, 10*1000 ) );
00308 u32_myT1Count = 0;
00309 ESOS_TASK_WAIT_ON_AVAILABLE_OUT_COMM();
00310 ESOS_TASK_SIGNAL_BUSY_OUT_COMM();
00311 ESOS_TASK_WAIT_ON_SEND_STRING( "starting timer 10s/0.15 (");
00312 ESOS_TASK_WAIT_ON_SEND_UINT32_AS_HEX_STRING( u32_myT1Count );
00313 ESOS_TASK_WAIT_ON_SEND_STRING( ")");
00314 ESOS_TASK_WAIT_ON_SEND_STRING( psz_CRNL );
00315 ESOS_TASK_RELEASE_OUT_COMM();
00316
00317 tmrhnd_t1 = esos_RegisterTimer( swTimerCounter, 1 );
00318 ESOS_TASK_WAIT_TICKS(pstTask, 5*1000 );
00319 tmrhnd_ret = esos_ChangeTimerPeriod( tmrhnd_t1, 2 );
00320 if (tmrhnd_ret == ESOS_TMR_FAILURE) {
00321 ESOS_TASK_WAIT_ON_AVAILABLE_OUT_COMM();
00322 ESOS_TASK_SIGNAL_BUSY_OUT_COMM();
00323 ESOS_TASK_WAIT_ON_SEND_STRING( "change period failed");
00324 ESOS_TASK_WAIT_ON_SEND_STRING( psz_CRNL );
00325 ESOS_TASK_RELEASE_OUT_COMM();
00326 }
00327 ESOS_TASK_WAIT_TICKS(pstTask, 5*1000 );
00328 ESOS_TASK_WAIT_ON_AVAILABLE_OUT_COMM();
00329 ESOS_TASK_SIGNAL_BUSY_OUT_COMM();
00330 ESOS_TASK_WAIT_ON_SEND_STRING( "stopping timer 1 by function (");
00331 ESOS_TASK_WAIT_ON_SEND_UINT32_AS_HEX_STRING( u32_myT1Count );
00332 ESOS_TASK_WAIT_ON_SEND_STRING( ")");
00333 ESOS_TASK_WAIT_ON_SEND_STRING( psz_CRNL );
00334 ESOS_TASK_RELEASE_OUT_COMM();
00335 esos_UnregisterTimer( esos_GetTimerHandle( swTimerCounter) );
00336
00337
00338 }
00339 ESOS_TASK_END(pstTask);
00340 }
00341
00342 ESOS_USER_TASK( upper_case ) {
00343 static uint8 u8_char;
00344
00345 ESOS_TASK_BEGIN(pstTask);
00346 while (TRUE) {
00347 ESOS_TASK_WAIT_ON_AVAILABLE_IN_COMM();
00348 ESOS_TASK_SIGNAL_BUSY_IN_COMM();
00349 ESOS_TASK_WAIT_ON_GET_UINT8( u8_char );
00350 ESOS_TASK_RELEASE_IN_COMM();
00351 if ((u8_char >= 'a') && (u8_char <= 'z') )
00352 u8_char = u8_char - 'a' + 'A';
00353 ESOS_TASK_WAIT_ON_AVAILABLE_OUT_COMM();
00354 ESOS_TASK_SIGNAL_BUSY_OUT_COMM();
00355 ESOS_TASK_WAIT_ON_SEND_UINT8( u8_char);
00356 ESOS_TASK_RELEASE_OUT_COMM();
00357 }
00358 ESOS_TASK_END(pstTask);
00359 }
00360
00361 ESOS_USER_TASK( upper_case2 ) {
00362 static uint8 u8_i;
00363 static uint8 au8_x[257];
00364 static uint8 au8_y[257];
00365
00366 ESOS_TASK_BEGIN(pstTask);
00367 while (TRUE) {
00368 ESOS_TASK_WAIT_ON_AVAILABLE_IN_COMM();
00369 ESOS_TASK_SIGNAL_BUSY_IN_COMM();
00370 ESOS_TASK_WAIT_ON_GET_STRING( au8_x );
00371 ESOS_TASK_RELEASE_IN_COMM();
00372 u8_i = 0;
00373 while (TRUE) {
00374 if ((au8_x[u8_i] >= 'a') && (au8_x[u8_i] <= 'z') )
00375 au8_y[u8_i] = au8_x[u8_i] - 'a' + 'A';
00376 else
00377 au8_y[u8_i] = au8_x[u8_i];
00378 if (au8_x[u8_i] == 0) break;
00379 u8_i++;
00380 }
00381 ESOS_TASK_WAIT_ON_AVAILABLE_OUT_COMM();
00382 ESOS_TASK_SIGNAL_BUSY_OUT_COMM();
00383 ESOS_TASK_WAIT_ON_SEND_STRING( au8_y );
00384 ESOS_TASK_RELEASE_OUT_COMM();
00385 }
00386 ESOS_TASK_END(pstTask);
00387 }
00388
00389
00390 ESOS_USER_TASK( reverse_string ) {
00391 static uint8 u8_char;
00392 \
00393 static char* sz_in[257];
00394 static char* sz_out[257];
00395
00396 ESOS_TASK_BEGIN(pstTask);
00397 while (TRUE) {
00398 ESOS_TASK_WAIT_ON_AVAILABLE_IN_COMM();
00399 ESOS_TASK_SIGNAL_BUSY_IN_COMM();
00400 ESOS_TASK_WAIT_ON_GET_STRING( sz_in );
00401 ESOS_TASK_RELEASE_IN_COMM();
00402 reverseString( sz_in, sz_out );
00403 ESOS_TASK_WAIT_ON_AVAILABLE_OUT_COMM();
00404 ESOS_TASK_SIGNAL_BUSY_OUT_COMM();
00405 ESOS_TASK_WAIT_ON_SEND_STRING( sz_out );
00406 ESOS_TASK_WAIT_ON_SEND_UINT8('\n');
00407 ESOS_TASK_RELEASE_OUT_COMM();
00408 }
00409 ESOS_TASK_END(pstTask);
00410 }
00411
00422 void reverseString(char *psz_s1, char *psz_s2) {
00423 char *psz_s1end;
00424 if (!(*psz_s1)) {
00425 *psz_s2 = 0;
00426 return;
00427 }
00428 psz_s1end = psz_s1;
00429
00430 while (*psz_s1end) psz_s1end++;
00431 psz_s1end--;
00432
00433 while (psz_s1end != psz_s1) {
00434 *psz_s2 = *psz_s1end;
00435 psz_s1end--;
00436 psz_s2++;
00437 }
00438
00439 *psz_s2 = *psz_s1end;
00440 psz_s2++;
00441
00442 *psz_s2 = 0;
00443 }
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478 void user_init(void) {
00479 uint16* pu16_ptr;
00480 uint16 u16_junk;
00481 ESOS_TMR_HANDLE tmrhnd_t1,tmrhnd_t2,tmrhnd_t3;
00482
00483 __esos_hw_PutString( HELLO_MSG );
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494 esos_RegisterTask( __simulated_isr );
00495
00496
00497
00498 #if 0
00499 esos_RegisterTask( random_tmr);
00500 #endif
00501 #if 0
00502 esos_RegisterTask( random_tmr_dbg);
00503 #endif
00504 #if 0
00505 esos_RegisterTask( upper_case );
00506 tmrhnd_t2 = esos_RegisterTimer( swTimerCounter, 500 );
00507 #endif
00508 #if 0
00509 esos_RegisterTask( upper_case2 );
00510 tmrhnd_t2 = esos_RegisterTimer( swTimerLED, 1000 );
00511 #endif
00512 #if 0
00513 esos_RegisterTask( reverse_string );
00514 esos_RegisterTask( task_LED );
00515 #endif
00516 #if 0
00517 esos_RegisterTask( reverse_string );
00518 tmrhnd_t2 = esos_RegisterTimer( sw_Timer_LED, 1000 );
00519 #endif
00520 #if 0
00521 esos_RegisterTask( upper_case2 );
00522 esos_RegisterTimer( swTimerLED);
00523 tmrhnd_t1 = esos_RegisterTimer( swTimerPrintA, 400 );
00524 tmrhnd_t2 = esos_RegisterTimer( swTimerPrintB, 500 );
00525 tmrhnd_t3 = esos_RegisterTimer( swTimerPrintC, 750 );
00526 #endif
00527 #if 1
00528 esos_RegisterTimer( swTimerLED);
00529 esos_RegisterTask( task1 );
00530 esos_RegisterTask( task2 );
00531 esos_RegisterTask( task3 );
00532 #endif
00533
00534
00535
00536
00537
00538 }