diff options
| author | Linus Nielsen Feltzing <linus@haxx.se> | 2002-04-29 14:25:44 +0000 |
|---|---|---|
| committer | Linus Nielsen Feltzing <linus@haxx.se> | 2002-04-29 14:25:44 +0000 |
| commit | bd2561dcbb73cd967676f50fec98759405f5e901 (patch) | |
| tree | 5b8439163a5c233c2bf0cd50fafeac578852f0b8 | |
| parent | 40c1c2251aba6d1de690a4fa8db4f8b8d1c8d25f (diff) | |
| download | rockbox-bd2561dcbb73cd967676f50fec98759405f5e901.zip rockbox-bd2561dcbb73cd967676f50fec98759405f5e901.tar.gz rockbox-bd2561dcbb73cd967676f50fec98759405f5e901.tar.bz2 rockbox-bd2561dcbb73cd967676f50fec98759405f5e901.tar.xz | |
Added queue handling stuff - NOT INTERRUPT SAFE
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@315 a1c6a512-1295-4272-9138-f99709370657
| -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 da3ddf5..f408c77 100644 --- a/firmware/kernel.c +++ b/firmware/kernel.c @@ -35,3 +35,30 @@ void yield(void) { switch_thread(); } + +/**************************************************************************** + * Queue handling stuff + ****************************************************************************/ +void queue_init(struct event_queue *q) +{ + q->read = 0; + q->write = 0; +} + +struct event *queue_wait(struct event_queue *q) +{ + while(q->read == q->write) + { + switch_thread(); + } + + return &q->events[(q->read++) & QUEUE_LENGTH_MASK]; +} + +void queue_post(struct event_queue *q, int id, void *data) +{ + int wr = (q->write++) & QUEUE_LENGTH_MASK; + + q->events[wr].id = id; + q->events[wr].data = data; +} diff --git a/firmware/kernel.h b/firmware/kernel.h index 60e8ad6..cef6cfe 100644 --- a/firmware/kernel.h +++ b/firmware/kernel.h @@ -25,6 +25,22 @@ #define HZ 100 /* number of ticks per second */ +#define QUEUE_LENGTH 16 /* MUST be a power of 2 */ +#define QUEUE_LENGTH_MASK (QUEUE_LENGTH - 1) + +struct event +{ + int id; + void *data; +}; + +struct event_queue +{ + struct event events[QUEUE_LENGTH]; + unsigned int read; + unsigned int write; +}; + /* global tick variable */ extern long current_tick; @@ -32,5 +48,8 @@ extern long current_tick; extern void yield(void); extern void sleep(int ticks); +extern void queue_init(struct event_queue *q); +extern struct event *queue_wait(struct event_queue *q); +extern void queue_post(struct event_queue *q, int id, void *data); #endif |