]> Zhao Yanbai Git Server - kernel.git/commitdiff
重写delay系统调用;添加测试任务
authoracevest <zhaoyanbai@126.com>
Sat, 20 May 2023 16:44:37 +0000 (00:44 +0800)
committeracevest <zhaoyanbai@126.com>
Sat, 20 May 2023 16:44:43 +0000 (00:44 +0800)
include/sched.h
kernel/clock.c
kernel/sched.c
kernel/syscall.c
kernel/task_root.c
kernel/wait.c

index 6be62034d5e3fbc05a4a7f118bf95bf23cde32ea..c0197dc93e3c8b4965d998519bb7b7885647a2b2 100644 (file)
@@ -32,7 +32,6 @@ extern task_union root_task;
 extern void load_cr3(task_union *tsk);
 
 extern list_head_t all_tasks;
-extern list_head_t delay_tasks;
 
 #define set_current_state(st)  \
     do {                       \
index bca611d4cafe64b4b152ea1db86b97512f875f19..a759d3ab4742bd95eb642c9651793a826cd579be 100644 (file)
@@ -13,8 +13,9 @@
 #include <printk.h>
 #include <sched.h>
 #include <system.h>
+#include <wait.h>
 
-static unsigned int jiffies = 0;
+volatile unsigned int jiffies = 0;
 
 unsigned int sys_clock() { return jiffies; }
 
@@ -25,19 +26,19 @@ void clk_handler(unsigned int irq, pt_regs_t *regs, void *dev_id) {
         printl(MPL_CLOCK, "clock irq: %d", jiffies);
     }
 
-    // unsigned long iflags;
-    // irq_save(iflags);
+    unsigned long iflags;
+    irq_save(iflags);
 
     task_union *p = 0;
-    task_union *t = 0;
-    list_for_each_entry_safe(p, t, &delay_tasks, pend) {
-        p->delay_cnt -= p->delay_cnt == 0 ? 0 : 1;
-
-        if (0 == p->delay_cnt) {
+    list_head_t *t = 0;
+    list_head_t *pos = 0;
+    list_for_each_safe(pos, t, &all_tasks) {
+        p = list_entry(pos, task_union, list);
+        if (0 != p->delay_cnt && jiffies > p->delay_cnt && p->state == TASK_WAIT) {
+            p->delay_cnt = 0;
             p->state = TASK_READY;
-            list_del(&p->pend);
         }
     }
 
-    // irq_restore(iflags);
+    irq_restore(iflags);
 }
index 54c267e3fa2874d91734d7cd8f73bd1536644f7c..9a7e214132ba897d84304e07e9209179de362550 100644 (file)
@@ -168,14 +168,36 @@ unsigned long schedule() {
     // printl(MPL_ROOT, "root:%d [%08x] cnt %u", root_task.pid, &root_task, root_task.cnt);
 
 #if 1
+    bool need_reset_weight = true;
     list_for_each_safe(pos, t, &all_tasks) {
         p = list_entry(pos, task_union, list);
         if (p->state != TASK_READY) {
             continue;
         }
 
-        if (p->weight >= p->priority) {
+        if (p->weight < p->priority) {
+            need_reset_weight = false;
+            break;
+        }
+    }
+
+    if (need_reset_weight) {
+        list_for_each_safe(pos, t, &all_tasks) {
+            p = list_entry(pos, task_union, list);
+            if (p->state != TASK_READY) {
+                continue;
+            }
             p->weight = 0;
+        }
+    }
+
+    list_for_each_safe(pos, t, &all_tasks) {
+        p = list_entry(pos, task_union, list);
+        if (p->state != TASK_READY) {
+            continue;
+        }
+
+        if (p->weight > p->priority) {
             continue;
         }
 
@@ -236,8 +258,8 @@ unsigned long schedule() {
         list_for_each_safe(pos, t, &all_tasks) {
             p = list_entry(pos, task_union, list);
             printl(MPL_TASK_0 + p->pid, " ");  // 清掉上一次显示的 '>'
-            printl(MPL_TASK_0 + p->pid, "%s%4s:%d [%08x] state %s weight %03d sched %u", next == p ? ">" : " ", p->name,
-                   p->pid, p, task_state(p->state), p->weight, p->sched_cnt);
+            printl(MPL_TASK_0 + p->pid, "%s%4s:%d [%08x] state %s weight %03d %03d sched %u", next == p ? ">" : " ",
+                   p->name, p->pid, p, task_state(p->state), p->weight, p->priority, p->sched_cnt);
         }
         context_switch(prev, next);
     }
index c837488586a76e3e7b04ad3da1a11ba820e1bfc8..7749781ccb058737268bfc1e283d32aa3dcdd691 100644 (file)
@@ -44,6 +44,7 @@ int sysc_none() {
 int sysc_pause(unsigned long tick) { return 0; }
 
 int sysc_test() {
+#if 0
     static unsigned int cnt = 0;
 
     {  // 这一段仅是测试代码
@@ -74,6 +75,7 @@ int sysc_test() {
     //        cnt++, current, cnt);
     // printk("systest cnt %u current %08x cnt %u\n",cnt++, current, cnt);
     return 0;
+#endif
 }
 
 int sysc_debug(unsigned int v) {
index 62736a175edafb291c6e8a3aea1528f9b2f7574d..967413838b3de0349a41f2f49af23ba3211e2a6d 100644 (file)
@@ -47,6 +47,42 @@ void kernel_task(char *name, void *entry) {
     printk("kernel[%s] task pid is %d\n", name, pid);
 }
 
+void taskA_entry() {
+    current->priority = 99;
+
+    while (1) {
+        sysc_wait(600);
+
+        for (int i = 0; i < 200; i++) {
+            asm("hlt;");
+        }
+    }
+}
+
+void taskB_entry() {
+    current->priority = 99;
+
+    while (1) {
+        sysc_wait(200);
+
+        for (int i = 0; i < 100; i++) {
+            asm("hlt;");
+        }
+    }
+}
+
+void taskC_entry() {
+    current->priority = 99;
+
+    while (1) {
+        sysc_wait(2);
+
+        for (int i = 0; i < 2; i++) {
+            asm("hlt;");
+        }
+    }
+}
+
 // 从multiboot.S进入这里
 void root_task_entry() {
     sti();
@@ -65,6 +101,10 @@ void root_task_entry() {
     kernel_task("disk", disk_task_entry);
     kernel_task("user", user_task_entry);
 
+    kernel_task("tskA", taskA_entry);
+    kernel_task("tskB", taskB_entry);
+    kernel_task("tskC", taskC_entry);
+
     while (1) {
         asm("hlt;");
     }
index a89f2f2667f3ee45f17b5331c816afb13cf16a20..e3d2df59097ddfbdff8a4381a85d52e1322ce7b9 100644 (file)
@@ -121,12 +121,30 @@ int debug_wait_queue_put(unsigned int v) {
     wake_up(&debug_wq);
 }
 
+DECLARE_WAIT_QUEUE_HEAD(sysc_wait_queue_head);
+
+#if 1
+extern unsigned int jiffies;
+int sysc_wait(unsigned long cnt) {
+    unsigned long flags;
+    irq_save(flags);
+    current->state = TASK_WAIT;
+    current->delay_cnt = jiffies + cnt;
+    irq_restore(flags);
+
+    schedule();
+}
+#else
 int sysc_wait(unsigned long pid) {
     task_union *p = find_task(pid);
 
-    if (p == 0) return 0;
+    if (p == 0) {
+        return 0;
+    }
 
-    if (p->state == TASK_EXITING) return 0;
+    if (p->state == TASK_EXITING) {
+        return 0;
+    }
 
     task_union *task = current;
     DECLARE_WAIT_QUEUE(wait, task);
@@ -151,3 +169,4 @@ int sysc_wait(unsigned long pid) {
 
     return 0;
 }
+#endif