]> Zhao Yanbai Git Server - kernel.git/commitdiff
观察ticks减为负数的情况
authoracevest <zhaoyanbai@126.com>
Sat, 11 May 2024 01:40:36 +0000 (09:40 +0800)
committeracevest <zhaoyanbai@126.com>
Sat, 11 May 2024 01:40:36 +0000 (09:40 +0800)
kernel/clock.c
kernel/irq.c
kernel/sched.c

index 6c7ac6316781e4d5a34211b10493d123e4ba2efa..f9925577d57fd1ed326248a4dcb151176ffce464 100644 (file)
@@ -25,6 +25,9 @@ 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);
@@ -40,11 +43,23 @@ void clk_handler(unsigned int irq, pt_regs_t *regs, void *dev_id) {
     // 同时其下半部分处理时间过长,直到这个时钟中断还没处理完
     // 那么这个时钟中断是完全可以打断它,且在这里把这个ticks从0减到负数
     // 而这个是uint32_t型,因此会溢出成0xFFFFFFFF
-    if (current->ticks > 0) {
-        current->ticks--;
+    // if (current->ticks > 0) {
+    //     current->ticks--;
+    // }
+    if (0 == --current->ticks) {
+        current->need_resched = 1;
+    }
+
+    int value = (int)(current->ticks);
+
+    if (min_ticks_value > value) {
+        min_ticks_value = value;
+        min_ticks_name = current->name;
     }
 
-    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 <= TASK_MAX_PRIORITY);  // 防止ticks被减到0后再减溢出
 
     add_irq_bh_handler(clk_bh_handler, NULL);
 }
index b6f6a5b45b1378d27c60cee74ec845b5969c213e..b25f38244628bab97f982524f3b20940eb4edf8e 100644 (file)
@@ -136,7 +136,7 @@ __attribute__((regparm(1))) void irq_handler(pt_regs_t *regs) {
     reenter--;
 
     // 考察如果不需要调度程序,直接退出
-    if (current->ticks != 0) {
+    if (current->need_resched == 0) {
         return;
     }
 
index b2af86ea03c226e089b4de843823b7cea231804c..cc0d6d0792826006303a3ede9093e56748c5c7f1 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 <= TASK_MAX_PRIORITY);
     assert(current->priority <= TASK_MAX_PRIORITY);
 
     unsigned long iflags;
@@ -235,6 +235,8 @@ void schedule() {
 
     next->state = TASK_RUNNING;
     next->reason = "";
+    next->ticks = 5;
+    prev->need_resched = 0;
 
     if (prev != next) {
         next->sched_cnt++;