1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| #include <am.h> #include <klib.h> #include <klib-macros.h>
typedef union thread { struct { const char *name; void (*entry)(void *); Context context; union thread *next; char end[0]; }; uint8_t stack[8192]; } Thread;
void T1(void *); void T2(void *); void T3(void *);
Thread threads[] = { { .name = "_", .entry = NULL, .next = &threads[1] },
{ .name = "1", .entry = T1, .next = &threads[2] }, { .name = "2", .entry = T2, .next = &threads[3] }, { .name = "3", .entry = T3, .next = &threads[1] }, }; Thread *current = &threads[0];
Context *on_interrupt(Event ev, Context *ctx) { current->context = *ctx;
current = current->next;
return ¤t->context; }
int main() { cte_init(on_interrupt);
for (int i = 1; i < LENGTH(threads); i++) { Thread *t = &threads[i]; t->context = *kcontext( (Area) { .start = &t->end, .end = t + 1, }, t->entry, NULL ); }
yield(); assert(0); }
void delay() { for (int volatile i = 0; i < 10000000; i++); }
void T1(void *arg) { while (1) { putch('A'); delay(); } } void T2(void *arg) { while (1) { putch('B'); delay(); } } void T3(void *arg) { while (1) { putch('C'); delay(); } }
|