00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00038
00039 #include "femtoos_code.h"
00040
00041 #define taskMutexRelease(Slot) taskSyncRelease(Slot)
00042
00043
00044
00045
00046 void appBoot(void)
00047 { devLedDRR = 0xFF;
00048 devLedPORT = 0xFF;
00049 devSwitchDRR = 0x00; }
00050
00051
00052
00053 #define setLed(lednr,state) if (state) { devLedPORT |= (1 << lednr); } else { devLedPORT &= ~(1 << lednr); }
00054
00055 #if (defSysOptimized == cfgTrue)
00056
00057
00058 static void HandOver(Tuint08 uiLed) __attribute__ ( ( naked, noreturn, always_inline ) );
00059 #else
00060 static void HandOver(Tuint08 uiLed) __attribute__ ( ( naked, noreturn ) );
00061 #endif
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 #if (cfgUseSynchronization == cfgSyncSingleBlock)
00077
00078 #define taskMutexRequest(Slot,TicksToWait) taskSyncRequest(Slot,0,TicksToWait)
00079
00080 static void HandOver(Tuint08 uiLed)
00081 { while (true)
00082 { Tuint08 uiSource = (uiLed & 0x07);
00083 Tuint08 uiTarget = ((uiLed+1) & 0x07);
00084 if (taskMutexRequest(uiSource+1,defLockDoNotBlock))
00085 { if (taskMutexRequest(uiTarget+1,defLockDoNotBlock))
00086 { taskMutexRequest(9,defLockBlockInfinite);
00087 Tuint08 uiBit = (devLedPORT >> uiSource) & 0x01;
00088 setLed(uiTarget,uiBit)
00089 taskMutexRelease(9);
00090 taskMutexRelease(uiTarget+1); }
00091 taskMutexRelease(uiSource+1); }
00092 taskDelayFromNow(300+(uiLed << 3)); } }
00093
00094 #elif (cfgUseSynchronization == cfgSyncDoubleBlock)
00095
00096 #define taskMutexRequest(Slot,TicksToWait) taskSyncRequest(Slot,0,0,TicksToWait)
00097
00098 static void HandOver(Tuint08 uiLed)
00099 { while (true)
00100 { Tuint08 uiSource = (uiLed & 0x07);
00101 Tuint08 uiTarget = ((uiLed+1) & 0x07);
00102 Tuint08 uiDoubleSlot = (((uiSource+1)<<4) | (uiTarget+1));
00103 if (taskMutexRequest(uiDoubleSlot,defLockDoNotBlock))
00104 { taskMutexRequest(9,defLockBlockInfinite);
00105 Tuint08 uiBit = (devLedPORT >> uiSource) & 0x01;
00106 setLed(uiTarget,uiBit)
00107 taskMutexRelease(9);
00108 taskMutexRelease(uiDoubleSlot); }
00109 taskDelayFromNow(300+(uiLed << 3)); } }
00110
00111 #else
00112 #error this is not possible
00113 #endif
00114
00115
00116
00117 #if (preTaskDefined(LEDtask0))
00118 void appLoop_LEDtask0(void) { HandOver(0); }
00119 #endif
00120
00121 #if (preTaskDefined(LEDtask1))
00122 void appLoop_LEDtask1(void) { HandOver(1); }
00123 #endif
00124
00125 #if (preTaskDefined(LEDtask2))
00126 void appLoop_LEDtask2(void) { HandOver(2); }
00127 #endif
00128
00129 #if (preTaskDefined(LEDtask3))
00130 void appLoop_LEDtask3(void) { HandOver(3); }
00131 #endif
00132
00133 #if (preTaskDefined(LEDtask4))
00134 void appLoop_LEDtask4(void) { HandOver(4); }
00135 #endif
00136
00137 #if (preTaskDefined(LEDtask5))
00138 void appLoop_LEDtask5(void) { HandOver(5); }
00139 #endif
00140
00141 #if (preTaskDefined(LEDtask6))
00142 void appLoop_LEDtask6(void) { HandOver(6); }
00143 #endif
00144
00145 #if (preTaskDefined(LEDtask7))
00146 void appLoop_LEDtask7(void) { HandOver(7); }
00147 #endif
00148
00149
00150
00151
00152
00153
00154
00155 #if (preTaskDefined(Reset))
00156
00157 void appLoop_Reset(void)
00158 { Tuint08 button = devSwitchPIN & 01;
00159 Tuint08 lastbutton = button;
00160 while (true)
00161 { button = devSwitchPIN & 01;
00162 if (button != lastbutton)
00163 { taskMutexRequest(9,defLockBlockInfinite);
00164 devLedPORT = 0xFE;
00165 taskMutexRelease(9);
00166 }
00167 taskDelayFromNow(100); } }
00168
00169 #endif
00170
00171
00172
00173
00174
00175
00176 #if (preTaskDefined(AutoStart))
00177
00178 void appLoop_AutoStart(void)
00179 { while(true)
00180 { taskMutexRequest(9,defLockBlockInfinite);
00181 Tuint08 uiLeds = devLedPORT;
00182 if ((uiLeds == 0x00) || (uiLeds == 0xFF)) { devLedPORT ^= 0x01; }
00183 taskMutexRelease(9);
00184 taskDelayFromNow(30000); } }
00185
00186 #endif