进入定时器中断函数后,定时器数据还在工作吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进入定时器中断函数后,定时器数据还在工作吗?相关的知识,希望对你有一定的参考价值。

我的意思是进入定时器中断服务函数后,定时器还在计数吗?还是退出后才开始计数?如果计数又满了,会怎么办?

进入定时器中断服务函数后,定时器还在计数。只要定时器一旦启动工作后,除非将定时器关闭,否则定时器一直都在跑。 参考技术A 继续计数,定时器是一种消息机制,就是过好久就产生一个消息(windows下叫消息,Unix下叫信号),就会中断的去处理函数。又满了再产生中断(如果原处理函数没处理完也中断,处理新的,新的处理完再接着处理原来的,一层层套)。 参考技术B 只要这个外部中断服务子程序里没有关闭定时器。它还会继续计数。至于是否中断,要看你的中断优先级的设定了

sleep() 函数完成后是不是会导致定时器中断?

【中文标题】sleep() 函数完成后是不是会导致定时器中断?【英文标题】:Does the sleep() function cause a timer interrupt upon completion?sleep() 函数完成后是否会导致定时器中断? 【发布时间】:2021-12-12 06:28:03 【问题描述】:

睡眠函数系列(sleep()、nanosleep())一旦完成(即完成睡眠)会导致定时器中断吗?如果没有,操作系统如何确切知道它们何时完成?如果是这样,我知道定时器具有高中断优先级。这是否意味着一旦唤醒使用 sleep() 的程序可能会导致在一个 CPU(在多处理器中)上运行的另一个程序被删除以支持最近唤醒的程序?

【问题讨论】:

这将完全是特定于实现的,但我会冒昧地说不,sleep() 不会导致计时器中断 - 那些像往常一样在后台发生而sleep() 函数可以做它的事情。事实上,很可能是这样的中断,直接或间接地导致所述调用返回。 【参考方案1】:

sleep() 函数在完成时会导致定时器中断吗?

也许吧。

为了跟踪时间延迟,有两种常见的实现方式:

a) 定时器 IRQ 以固定频率发生(例如,可能每 1 毫秒)。当 IRQ 发生时,操作系统会检查是否有任何时间延迟过期并处理它们。在这种情况下,精度和开销之间存在折衷(为了获得更好的精度,您需要增加“每秒 IRQ”,这会增加处理所有 IRQ 的开销)。

b) 操作系统重新配置计时器以在最短延迟应在必要时到期时生成 IRQ(当最快延迟被取消、创建更早延迟或最短延迟到期时)。这没有“精度与开销”的折衷,但重新配置计时器硬件的开销更大。这通常称为“tickless”(因为没有常规/固定频率的“tick”)。

请注意,现代 80x86 系统的每个 CPU 都有一个本地 APIC 计时器,支持“在 TSC 截止日期上的 IRQ”。对于“tickless”,这意味着您通常可以获得优于 1 纳秒的精度而无需太多锁(使用“per CPU”结构来跟踪时间延迟);并且重新配置定时器的成本非常小(因为定时器硬件直接内置在 CPU 本身中)。

对于“tickless”(这对于现代系统来说可能更好),当“sleep()”大部分时间到期时,您最终会得到一个计时器 IRQ(除非其他一些延迟在相同/相似的时间到期)。

这是否意味着一旦唤醒使用 sleep() 的程序可能会导致在一个 CPU(在多处理器中)上运行的另一个程序被删除以支持最近唤醒的程序?

最近解除阻塞的任务是否立即抢占取决于:

a) 调度程序设计。对于某些调度程序(例如幼稚的“循环”),它可能永远不会立即发生。

b) 未阻塞任务和当前运行任务的优先级。

c) 优化。任务切换需要开销,因此尽量减少任务切换的数量(例如,如果其他任务切换可能很快发生,则推迟/跳过任务切换)是可行的。还有涉及负载平衡、电源管理、缓存效率、内存(NUMA 等)和其他可能需要考虑的事情的复杂性。

【讨论】:

【参考方案2】:

Linux 手册页注释:

可移植性说明 在某些系统上,可以使用 alarm(2) 和 SIGALRM(POSIX.1 许可)来实现 sleep() 这);混合调用 alarm(2) 和 sleep() 是个坏主意。

【讨论】:

以上是关于进入定时器中断函数后,定时器数据还在工作吗?的主要内容,如果未能解决你的问题,请参考以下文章

谁学过51和ARM,这两个定时器计数器的中断处理函数的主要区别在哪里?特别是ARM,中断处理函数怎没理解?求

MSP430的I/O中断和看门狗定时器能同时使用吗?

STM32开发板的TIM3开启和关闭

STM32怎么用库函数使用滴答定时器?

STM32外部中断无法进入中断程序,请问下面的程序哪里不对呀???

定时器中断