Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@2:360f136fabaa, 2013-09-16 (annotated)
- Committer:
- akouz
- Date:
- Mon Sep 16 11:40:39 2013 +0000
- Revision:
- 2:360f136fabaa
- Parent:
- 0:fb6bbc10ffa0
- Child:
- 3:85a9253b7559
"HelloWorld" on top of an simple cooperative operating system COOS
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| simon | 0:fb6bbc10ffa0 | 1 | #include "mbed.h" |
| akouz | 2:360f136fabaa | 2 | #include "typedef.h" |
| akouz | 2:360f136fabaa | 3 | #include "coos.h" |
| simon | 0:fb6bbc10ffa0 | 4 | |
| akouz | 2:360f136fabaa | 5 | //########################################################## |
| akouz | 2:360f136fabaa | 6 | // def & enum |
| akouz | 2:360f136fabaa | 7 | //########################################################## |
| akouz | 2:360f136fabaa | 8 | |
| akouz | 2:360f136fabaa | 9 | |
| akouz | 2:360f136fabaa | 10 | //########################################################## |
| akouz | 2:360f136fabaa | 11 | // class |
| akouz | 2:360f136fabaa | 12 | //########################################################## |
| akouz | 2:360f136fabaa | 13 | Ticker flipper; |
| simon | 0:fb6bbc10ffa0 | 14 | DigitalOut myled(LED1); |
| simon | 0:fb6bbc10ffa0 | 15 | |
| akouz | 2:360f136fabaa | 16 | //########################################################## |
| akouz | 2:360f136fabaa | 17 | // var |
| akouz | 2:360f136fabaa | 18 | //########################################################## |
| akouz | 2:360f136fabaa | 19 | jmp_buf COOS_main_context; |
| akouz | 2:360f136fabaa | 20 | jmp_buf COOS_task_context[MAX_TASKS]; /* store environment for tasks */ |
| akouz | 2:360f136fabaa | 21 | volatile uchar COOS_task_no; |
| akouz | 2:360f136fabaa | 22 | volatile int COOS_task_delay[MAX_TASKS]; /* task delay in 1 ms ticks, task stopped if value is negative */ |
| akouz | 2:360f136fabaa | 23 | |
| akouz | 2:360f136fabaa | 24 | volatile uchar timeflags = 0; |
| akouz | 2:360f136fabaa | 25 | |
| akouz | 2:360f136fabaa | 26 | //########################################################## |
| akouz | 2:360f136fabaa | 27 | // func |
| akouz | 2:360f136fabaa | 28 | //########################################################## |
| akouz | 2:360f136fabaa | 29 | |
| akouz | 2:360f136fabaa | 30 | // ====================================================== |
| akouz | 2:360f136fabaa | 31 | // Task 0 |
| akouz | 2:360f136fabaa | 32 | // ====================================================== |
| akouz | 2:360f136fabaa | 33 | void COOS_task0(void){ |
| akouz | 2:360f136fabaa | 34 | DELAY(1); |
| simon | 0:fb6bbc10ffa0 | 35 | while(1) { |
| simon | 0:fb6bbc10ffa0 | 36 | myled = 1; |
| akouz | 2:360f136fabaa | 37 | DELAY(700); |
| simon | 0:fb6bbc10ffa0 | 38 | myled = 0; |
| akouz | 2:360f136fabaa | 39 | DELAY(700); |
| akouz | 2:360f136fabaa | 40 | } |
| akouz | 2:360f136fabaa | 41 | }; |
| akouz | 2:360f136fabaa | 42 | // ====================================================== |
| akouz | 2:360f136fabaa | 43 | // Task 1 |
| akouz | 2:360f136fabaa | 44 | // ====================================================== |
| akouz | 2:360f136fabaa | 45 | void COOS_task1(void){ |
| akouz | 2:360f136fabaa | 46 | DELAY(100); |
| akouz | 2:360f136fabaa | 47 | while(1){ |
| akouz | 2:360f136fabaa | 48 | while( myled == 1) { |
| akouz | 2:360f136fabaa | 49 | DELAY(50); |
| akouz | 2:360f136fabaa | 50 | myled = 0; |
| akouz | 2:360f136fabaa | 51 | DELAY(50); |
| akouz | 2:360f136fabaa | 52 | myled = 1; |
| akouz | 2:360f136fabaa | 53 | } |
| akouz | 2:360f136fabaa | 54 | DELAY(500); |
| simon | 0:fb6bbc10ffa0 | 55 | } |
| akouz | 2:360f136fabaa | 56 | }; |
| akouz | 2:360f136fabaa | 57 | // ====================================================== |
| akouz | 2:360f136fabaa | 58 | // Task 2 |
| akouz | 2:360f136fabaa | 59 | // ====================================================== |
| akouz | 2:360f136fabaa | 60 | void COOS_task2(void){ |
| akouz | 2:360f136fabaa | 61 | DELAY(STOP); |
| akouz | 2:360f136fabaa | 62 | }; |
| akouz | 2:360f136fabaa | 63 | // ====================================================== |
| akouz | 2:360f136fabaa | 64 | // Task 3 |
| akouz | 2:360f136fabaa | 65 | // ====================================================== |
| akouz | 2:360f136fabaa | 66 | void COOS_task3(void){ |
| akouz | 2:360f136fabaa | 67 | DELAY(STOP); |
| akouz | 2:360f136fabaa | 68 | }; |
| akouz | 2:360f136fabaa | 69 | // ====================================================== |
| akouz | 2:360f136fabaa | 70 | // Task 4 |
| akouz | 2:360f136fabaa | 71 | // ====================================================== |
| akouz | 2:360f136fabaa | 72 | void COOS_task4(void){ |
| akouz | 2:360f136fabaa | 73 | DELAY(STOP); |
| akouz | 2:360f136fabaa | 74 | }; |
| akouz | 2:360f136fabaa | 75 | // ====================================================== |
| akouz | 2:360f136fabaa | 76 | // Task 5 |
| akouz | 2:360f136fabaa | 77 | // ====================================================== |
| akouz | 2:360f136fabaa | 78 | void COOS_task5(void){ |
| akouz | 2:360f136fabaa | 79 | DELAY(STOP); |
| akouz | 2:360f136fabaa | 80 | }; |
| akouz | 2:360f136fabaa | 81 | // ====================================================== |
| akouz | 2:360f136fabaa | 82 | // Task 6 |
| akouz | 2:360f136fabaa | 83 | // ====================================================== |
| akouz | 2:360f136fabaa | 84 | void COOS_task6(void){ |
| akouz | 2:360f136fabaa | 85 | DELAY(STOP); |
| akouz | 2:360f136fabaa | 86 | }; |
| akouz | 2:360f136fabaa | 87 | // ====================================================== |
| akouz | 2:360f136fabaa | 88 | // Task 7 |
| akouz | 2:360f136fabaa | 89 | // ====================================================== |
| akouz | 2:360f136fabaa | 90 | void COOS_task7(void){ |
| akouz | 2:360f136fabaa | 91 | DELAY(STOP); |
| akouz | 2:360f136fabaa | 92 | }; |
| akouz | 2:360f136fabaa | 93 | |
| akouz | 2:360f136fabaa | 94 | // ====================================================== |
| akouz | 2:360f136fabaa | 95 | // Shutdown task No |
| akouz | 2:360f136fabaa | 96 | // ====================================================== |
| akouz | 2:360f136fabaa | 97 | void shutdown_task(uchar task_No) { |
| akouz | 2:360f136fabaa | 98 | COOS_task_delay[task_No] = STOP; // sleep forever |
| simon | 0:fb6bbc10ffa0 | 99 | } |
| akouz | 2:360f136fabaa | 100 | |
| akouz | 2:360f136fabaa | 101 | // ====================================================== |
| akouz | 2:360f136fabaa | 102 | // Wake-up task No |
| akouz | 2:360f136fabaa | 103 | // ====================================================== |
| akouz | 2:360f136fabaa | 104 | void wake_up_task(uchar task_No) { |
| akouz | 2:360f136fabaa | 105 | if (COOS_task_delay[task_No] < 0){ |
| akouz | 2:360f136fabaa | 106 | COOS_task_delay[task_No] = 0; // run |
| akouz | 2:360f136fabaa | 107 | } |
| akouz | 2:360f136fabaa | 108 | } |
| akouz | 2:360f136fabaa | 109 | // ====================================================== |
| akouz | 2:360f136fabaa | 110 | // Timer |
| akouz | 2:360f136fabaa | 111 | // ====================================================== |
| akouz | 2:360f136fabaa | 112 | void tick_1ms() { |
| akouz | 2:360f136fabaa | 113 | timeflags |= 1; |
| akouz | 2:360f136fabaa | 114 | } |
| akouz | 2:360f136fabaa | 115 | |
| akouz | 2:360f136fabaa | 116 | // ====================================================== |
| akouz | 2:360f136fabaa | 117 | // Main |
| akouz | 2:360f136fabaa | 118 | // ====================================================== |
| akouz | 2:360f136fabaa | 119 | int main(void) { |
| akouz | 2:360f136fabaa | 120 | int sjres, i; |
| akouz | 2:360f136fabaa | 121 | // ----------------------- |
| akouz | 2:360f136fabaa | 122 | // Init tick |
| akouz | 2:360f136fabaa | 123 | // ----------------------- |
| akouz | 2:360f136fabaa | 124 | flipper.attach(&tick_1ms, 0.001); |
| akouz | 2:360f136fabaa | 125 | |
| akouz | 2:360f136fabaa | 126 | // ----------------------- |
| akouz | 2:360f136fabaa | 127 | // Init tasks |
| akouz | 2:360f136fabaa | 128 | // ----------------------- |
| akouz | 2:360f136fabaa | 129 | for (COOS_task_no=0; COOS_task_no<MAX_TASKS; COOS_task_no++) { |
| akouz | 2:360f136fabaa | 130 | sjres = setjmp(COOS_main_context); |
| akouz | 2:360f136fabaa | 131 | if (sjres == 0) { |
| akouz | 2:360f136fabaa | 132 | switch (COOS_task_no & 0x07) { |
| akouz | 2:360f136fabaa | 133 | case 0 : COOS_task0(); break; |
| akouz | 2:360f136fabaa | 134 | case 1 : COOS_task1(); break; |
| akouz | 2:360f136fabaa | 135 | case 2 : COOS_task2(); break; |
| akouz | 2:360f136fabaa | 136 | case 3 : COOS_task3(); break; |
| akouz | 2:360f136fabaa | 137 | case 4 : COOS_task4(); break; |
| akouz | 2:360f136fabaa | 138 | case 5 : COOS_task5(); break; |
| akouz | 2:360f136fabaa | 139 | case 6 : COOS_task6(); break; |
| akouz | 2:360f136fabaa | 140 | case 7 : COOS_task7(); break; |
| akouz | 2:360f136fabaa | 141 | } // switch |
| akouz | 2:360f136fabaa | 142 | } else { |
| akouz | 2:360f136fabaa | 143 | COOS_task_delay[COOS_task_no] = --sjres; |
| akouz | 2:360f136fabaa | 144 | } |
| akouz | 2:360f136fabaa | 145 | } // for |
| akouz | 2:360f136fabaa | 146 | // ----------------------- |
| akouz | 2:360f136fabaa | 147 | // Scheduler loop |
| akouz | 2:360f136fabaa | 148 | // ----------------------- |
| akouz | 2:360f136fabaa | 149 | COOS_task_no = 0; |
| akouz | 2:360f136fabaa | 150 | while(1) { |
| akouz | 2:360f136fabaa | 151 | if (COOS_task_delay[COOS_task_no] == 0) { /* if task is active */ |
| akouz | 2:360f136fabaa | 152 | sjres = setjmp(COOS_main_context); /* set return point and get delay value from the task */ |
| akouz | 2:360f136fabaa | 153 | if (sjres == 0){ /* after setting return point */ |
| akouz | 2:360f136fabaa | 154 | longjmp(COOS_task_context[COOS_task_no], 1); /* invoke task */ |
| akouz | 2:360f136fabaa | 155 | } else { /* after returning from task */ |
| akouz | 2:360f136fabaa | 156 | COOS_task_delay[COOS_task_no] = --sjres; /* set task delay (negative delay - task stopped) */ |
| akouz | 2:360f136fabaa | 157 | } |
| akouz | 2:360f136fabaa | 158 | } |
| akouz | 2:360f136fabaa | 159 | COOS_task_no++; |
| akouz | 2:360f136fabaa | 160 | if (COOS_task_no >= MAX_TASKS){ |
| akouz | 2:360f136fabaa | 161 | COOS_task_no = 0; |
| akouz | 2:360f136fabaa | 162 | } |
| akouz | 2:360f136fabaa | 163 | // ----------------------- |
| akouz | 2:360f136fabaa | 164 | // Count time |
| akouz | 2:360f136fabaa | 165 | // ----------------------- |
| akouz | 2:360f136fabaa | 166 | if (timeflags & 1) { |
| akouz | 2:360f136fabaa | 167 | timeflags &= 0xFE; // clear flag |
| akouz | 2:360f136fabaa | 168 | for (i=0; i<MAX_TASKS; i++){ |
| akouz | 2:360f136fabaa | 169 | if (COOS_task_delay[i] > 0) // if task not stopped |
| akouz | 2:360f136fabaa | 170 | COOS_task_delay[i]--; |
| akouz | 2:360f136fabaa | 171 | } // for |
| akouz | 2:360f136fabaa | 172 | } // if |
| akouz | 2:360f136fabaa | 173 | } // while |
| akouz | 2:360f136fabaa | 174 | return 0; |
| akouz | 2:360f136fabaa | 175 | } // main |
| akouz | 2:360f136fabaa | 176 | |
| akouz | 2:360f136fabaa | 177 | /* EOF */ |