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.
Diff: main.cpp
- Revision:
- 2:360f136fabaa
- Parent:
- 0:fb6bbc10ffa0
- Child:
- 3:85a9253b7559
diff -r 03c191369089 -r 360f136fabaa main.cpp
--- 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