adding in ecen425 RTOS final lab
This commit is contained in:
@@ -0,0 +1,141 @@
|
||||
#include "DelayQueue.h"
|
||||
#include "PriorityQueue.h"
|
||||
#include "yakk.h"
|
||||
#include "clib.h"
|
||||
|
||||
extern DelayQueue delayQueue;
|
||||
extern PriorityQueue readyQueue;
|
||||
|
||||
void initializeDelayQueue() {
|
||||
delayQueue.size = 0;
|
||||
delayQueue.head = null;
|
||||
}
|
||||
|
||||
void tickClock() {
|
||||
|
||||
TCB* current;
|
||||
TCB* temp;
|
||||
|
||||
//Size == 0
|
||||
YKEnterMutex();
|
||||
if (delayQueue.size == 0) {
|
||||
YKExitMutex();
|
||||
return;
|
||||
}
|
||||
|
||||
current = delayQueue.head;
|
||||
if (delayQueue.size == 1) {
|
||||
current->delayCount--;
|
||||
if (current->delayCount == 0) {
|
||||
delayQueue.head = null;
|
||||
delayQueue.size = 0;
|
||||
current->next = null;
|
||||
current->prev = null;
|
||||
current->state = T_READY;
|
||||
YKExitMutex();
|
||||
insertPriorityQueue(&readyQueue, current);
|
||||
//printString("\nAfter insert\n");
|
||||
return;
|
||||
}
|
||||
YKExitMutex();
|
||||
return;
|
||||
}
|
||||
|
||||
current->delayCount--;
|
||||
while (current != null) {
|
||||
current = delayQueue.head;
|
||||
if (current->delayCount == 0) {
|
||||
delayQueue.head = current->next;
|
||||
if (current->next != null) {
|
||||
current->next->prev = null;
|
||||
}
|
||||
current->next = null;
|
||||
current->prev = null;
|
||||
current->state = T_READY;
|
||||
temp = current;
|
||||
delayQueue.size--;
|
||||
insertPriorityQueue(&readyQueue, temp);
|
||||
current = delayQueue.head;
|
||||
} else {
|
||||
YKExitMutex();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void insertDelayQueue(TCB* tcb) {
|
||||
|
||||
TCB* current;
|
||||
unsigned int sumCount;
|
||||
unsigned int oldSumCount;
|
||||
|
||||
if (tcb == null) return;
|
||||
|
||||
//Size = 0
|
||||
YKEnterMutex();
|
||||
if (delayQueue.size == 0) {
|
||||
delayQueue.head = tcb;
|
||||
tcb->next = null;
|
||||
tcb->prev = null;
|
||||
delayQueue.size++;
|
||||
YKExitMutex();
|
||||
return;
|
||||
}
|
||||
|
||||
//Size > 0
|
||||
current = delayQueue.head;
|
||||
sumCount = 0;
|
||||
oldSumCount = 0;
|
||||
while (current != null) {
|
||||
sumCount += current->delayCount;
|
||||
if (tcb->delayCount < sumCount) {
|
||||
tcb->next = current;
|
||||
tcb->prev = current->prev;
|
||||
if (current == delayQueue.head) {
|
||||
delayQueue.head = tcb;
|
||||
} else {
|
||||
current->prev->next = tcb;
|
||||
}
|
||||
current->prev = tcb;
|
||||
delayQueue.size++;
|
||||
tcb->delayCount = tcb->delayCount - oldSumCount;
|
||||
current->delayCount = current->delayCount - tcb->delayCount;
|
||||
YKExitMutex();
|
||||
return;
|
||||
}
|
||||
if (current->next == null) {
|
||||
current->next = tcb;
|
||||
tcb->prev = current;
|
||||
tcb->next = null;
|
||||
delayQueue.size++;
|
||||
tcb->delayCount = tcb->delayCount - sumCount;
|
||||
YKExitMutex();
|
||||
return;
|
||||
}
|
||||
current = current->next;
|
||||
oldSumCount = sumCount;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void printDelayQueue(void) {
|
||||
|
||||
TCB* current;
|
||||
int i;
|
||||
|
||||
current = delayQueue.head;
|
||||
printString("Printing Delay Queue with size ");
|
||||
printInt(delayQueue.size);
|
||||
printNewLine();
|
||||
|
||||
while (current != null) {
|
||||
printInt(current->priority);
|
||||
printString(" ");
|
||||
printInt(current->delayCount);
|
||||
printNewLine();
|
||||
current = current->next;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user