]> Zhao Yanbai Git Server - kernel.git/commitdiff
task_t.ticks从uint32调整为int dev/202405/task_ticks
authoracevest <zhaoyanbai@126.com>
Sat, 11 May 2024 04:51:04 +0000 (12:51 +0800)
committeracevest <zhaoyanbai@126.com>
Sat, 11 May 2024 04:51:04 +0000 (12:51 +0800)
include/task.h
kernel/clock.c
kernel/sched.c
kernel/syscall.c
kernel/task_init.c
kernel/task_root.c

index d47538ed56e3490793eff7620491c76179cb8a04..30f96de57c76938953533eee6cfbcef0ae2a4ea4 100644 (file)
@@ -48,7 +48,7 @@ typedef union task_union {
         uint32_t esp;
         uint32_t eip;
 
-        uint32_t ticks;
+        int ticks;
         uint32_t turn;  // 时间片用完次数
         uint32_t priority;
         uint64_t jiffies;
index 5110a43380d3dab32a8f6a36bc667831a24e77de..e78622f606192fe8746870449f5b7286a354fcfb 100644 (file)
@@ -25,9 +25,6 @@ void debug_print_all_tasks();
 void dump_irq_nr_stack();
 void clk_bh_handler(void *arg);
 
-const char *min_ticks_name = 0;
-int min_ticks_value = 100;
-
 void clk_handler(unsigned int irq, pt_regs_t *regs, void *dev_id) {
     // if (jiffies % 100 == 0) {
     // printl(MPL_CLOCK, "clock irq: %d", jiffies);
@@ -43,7 +40,6 @@ void clk_handler(unsigned int irq, pt_regs_t *regs, void *dev_id) {
     // 而如果其下半部分需要处理的事情很多,处理时间过长,两个时钟中断之间的时间还不足以处理完
     // 那么下一个时钟中断是完全可以打断还没处理完的下半部逻辑
     // 打断后该时钟中断不应该继续减少该进程的时间片,因为这会造成该进程在后续的调底中少了实际的运行时间
-
     if (1 == current->need_resched) {
         // 这种情况必然已经发生了该时钟中断打断了下半部处理程序
         return;
@@ -51,24 +47,13 @@ void clk_handler(unsigned int irq, pt_regs_t *regs, void *dev_id) {
 
     current->ticks--;
 
-#if 1
-    int value = (int)(current->ticks);
-
-    if (min_ticks_value > value) {
-        min_ticks_value = value;
-        min_ticks_name = current->name;
-    }
-#endif
-
     if (0 == current->ticks) {
         current->need_resched = 1;
         current->ticks = current->priority;
         current->turn++;
     }
 
-    assert(current->ticks <= TASK_MAX_PRIORITY);  // 防止ticks被减到0后再减溢出
-
-    printl(MPL_TEST, "%20s %10d %20s %10d", min_ticks_name, min_ticks_value, current->name, value);
+    assert(current->ticks >= 0);  // 防止ticks被减到0后再减溢出
 
     add_irq_bh_handler(clk_bh_handler, NULL);
 }
index 471cd2a7f2b17e8224423095f06d1d27da4c6f29..86d9105bf53646f160dc432b81ddc55d04c61637 100644 (file)
@@ -182,7 +182,7 @@ void schedule() {
     task_t *p = 0;
     list_head_t *pos = 0, *t = 0;
 
-    // assert(current->ticks <= TASK_MAX_PRIORITY);
+    assert(current->ticks >= 0);
     assert(current->priority <= TASK_MAX_PRIORITY);
 
     unsigned long iflags;
index 9979ce1938ce3185bf5ac35ff46cc1356db4aeed..c1f5c010172b7aa8d0ef91be97d10fc685234e99 100644 (file)
@@ -43,20 +43,24 @@ int sysc_none() {
 
 extern uint64_t jiffies;
 
-// 特别说明:如果想把这个函数的参数ticks改为uint64_t
+// 特别说明:如果想把这个函数的参数ticks改为int64_t
 // 那么就需要在编写用户级的系统调用库函数的时候注意
 // 不仅需要填写 ebx,还要填写 ecx
 // 不然就可能出现诡异的一直WAIT,不会调度到该任务的问题
-int sysc_wait(uint32_t ticks) {
-    unsigned long flags;
-    irq_save(flags);
-    current->state = TASK_WAIT;
-    current->reason = "sysc_wait";
-    current->delay_jiffies = jiffies + ticks;
-    list_add(&current->pend, &delay_tasks);
-    irq_restore(flags);
-
+int sysc_wait(int ticks) {
+    if (ticks < 0) {
+        return -EINVAL;
+    } else {
+        unsigned long flags;
+        irq_save(flags);
+        current->state = TASK_WAIT;
+        current->reason = "sysc_wait";
+        current->delay_jiffies = jiffies + ticks;
+        list_add(&current->pend, &delay_tasks);
+        irq_restore(flags);
+    }
     schedule();
+    return 0;
 }
 
 int sysc_test() {}
index 30753e7ec6724d7eeeb8bd578154316f28472c96..7064470895bc2240f197a8f096fc2dd5ba3a2b5b 100644 (file)
@@ -9,7 +9,7 @@
 #include <syscall.h>
 #include <system.h>
 #include <types.h>
-int sysc_wait(uint32_t ticks);
+int sysc_wait(int ticks);
 void init_task_entry() {
     current->priority = 10;
 
index 9ea4224defb1dfd616e133d77a5118dc62052641..528f3a9ac2732a0f6b62e67a6754766a1df12b97 100644 (file)
@@ -22,7 +22,7 @@
 #include <types.h>
 
 int do_fork(pt_regs_t *regs, unsigned long flags);
-int sysc_wait(uint32_t ticks);
+int sysc_wait(int ticks);
 
 #define get_eflags(x) __asm__ __volatile__("pushfl; popl %0;" : "=g"(x)::"memory")