summaryrefslogtreecommitdiffstats
path: root/Master/Real-Time Systems/Praktikum1/Aufgabe3/src/EDFScheduler.cpp
diff options
context:
space:
mode:
authorSven Eisenhauer <sven@sven-eisenhauer.net>2023-11-10 15:11:48 +0100
committerSven Eisenhauer <sven@sven-eisenhauer.net>2023-11-10 15:11:48 +0100
commit33613a85afc4b1481367fbe92a17ee59c240250b (patch)
tree670b842326116b376b505ec2263878912fca97e2 /Master/Real-Time Systems/Praktikum1/Aufgabe3/src/EDFScheduler.cpp
downloadStudium-master.tar.gz
Studium-master.tar.bz2
add new repoHEADmaster
Diffstat (limited to 'Master/Real-Time Systems/Praktikum1/Aufgabe3/src/EDFScheduler.cpp')
-rw-r--r--Master/Real-Time Systems/Praktikum1/Aufgabe3/src/EDFScheduler.cpp75
1 files changed, 75 insertions, 0 deletions
diff --git a/Master/Real-Time Systems/Praktikum1/Aufgabe3/src/EDFScheduler.cpp b/Master/Real-Time Systems/Praktikum1/Aufgabe3/src/EDFScheduler.cpp
new file mode 100644
index 0000000..2f3a5c2
--- /dev/null
+++ b/Master/Real-Time Systems/Praktikum1/Aufgabe3/src/EDFScheduler.cpp
@@ -0,0 +1,75 @@
+/*
+ * EDFScheduler.cpp
+ *
+ * Created on: 07.11.2010
+ * Author: sven
+ */
+
+#include "EDFScheduler.h"
+#include <iostream>
+EDFScheduler::EDFScheduler() {
+ // TODO Auto-generated constructor stub
+
+}
+
+EDFScheduler::~EDFScheduler() {
+ // TODO Auto-generated destructor stub
+}
+void EDFScheduler::run(task_set& tasks,int ci)
+{
+ cout << "EDF" << endl;
+ if(!test(tasks)) {
+ cout << "Taskset not schedulable!" << endl;
+ return;
+ }
+ for(unsigned int task_count = 0; task_count < tasks.size(); task_count++)
+ {
+ m_queue.push(&tasks[task_count]);
+ }
+ while (!m_queue.empty()) {
+ Task* t = m_queue.top();
+ t->dump();
+ m_queue.pop();
+ }
+ for(int step= 0; step < ci; step++)
+ {
+ cout << (step + 1) << " ";
+ edf_queue edfq;
+ for(unsigned int task_count = 0; task_count < tasks.size(); task_count++)
+ {
+ edfq.push(&tasks[task_count]);
+ }
+ bool scheduledAtask = false;
+ while (!edfq.empty()) {
+ Task* t = edfq.top();
+ if(!scheduledAtask && (t->getActC() > 0) ) {
+ t->execute();
+ scheduledAtask = true;
+ } else {
+ t->requeue();
+ }
+ edfq.pop();
+ }
+ if (!scheduledAtask) {
+ cout << "no task needs to run";
+ }
+ cout << endl;
+ }
+}
+bool EDFScheduler::test(task_set& taskset)
+{
+ bool res = false;
+ unsigned int sum = 0;
+ for(unsigned int i=0;i<taskset.size();i++)
+ {
+ Task &t = taskset[i];
+ sum += static_cast<double>(t.getOrigC()) / static_cast<double>(t.getOrigP());
+ if(t.getOrigC() > t.getOrigP()) {
+ return false;
+ }
+ }
+ if( sum <= 1.0) {
+ res = true;
+ }
+ return res;
+}