Alex Kouznetsov / Mbed 2 deprecated COOS

Dependencies:   mbed

Revision:
2:360f136fabaa
Parent:
0:fb6bbc10ffa0
Child:
3:85a9253b7559
--- a/main.cpp	Sun Jan 01 20:57:57 2012 +0000
+++ b/main.cpp	Mon Sep 16 11:40:39 2013 +0000
@@ -1,12 +1,177 @@
 #include "mbed.h"
+#include "typedef.h"
+#include "coos.h"
 
+//##########################################################
+// def & enum
+//##########################################################
+
+
+//##########################################################
+// class
+//##########################################################
+Ticker flipper;
 DigitalOut myled(LED1);
 
-int main() {
+//##########################################################
+// var
+//##########################################################
+jmp_buf         COOS_main_context;
+jmp_buf         COOS_task_context[MAX_TASKS];     /* store environment for tasks */
+volatile uchar  COOS_task_no;
+volatile int    COOS_task_delay[MAX_TASKS];       /* task delay in 1 ms ticks, task stopped if value is negative */
+
+volatile uchar timeflags = 0;
+
+//##########################################################
+// func
+//##########################################################
+
+// ======================================================
+// Task 0
+// ======================================================
+void COOS_task0(void){
+    DELAY(1);
     while(1) {
         myled = 1;
-        wait(0.2);
+        DELAY(700);
         myled = 0;
-        wait(0.2);
+        DELAY(700);
+    }
+};
+// ======================================================
+// Task 1
+// ======================================================
+void COOS_task1(void){
+    DELAY(100);
+    while(1){
+        while( myled == 1) {
+          DELAY(50);
+          myled = 0;
+          DELAY(50);
+          myled = 1;
+        }
+        DELAY(500);
     }
+};
+// ======================================================
+// Task 2
+// ======================================================
+void COOS_task2(void){
+    DELAY(STOP);
+};
+// ======================================================
+// Task 3
+// ======================================================
+void COOS_task3(void){
+    DELAY(STOP);
+};
+// ======================================================
+// Task 4
+// ======================================================
+void COOS_task4(void){
+    DELAY(STOP);
+};
+// ======================================================
+// Task 5
+// ======================================================
+void COOS_task5(void){
+    DELAY(STOP);
+};
+// ======================================================
+// Task 6
+// ======================================================
+void COOS_task6(void){
+    DELAY(STOP);
+};
+// ======================================================
+// Task 7
+// ======================================================
+void COOS_task7(void){
+    DELAY(STOP);
+};
+
+// ======================================================
+// Shutdown task No
+// ======================================================
+ void shutdown_task(uchar task_No) {
+    COOS_task_delay[task_No] = STOP;        // sleep forever
 }
+
+// ======================================================
+// Wake-up task No
+// ======================================================
+void wake_up_task(uchar task_No) {
+    if (COOS_task_delay[task_No] < 0){
+        COOS_task_delay[task_No] = 0;       // run
+    }           
+}
+// ======================================================
+// Timer
+// ======================================================
+void tick_1ms() {
+    timeflags |= 1;
+}
+
+// ======================================================
+// Main
+// ======================================================
+int main(void) {
+    int   sjres, i;
+    // -----------------------
+    // Init tick
+    // -----------------------    
+    flipper.attach(&tick_1ms, 0.001); 
+
+    // -----------------------
+    // Init tasks
+    // -----------------------
+    for (COOS_task_no=0; COOS_task_no<MAX_TASKS; COOS_task_no++) {
+        sjres = setjmp(COOS_main_context);
+        if (sjres == 0) {
+            switch (COOS_task_no & 0x07) { 
+                case 0 :  COOS_task0();  break;   
+                case 1 :  COOS_task1();  break;   
+                case 2 :  COOS_task2();  break;   
+                case 3 :  COOS_task3();  break;   
+                case 4 :  COOS_task4();  break;   
+                case 5 :  COOS_task5();  break;   
+                case 6 :  COOS_task6();  break;   
+                case 7 :  COOS_task7();  break;   
+            } // switch
+        } else {
+            COOS_task_delay[COOS_task_no] = --sjres;
+        }
+    } // for
+    // -----------------------
+    // Scheduler loop
+    // -----------------------
+    COOS_task_no = 0;
+    while(1) {
+        if (COOS_task_delay[COOS_task_no] == 0) {               /* if task is active */
+            sjres = setjmp(COOS_main_context);                  /* set return point and get delay value from the task */
+            if (sjres == 0){                                    /* after setting return point */
+                longjmp(COOS_task_context[COOS_task_no], 1);    /* invoke task */
+            } else {                                            /* after returning from task */
+                COOS_task_delay[COOS_task_no] = --sjres;        /* set task delay (negative delay - task stopped) */
+            }
+        }
+        COOS_task_no++;         
+        if (COOS_task_no >= MAX_TASKS){
+            COOS_task_no = 0;
+        }
+        // -----------------------
+        // Count time
+        // -----------------------
+        if (timeflags & 1) { 
+            timeflags &= 0xFE;              // clear flag
+            for (i=0; i<MAX_TASKS; i++){
+                if (COOS_task_delay[i] > 0) // if task not stopped
+                COOS_task_delay[i]--;
+            } // for
+        } // if
+    } // while
+    return 0;
+} // main
+
+/* EOF */
\ No newline at end of file