diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/kernel.c | 27 | ||||
-rw-r--r-- | firmware/kernel.h | 19 |
2 files changed, 46 insertions, 0 deletions
diff --git a/firmware/kernel.c b/firmware/kernel.c index da3ddf5ca7..f408c77bae 100644 --- a/firmware/kernel.c +++ b/firmware/kernel.c | |||
@@ -35,3 +35,30 @@ void yield(void) | |||
35 | { | 35 | { |
36 | switch_thread(); | 36 | switch_thread(); |
37 | } | 37 | } |
38 | |||
39 | /**************************************************************************** | ||
40 | * Queue handling stuff | ||
41 | ****************************************************************************/ | ||
42 | void queue_init(struct event_queue *q) | ||
43 | { | ||
44 | q->read = 0; | ||
45 | q->write = 0; | ||
46 | } | ||
47 | |||
48 | struct event *queue_wait(struct event_queue *q) | ||
49 | { | ||
50 | while(q->read == q->write) | ||
51 | { | ||
52 | switch_thread(); | ||
53 | } | ||
54 | |||
55 | return &q->events[(q->read++) & QUEUE_LENGTH_MASK]; | ||
56 | } | ||
57 | |||
58 | void queue_post(struct event_queue *q, int id, void *data) | ||
59 | { | ||
60 | int wr = (q->write++) & QUEUE_LENGTH_MASK; | ||
61 | |||
62 | q->events[wr].id = id; | ||
63 | q->events[wr].data = data; | ||
64 | } | ||
diff --git a/firmware/kernel.h b/firmware/kernel.h index 60e8ad6db1..cef6cfe96a 100644 --- a/firmware/kernel.h +++ b/firmware/kernel.h | |||
@@ -25,6 +25,22 @@ | |||
25 | 25 | ||
26 | #define HZ 100 /* number of ticks per second */ | 26 | #define HZ 100 /* number of ticks per second */ |
27 | 27 | ||
28 | #define QUEUE_LENGTH 16 /* MUST be a power of 2 */ | ||
29 | #define QUEUE_LENGTH_MASK (QUEUE_LENGTH - 1) | ||
30 | |||
31 | struct event | ||
32 | { | ||
33 | int id; | ||
34 | void *data; | ||
35 | }; | ||
36 | |||
37 | struct event_queue | ||
38 | { | ||
39 | struct event events[QUEUE_LENGTH]; | ||
40 | unsigned int read; | ||
41 | unsigned int write; | ||
42 | }; | ||
43 | |||
28 | /* global tick variable */ | 44 | /* global tick variable */ |
29 | extern long current_tick; | 45 | extern long current_tick; |
30 | 46 | ||
@@ -32,5 +48,8 @@ extern long current_tick; | |||
32 | extern void yield(void); | 48 | extern void yield(void); |
33 | extern void sleep(int ticks); | 49 | extern void sleep(int ticks); |
34 | 50 | ||
51 | extern void queue_init(struct event_queue *q); | ||
52 | extern struct event *queue_wait(struct event_queue *q); | ||
53 | extern void queue_post(struct event_queue *q, int id, void *data); | ||
35 | 54 | ||
36 | #endif | 55 | #endif |