Time 一天中的时间时钟。

Time 一天中的时间时钟。,time,operating-system,clock,Time,Operating System,Clock,问题:假设你有一个时钟芯片工作在100千赫,也就是说,每10微秒时钟将滴答作响,并从计数器中减去一个。当计数器达到零时,发生中断。假设计数器是16位,您可以用0到65535之间的任意值加载它。您将如何实现分辨率为1秒的时钟 我的理解是: 你不能在16位计数器中存储100000,但你可以存储50000,那么你是否必须使用某种标志,每隔一次只执行一次中断 但是,我不知道如何着手实施。任何形式的伪代码或一般性解释都将不胜感激 由于无法在硬件中获得所需的范围,因此需要使用某种软件计数器扩展硬件计数器(例

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

我的理解是: 你不能在16位计数器中存储100000,但你可以存储50000,那么你是否必须使用某种标志,每隔一次只执行一次中断


但是,我不知道如何着手实施。任何形式的伪代码或一般性解释都将不胜感激

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

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标记了你的问题。在每个进程的基础上保留计数器也是有意义的(如果您的操作系统支持进程)