|
168
|
1 #include <cyg/kernel/kapi.h> |
|
|
2 |
|
|
3 #include <stdio.h> |
|
|
4 #include <math.h> |
|
|
5 #include <stdlib.h> |
|
|
6 |
|
|
7 /* now declare (and allocate space for) some kernel objects, |
|
|
8 like the two threads we will use */ |
|
|
9 cyg_thread thread_s[2]; /* space for two thread objects */ |
|
|
10 |
|
|
11 char stack[2][4096]; /* space for two 4K stacks */ |
|
|
12 |
|
|
13 /* now the handles for the threads */ |
|
|
14 cyg_handle_t simple_threadA, simple_threadB; |
|
|
15 |
|
|
16 /* and now variables for the procedure which is the thread */ |
|
|
17 cyg_thread_entry_t simple_program; |
|
|
18 |
|
|
19 /* and now a mutex to protect calls to the C library */ |
|
|
20 cyg_mutex_t cliblock; |
|
|
21 |
|
|
22 /* we install our own startup routine which sets up threads */ |
|
|
23 void cyg_user_start(void) |
|
|
24 { |
|
|
25 printf("Entering twothreads' cyg_user_start() function\n"); |
|
|
26 |
|
|
27 cyg_mutex_init(&cliblock); |
|
|
28 |
|
|
29 cyg_thread_create(4, simple_program, (cyg_addrword_t) 0, |
|
|
30 "Thread A", (void *) stack[0], 4096, |
|
|
31 &simple_threadA, &thread_s[0]); |
|
|
32 cyg_thread_create(4, simple_program, (cyg_addrword_t) 1, |
|
|
33 "Thread B", (void *) stack[1], 4096, |
|
|
34 &simple_threadB, &thread_s[1]); |
|
|
35 |
|
|
36 cyg_thread_resume(simple_threadA); |
|
|
37 cyg_thread_resume(simple_threadB); |
|
|
38 } |
|
|
39 |
|
|
40 /* this is a simple program which runs in a thread */ |
|
|
41 void simple_program(cyg_addrword_t data) |
|
|
42 { |
|
|
43 int message = (int) data; |
|
|
44 int delay; |
|
|
45 |
|
|
46 printf("Beginning execution; thread data is %d\n", message); |
|
|
47 |
|
|
48 cyg_thread_delay(200); |
|
|
49 |
|
|
50 for (;;) { |
|
|
51 delay = 200 + (rand() % 50); |
|
|
52 |
|
|
53 /* note: printf() must be protected by a |
|
|
54 call to cyg_mutex_lock() */ |
|
|
55 cyg_mutex_lock(&cliblock); { |
|
|
56 printf("Thread %d: and now a delay of %d clock ticks\n", |
|
|
57 message, delay); |
|
|
58 } |
|
|
59 cyg_mutex_unlock(&cliblock); |
|
|
60 cyg_thread_delay(delay); |
|
|
61 } |
|
|
62 } |