Mercurial > ecos
comparison examples/simple-alarm.c @ 168:ead06911cbae
Add up-to-date examples
| author | jlarmour |
|---|---|
| date | Wed, 04 Jul 2001 17:34:09 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 167:59f91bb9f684 | 168:ead06911cbae |
|---|---|
| 1 /* this is a very simple program meant to demonstrate | |
| 2 a basic use of time, alarms and alarm-handling functions | |
| 3 in eCos */ | |
| 4 | |
| 5 #include <cyg/kernel/kapi.h> | |
| 6 | |
| 7 #include <stdio.h> | |
| 8 | |
| 9 #define NTHREADS 1 | |
| 10 #define STACKSIZE 4096 | |
| 11 | |
| 12 static cyg_handle_t thread[NTHREADS]; | |
| 13 | |
| 14 static cyg_thread thread_obj[NTHREADS]; | |
| 15 static char stack[NTHREADS][STACKSIZE]; | |
| 16 | |
| 17 static void alarm_prog( cyg_addrword_t data ); | |
| 18 | |
| 19 /* we install our own startup routine which sets up | |
| 20 threads and starts the scheduler */ | |
| 21 void cyg_user_start(void) | |
| 22 { | |
| 23 cyg_thread_create(4, alarm_prog, (cyg_addrword_t) 0, | |
| 24 "alarm_thread", (void *) stack[0], | |
| 25 STACKSIZE, &thread[0], &thread_obj[0]); | |
| 26 cyg_thread_resume(thread[0]); | |
| 27 } | |
| 28 | |
| 29 /* we need to declare the alarm handling function (which is | |
| 30 defined below), so that we can pass it to | |
| 31 cyg_alarm_initialize() */ | |
| 32 cyg_alarm_t test_alarm_func; | |
| 33 | |
| 34 /* alarm_prog() is a thread which sets up an alarm which is then | |
| 35 handled by test_alarm_func() */ | |
| 36 static void alarm_prog(cyg_addrword_t data) | |
| 37 { | |
| 38 cyg_handle_t test_counterH, system_clockH, test_alarmH; | |
| 39 cyg_tick_count_t ticks; | |
| 40 cyg_alarm test_alarm; | |
| 41 unsigned how_many_alarms = 0, prev_alarms = 0, tmp_how_many; | |
| 42 | |
| 43 system_clockH = cyg_real_time_clock(); | |
| 44 cyg_clock_to_counter(system_clockH, &test_counterH); | |
| 45 cyg_alarm_create(test_counterH, test_alarm_func, | |
| 46 (cyg_addrword_t) &how_many_alarms, | |
| 47 &test_alarmH, &test_alarm); | |
| 48 cyg_alarm_initialize(test_alarmH, cyg_current_time()+200, 200); | |
| 49 | |
| 50 /* get in a loop in which we read the current time and | |
| 51 print it out, just to have something scrolling by */ | |
| 52 for (;;) { | |
| 53 ticks = cyg_current_time(); | |
| 54 printf("Time is %llu\n", ticks); | |
| 55 /* note that we must lock access to how_many_alarms, since the | |
| 56 alarm handler might change it. this involves using the | |
| 57 annoying temporary variable tmp_how_many so that I can keep the | |
| 58 critical region short */ | |
| 59 cyg_scheduler_lock(); | |
| 60 tmp_how_many = how_many_alarms; | |
| 61 cyg_scheduler_unlock(); | |
| 62 if (prev_alarms != tmp_how_many) { | |
| 63 printf(" ---> alarm calls so far: %u\n", tmp_how_many); | |
| 64 prev_alarms = tmp_how_many; | |
| 65 } | |
| 66 cyg_thread_delay(30); | |
| 67 } | |
| 68 } | |
| 69 | |
| 70 /* test_alarm_func() is invoked as an alarm handler, so | |
| 71 it should be quick and simple. in this case it increments | |
| 72 the data that is passed to it. */ | |
| 73 void test_alarm_func(cyg_handle_t alarmH, cyg_addrword_t data) | |
| 74 { | |
| 75 ++*((unsigned *) data); | |
| 76 } |
