Alex Kouznetsov / Mbed 2 deprecated COOS

Dependencies:   mbed

Committer:
akouz
Date:
Mon Sep 16 11:57:29 2013 +0000
Revision:
3:85a9253b7559
Parent:
2:360f136fabaa
Child:
4:690def0f4387
Improved LED flashing: one task sets LED on, another task sets LED off

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 //##########################################################
akouz 2:360f136fabaa 25 // func
akouz 2:360f136fabaa 26 //##########################################################
akouz 2:360f136fabaa 27
akouz 2:360f136fabaa 28 // ======================================================
akouz 2:360f136fabaa 29 // Task 0
akouz 2:360f136fabaa 30 // ======================================================
akouz 2:360f136fabaa 31 void COOS_task0(void){
akouz 2:360f136fabaa 32 DELAY(1);
simon 0:fb6bbc10ffa0 33 while(1) {
simon 0:fb6bbc10ffa0 34 myled = 1;
akouz 3:85a9253b7559 35 DELAY(250);
akouz 2:360f136fabaa 36 }
akouz 2:360f136fabaa 37 };
akouz 2:360f136fabaa 38 // ======================================================
akouz 2:360f136fabaa 39 // Task 1
akouz 2:360f136fabaa 40 // ======================================================
akouz 2:360f136fabaa 41 void COOS_task1(void){
akouz 2:360f136fabaa 42 DELAY(100);
akouz 2:360f136fabaa 43 while(1){
akouz 3:85a9253b7559 44 myled = 0;
akouz 3:85a9253b7559 45 DELAY(255);
simon 0:fb6bbc10ffa0 46 }
akouz 2:360f136fabaa 47 };
akouz 2:360f136fabaa 48 // ======================================================
akouz 2:360f136fabaa 49 // Task 2
akouz 2:360f136fabaa 50 // ======================================================
akouz 2:360f136fabaa 51 void COOS_task2(void){
akouz 2:360f136fabaa 52 DELAY(STOP);
akouz 2:360f136fabaa 53 };
akouz 2:360f136fabaa 54 // ======================================================
akouz 2:360f136fabaa 55 // Task 3
akouz 2:360f136fabaa 56 // ======================================================
akouz 2:360f136fabaa 57 void COOS_task3(void){
akouz 2:360f136fabaa 58 DELAY(STOP);
akouz 2:360f136fabaa 59 };
akouz 2:360f136fabaa 60 // ======================================================
akouz 2:360f136fabaa 61 // Task 4
akouz 2:360f136fabaa 62 // ======================================================
akouz 2:360f136fabaa 63 void COOS_task4(void){
akouz 2:360f136fabaa 64 DELAY(STOP);
akouz 2:360f136fabaa 65 };
akouz 2:360f136fabaa 66 // ======================================================
akouz 2:360f136fabaa 67 // Task 5
akouz 2:360f136fabaa 68 // ======================================================
akouz 2:360f136fabaa 69 void COOS_task5(void){
akouz 2:360f136fabaa 70 DELAY(STOP);
akouz 2:360f136fabaa 71 };
akouz 2:360f136fabaa 72 // ======================================================
akouz 2:360f136fabaa 73 // Task 6
akouz 2:360f136fabaa 74 // ======================================================
akouz 2:360f136fabaa 75 void COOS_task6(void){
akouz 2:360f136fabaa 76 DELAY(STOP);
akouz 2:360f136fabaa 77 };
akouz 2:360f136fabaa 78 // ======================================================
akouz 2:360f136fabaa 79 // Task 7
akouz 2:360f136fabaa 80 // ======================================================
akouz 2:360f136fabaa 81 void COOS_task7(void){
akouz 2:360f136fabaa 82 DELAY(STOP);
akouz 2:360f136fabaa 83 };
akouz 2:360f136fabaa 84
akouz 2:360f136fabaa 85 // ======================================================
akouz 2:360f136fabaa 86 // Shutdown task No
akouz 2:360f136fabaa 87 // ======================================================
akouz 2:360f136fabaa 88 void shutdown_task(uchar task_No) {
akouz 2:360f136fabaa 89 COOS_task_delay[task_No] = STOP; // sleep forever
simon 0:fb6bbc10ffa0 90 }
akouz 2:360f136fabaa 91
akouz 2:360f136fabaa 92 // ======================================================
akouz 2:360f136fabaa 93 // Wake-up task No
akouz 2:360f136fabaa 94 // ======================================================
akouz 2:360f136fabaa 95 void wake_up_task(uchar task_No) {
akouz 2:360f136fabaa 96 if (COOS_task_delay[task_No] < 0){
akouz 2:360f136fabaa 97 COOS_task_delay[task_No] = 0; // run
akouz 2:360f136fabaa 98 }
akouz 2:360f136fabaa 99 }
akouz 2:360f136fabaa 100 // ======================================================
akouz 2:360f136fabaa 101 // Timer
akouz 2:360f136fabaa 102 // ======================================================
akouz 2:360f136fabaa 103 void tick_1ms() {
akouz 3:85a9253b7559 104 int i;
akouz 3:85a9253b7559 105 for (i=0; i<MAX_TASKS; i++){
akouz 3:85a9253b7559 106 if (COOS_task_delay[i] > 0){ // if task not stopped
akouz 3:85a9253b7559 107 COOS_task_delay[i]--; // decrement its delay
akouz 3:85a9253b7559 108 }
akouz 3:85a9253b7559 109 } // for
akouz 2:360f136fabaa 110 }
akouz 2:360f136fabaa 111
akouz 2:360f136fabaa 112 // ======================================================
akouz 2:360f136fabaa 113 // Main
akouz 2:360f136fabaa 114 // ======================================================
akouz 2:360f136fabaa 115 int main(void) {
akouz 3:85a9253b7559 116 int sjres;
akouz 2:360f136fabaa 117 // -----------------------
akouz 3:85a9253b7559 118 // Init 1 ms tick
akouz 2:360f136fabaa 119 // -----------------------
akouz 2:360f136fabaa 120 flipper.attach(&tick_1ms, 0.001);
akouz 2:360f136fabaa 121
akouz 2:360f136fabaa 122 // -----------------------
akouz 2:360f136fabaa 123 // Init tasks
akouz 2:360f136fabaa 124 // -----------------------
akouz 2:360f136fabaa 125 for (COOS_task_no=0; COOS_task_no<MAX_TASKS; COOS_task_no++) {
akouz 2:360f136fabaa 126 sjres = setjmp(COOS_main_context);
akouz 2:360f136fabaa 127 if (sjres == 0) {
akouz 2:360f136fabaa 128 switch (COOS_task_no & 0x07) {
akouz 2:360f136fabaa 129 case 0 : COOS_task0(); break;
akouz 2:360f136fabaa 130 case 1 : COOS_task1(); break;
akouz 2:360f136fabaa 131 case 2 : COOS_task2(); break;
akouz 2:360f136fabaa 132 case 3 : COOS_task3(); break;
akouz 2:360f136fabaa 133 case 4 : COOS_task4(); break;
akouz 2:360f136fabaa 134 case 5 : COOS_task5(); break;
akouz 2:360f136fabaa 135 case 6 : COOS_task6(); break;
akouz 2:360f136fabaa 136 case 7 : COOS_task7(); break;
akouz 2:360f136fabaa 137 } // switch
akouz 2:360f136fabaa 138 } else {
akouz 2:360f136fabaa 139 COOS_task_delay[COOS_task_no] = --sjres;
akouz 2:360f136fabaa 140 }
akouz 2:360f136fabaa 141 } // for
akouz 2:360f136fabaa 142 // -----------------------
akouz 2:360f136fabaa 143 // Scheduler loop
akouz 2:360f136fabaa 144 // -----------------------
akouz 2:360f136fabaa 145 COOS_task_no = 0;
akouz 2:360f136fabaa 146 while(1) {
akouz 2:360f136fabaa 147 if (COOS_task_delay[COOS_task_no] == 0) { /* if task is active */
akouz 2:360f136fabaa 148 sjres = setjmp(COOS_main_context); /* set return point and get delay value from the task */
akouz 2:360f136fabaa 149 if (sjres == 0){ /* after setting return point */
akouz 2:360f136fabaa 150 longjmp(COOS_task_context[COOS_task_no], 1); /* invoke task */
akouz 2:360f136fabaa 151 } else { /* after returning from task */
akouz 3:85a9253b7559 152 COOS_task_delay[COOS_task_no] = --sjres; /* set task delay (if negative delay - then task stopped) */
akouz 2:360f136fabaa 153 }
akouz 2:360f136fabaa 154 }
akouz 2:360f136fabaa 155 COOS_task_no++;
akouz 2:360f136fabaa 156 if (COOS_task_no >= MAX_TASKS){
akouz 2:360f136fabaa 157 COOS_task_no = 0;
akouz 2:360f136fabaa 158 }
akouz 2:360f136fabaa 159 } // while
akouz 2:360f136fabaa 160 } // main
akouz 2:360f136fabaa 161
akouz 2:360f136fabaa 162 /* EOF */