问题:假设您有一个工作频率为100 kHz的时钟芯片,也就是说,时钟每十十微秒就会打勾并从一个计数器中减去一个。当计数器达到零时,发生中断。假设计数器是16位,您可以使用0到65535之间的任何值加载它。您将如何实现分辨率为1秒的时钟。
我的理解: 你不能在16位计数器中存储100,000,但你可以存储50,000,那么你是否可以使用某种标志并且每隔一段时间只执行一次中断?
但是,我不确定如何实施。任何形式的伪代码或一般解释都将是最受欢迎的。
答案 0 :(得分: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,因为您使用操作系统标记了您的问题。在每个进程的基础上保持计数器也是有意义的(如果您的操作系统支持进程)。