kernel/clock.c

本文详细介绍了如何初始化时钟中断,实现精确到毫秒级别的延迟,并通过时钟中断来触发进程调度的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Code:
  1. /*  
  2.     By Marcus Xing  
  3.     kernel/clock.c  
  4.     时钟中断调用的函数  
  5. */  
  6.   
  7. #include "type.h"   
  8. #include "const.h"   
  9. #include "ipc.h"   
  10. #include "protect.h"   
  11. #include "proc.h"   
  12. #include "console.h"   
  13. #include "tty.h"   
  14. #include "global.h"   
  15. #include "proto.h"   
  16.   
  17. /*--------------------------------------------------------------------Init_Clock  
  18.     有关时钟中断的初始化  
  19. */  
  20. void Init_Clock()   
  21. {   
  22.     /* 时钟中断的处理函数的填充 */  
  23.     IRQ_Handler_Table[0] = Clock_Handler;   
  24.     /* 激活时钟中断 */  
  25.     Enable_IRQ(0);   
  26. }   
  27.   
  28. /*-----------------------------------------------------------------Clock_Handler  
  29.     时钟中断处理程序  
  30. */  
  31. void Clock_Handler(int int_vec_no)   
  32. {   
  33.     d_Ticks++;              /* 每发生时钟中断d_Ticks就自增1次 */  
  34.     p_Next_PCB->ticks--;    /* 当前进程的ticks值自减1 */  
  35.   
  36.     /* 如果重入,直接退出 */  
  37.     if(d_Flag_Reenter != 0)   
  38.     {   
  39.         return;        
  40.     }    
  41.        
  42.     /* 如果当前进程的ticks没用完,则不调度 */  
  43.     if(p_Next_PCB->ticks > 0)   
  44.     {   
  45.         return;   
  46.     }   
  47.        
  48.     /* 进程调度 */  
  49.     Schedule();   
  50. }   
  51.   
  52. /*-------------------------------------------------------------------Milli_Delay  
  53.     精确到10ms的延迟函数  
  54. */  
  55. void Milli_Delay(int delay_time_by_milli)   
  56. {   
  57.     int old_ticks = Get_Ticks();        /* 得到当前的Ticks */  
  58.     /* 当前ticks减到老的ticks的时间差小于形参的话,空循环下去 */  
  59.     /* 每隔10ms,Ticks值增1,100个ticks就是1s */  
  60.     while((Get_Ticks() - old_ticks) * 10 < delay_time_by_milli)   
  61.     {   
  62.            
  63.     }   
  64. }   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值