void* YKQPend(YKQ* queue) { void* message; int i; TCB* runningTask; if (queue == null) return null; YKEnterMutex(); if (*queue->messages == null) { runningTask = removePriorityQueue(&readyQueue); runningTask->state = T_BLOCKED; insertPriorityQueue((&(queue->queue)), runningTask); YKExitMutex(); asm("int 0x20"); } message = queue->messages[0]; for (i = 0; i < queue->currentSize-1; i++) { queue->messages[i] = queue->messages[i+1]; } queue->currentSize--; queue->messages[queue->currentSize] = null; YKExitMutex(); return message; }
int YKQPost(YKQ* queue, void* msg) { TCB* readyTask; int retVal; YKEnterMutex(); if (queue->currentSize < queue->maxSize) { queue->messages[queue->currentSize] = msg; queue->currentSize++; retVal = 1; } else { retVal = 1; } readyTask = removePriorityQueue(&(queue->queue)); if (readyTask == null) { YKExitMutex(); return retVal; } else { readyTask->state = T_READY; insertPriorityQueue(&readyQueue, readyTask); YKExitMutex(); if (YKGetISRCallDepth() == 0) { asm("int 0x20"); } } return retVal; }
void YKDelayTask(unsigned int count) { TCB* delayedTask; if (count == 0) return; delayedTask = removePriorityQueue(&readyQueue); delayedTask->state = T_BLOCKED; delayedTask->delayCount = count; insertDelayQueue(delayedTask); asm("int 0x20"); return; }
void YKSemPost(YKSEM* semaphore) { TCB* readyTask; YKEnterMutex(); semaphore->value++; readyTask = removePriorityQueue(&(semaphore->queue)); if (readyTask == null) { YKExitMutex(); return; } readyTask->state = T_READY; insertPriorityQueue(&readyQueue, readyTask); YKExitMutex(); if (YKGetISRCallDepth() == 0) { asm("int 0x20"); } return; }
void YKSemPend(YKSEM* semaphore) { TCB* runningTask; YKEnterMutex(); if (semaphore->value < 1) { semaphore->value--; runningTask = removePriorityQueue(&readyQueue); runningTask->state = T_BLOCKED; insertPriorityQueue((&(semaphore->queue)), runningTask); YKExitMutex(); asm("int 0x20"); return; } else { semaphore->value--; YKExitMutex(); return; } }