annotate examples/simple-alarm.c @ 1192:797d8336bd8a

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