首页 > 解决方案 > 如果计数值大于它可以容纳的值,CPU 计时器如何工作?

问题描述

如果我没记错的话,Csleep函数是使用 CPU 定时器的地方之一。Linux 将设置一个计时器并从scheduler. 定时器计数down,一旦它命中0它将中断 CPU,操作系统将重新添加进程到调度程序。我对此是否正确?

如果是这样,那么如果定时器值大于计数器硬件可以处理的位数会发生什么?假设计数器有一个最大23位,我需要一个24位值(即我需要sleep很长时间)。

编辑:

另外,如果我们同时进行多个睡眠,超过 CPU 的计数器,该怎么办?

标签: clinuxtimercpu-architecture

解决方案


睡眠功能是使用 CPU 定时器的地方之一

不,Linux 内核实现了一个调度器。当您调用nanosleep()(Linux 上的 GNU C 库nanosleep()用于实现sleep())时,您执行 nanosleep syscall;这会导致内核在所需的持续时间过去之前不调度该任务(通常是用户空间进程中的线程),或者使用该任务将信号传递给安装的用户空间信号处理程序而没有 SA_RESTART 标志(在这种情况下,系统调用返回-EINTR)。

不过,在微控制器上,比如 Arduino 或类似设备,您可以使用计时器实现睡眠。

假设您有一个计时器工具,它可以从任何地方计数TIMER_MAX到零,即休眠 1 到 之间的任意数量的时间单位TIMER_MAX。如果你想睡更长的时间,你可以TIMER_MAX间隔地这样做:

/* Timer-based sleep function; returns the number of units slept,
   at most 'units'.  Can only sleep between 1 and TIMER_MAX, inclusive. */
static unsigned short  timer_sleep(unsigned short units);

void sleep(unsigned long duration)
{
    /* "long" sleep(s) */
    while (duration >= TIMER_MAX)
        duration -= timer_sleep(TIMER_MAX);

    /* "short" sleep(s) */
    while (duration > 0)
        duration -= timer_sleep(duration);
}

timer_sleep(duration)如果timer_sleep(u)总是返回,您可以只用一个替换后者的 while 循环u。如上所写,使用两个while循环,只要timer_sleep(u)returnu或更少,sleep就会工作。


推荐阅读