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
00026
00027
00041 #include <stdlib.h>
00042 #include <avr/interrupt.h>
00043
00044 #include "otos_cfg.h"
00045 #include "otos_def.h"
00046 #include "types.h"
00047 #include "event.h"
00048 #include "time.h"
00049
00050
00051
00066 void otosSendEvent(OtosTask* pTask, uint16_t events)
00067 {
00068 OtosTask* pTmp;
00069 OtosTask* pNextTask;
00070 uint8_t dispatch;
00071
00072
00073 dispatch = ISR_NOT_ACTIVE();
00074 cli();
00075
00076 if (pTask != NULL)
00077 {
00078 otosSendEventToOneTask(pTask, events);
00079 }
00080 else
00081 {
00082 otosSendEventToOneTask(g_pRunningTask, events);
00083
00084 pTmp = g_pReadyQueue;
00085 while (pTmp != NULL)
00086 {
00087 otosSendEventToOneTask(pTmp, events);
00088 pTmp = pTmp->pNext;
00089 }
00090
00091 pTmp = g_pBlockedQueue;
00092 while (pTmp != NULL)
00093 {
00094 pNextTask = pTmp->pNext;
00095 otosSendEventToOneTask(pTmp, events);
00096 pTmp = pNextTask;
00097 }
00098 }
00099
00100 if (dispatch)
00101 otosScheduler(SCHED_NORM);
00102 else
00103 g_performDispatch = TRUE;
00104 }
00105
00106
00122 void otosSendEventToOneTask(OtosTask* pTask, uint16_t events)
00123 {
00124 pTask->events |= events;
00125
00126
00127 if (pTask->state == TASK_BLOCKED)
00128 {
00129
00130 if (pTask->waitEvents)
00131 {
00132
00133 if ((pTask->waitEvents & pTask->events) == pTask->waitEvents)
00134 {
00135 pTask->events -= pTask->waitEvents;
00136 pTask->waitEvents = 0;
00137 pTask->sleepTicks = 0;
00138 otosWakeup(pTask);
00139 }
00140 }
00141 }
00142 }
00143
00170 uint8_t otosReceiveEvent(uint16_t events, uint32_t timeout)
00171 {
00172
00173 cli();
00174
00175
00176 if ((events & g_pRunningTask->events) == events)
00177 {
00178 g_pRunningTask->events -= events;
00179 sei();
00180 return EVENT_SUCCESS;
00181 }
00182
00183 if (timeout == 0)
00184 {
00185 sei();
00186 return EVENT_NOT_RECEIVED;
00187 }
00188 else
00189 {
00190 g_pRunningTask->waitEvents = events;
00191 g_pRunningTask->sleepTicks = (timeout == INFINITE) ? 0 : timeout;
00192 otosBlock();
00193 cli();
00194 if (g_pRunningTask->waitEvents)
00195 {
00196 g_pRunningTask->waitEvents = 0;
00197 sei();
00198 return EVENT_TIMEOUT;
00199 }
00200 else
00201 {
00202 sei();
00203 return EVENT_SUCCESS;
00204 }
00205 }
00206 }
00207
00208