Mercurial > flash_v2
view examples/simple-alarm.c @ 1718:c8515e560548
2004-08-21 Andrew Lunn <andrew.lunn@ascom.ch>
* include/flash_strata_v2.inl (flash_unlock_block):
* cdl/flash_strata_v2.cdl: CDL to control the maximum number of
blocks the driver supports. Some of the newer strata device has more
than the default maximum of 128. Problem pointed out by Kevin Zhang.
| author | asl |
|---|---|
| date | Sat, 21 Aug 2004 08:48:17 +0000 |
| parents | ead06911cbae |
| children |
line wrap: on
line source
/* this is a very simple program meant to demonstrate a basic use of time, alarms and alarm-handling functions in eCos */ #include <cyg/kernel/kapi.h> #include <stdio.h> #define NTHREADS 1 #define STACKSIZE 4096 static cyg_handle_t thread[NTHREADS]; static cyg_thread thread_obj[NTHREADS]; static char stack[NTHREADS][STACKSIZE]; static void alarm_prog( cyg_addrword_t data ); /* we install our own startup routine which sets up threads and starts the scheduler */ void cyg_user_start(void) { cyg_thread_create(4, alarm_prog, (cyg_addrword_t) 0, "alarm_thread", (void *) stack[0], STACKSIZE, &thread[0], &thread_obj[0]); cyg_thread_resume(thread[0]); } /* we need to declare the alarm handling function (which is defined below), so that we can pass it to cyg_alarm_initialize() */ cyg_alarm_t test_alarm_func; /* alarm_prog() is a thread which sets up an alarm which is then handled by test_alarm_func() */ static void alarm_prog(cyg_addrword_t data) { cyg_handle_t test_counterH, system_clockH, test_alarmH; cyg_tick_count_t ticks; cyg_alarm test_alarm; unsigned how_many_alarms = 0, prev_alarms = 0, tmp_how_many; system_clockH = cyg_real_time_clock(); cyg_clock_to_counter(system_clockH, &test_counterH); cyg_alarm_create(test_counterH, test_alarm_func, (cyg_addrword_t) &how_many_alarms, &test_alarmH, &test_alarm); cyg_alarm_initialize(test_alarmH, cyg_current_time()+200, 200); /* get in a loop in which we read the current time and print it out, just to have something scrolling by */ for (;;) { ticks = cyg_current_time(); printf("Time is %llu\n", ticks); /* note that we must lock access to how_many_alarms, since the alarm handler might change it. this involves using the annoying temporary variable tmp_how_many so that I can keep the critical region short */ cyg_scheduler_lock(); tmp_how_many = how_many_alarms; cyg_scheduler_unlock(); if (prev_alarms != tmp_how_many) { printf(" ---> alarm calls so far: %u\n", tmp_how_many); prev_alarms = tmp_how_many; } cyg_thread_delay(30); } } /* test_alarm_func() is invoked as an alarm handler, so it should be quick and simple. in this case it increments the data that is passed to it. */ void test_alarm_func(cyg_handle_t alarmH, cyg_addrword_t data) { ++*((unsigned *) data); }
