Alex Kouznetsov / Mbed 2 deprecated COOS

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 */