adding in ecen425 RTOS final lab
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
#include "yakk.h"
|
||||
#include "clib.h"
|
||||
#include "PriorityQueue.h"
|
||||
|
||||
extern PriorityQueue readyQueue;
|
||||
|
||||
YKSEM* YKSemCreate(int initialValue) {
|
||||
YKSEM* newSemaphore;
|
||||
|
||||
newSemaphore = getNewSem();
|
||||
if (newSemaphore == null) exit(NEW_SEM_FAILED);
|
||||
|
||||
initializePriorityQueue(&(newSemaphore->queue));
|
||||
newSemaphore->value = initialValue;
|
||||
|
||||
return newSemaphore;
|
||||
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user