【问题标题】:Time of day clock.时间时钟。
【发布时间】:2016-03-14 02:56:20
【问题描述】:

问题:假设您有一个工作频率为 100 kHz 的时钟芯片,也就是说,时钟每 10 微秒滴答一次并从计数器中减一。当计数器达到零时,就会发生中断。假设计数器为 16 位,您可以将其加载为 0 到 65535 之间的任何值。您将如何实现分辨率为 1 秒的时钟。

我的理解: 您不能将 100,000 存储在 16 位计数器中,但您可以存储 50,000,那么您是否必须使用某种标志并且每隔一次才执行中断?

但是,我不确定如何去实现它。任何形式的伪代码或一般解释将不胜感激。

【问题讨论】:

    标签: time operating-system clock


    【解决方案1】:

    由于您无法在硬件中获得所需的范围,因此您需要使用某种软件计数器来扩展硬件计数器(例如,每次硬件计数器上升时,增加软件计数器)。在您的情况下,您只需要一个整数值来跟踪您是否看到了硬件滴答声。如果您想将其用于某种调度策略,您可以执行以下操作:

    static int counter; /* initilized to 0 somewhere */
    
    void trap_handler(int trap_num)
    {
        switch(trap_num)
        {
            ...
            case TP_TIMER:
                if(counter == 0)
                    counter++;
                else if(counter == 1)
                {
                    /* Action here (flush cache/yield/...)*/
                    fs_cache_flush();   
                    counter = 0;
                } else {
                    /* Impossible case */
                    panic("Counter value bad\n");
                }
                break;
             ...
             default:
                 panic("Unknown trap: 0x%x\n", trap_num)
                 break;
        }
    
        ...
    }
    

    如果您想要其他语言的示例代码,请告诉我,我可以更改它。我假设您使用的是 C,因为您使用 OS 标记了您的问题。将计数器保留在每个进程的基础上也很有意义(如果您的操作系统支持进程)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多