/# date;cat /proc/interrupts; sleep 100;date;cat /proc/interrupts
;
Thu Jan 1 00:02:14 GMT 1970
CPU0
13: 820 sun3i_irq sunxi_timer
38: 0 sun3i_irq PIN_GRP
39: 0 sun3i_irq PIN_GRP
40: 0 sun3i_irq PIN_GRP
101: 6389 sun3i_irq 1c02000.dma-controller
103: 0 sun3i_irq cedar_dev
104: 659 sun3i_irq uart1
105: 16 sun3i_irq twi0
106: 27748 sun3i_irq spi0
107: 40 sun3i_irq sunxi-mmc
108: 5793 sun3i_irq lcd
109: 0 sun3i_irq dispaly
113: 0 sun3i_irq csi_irq
114: 43 sun3i_irq sunxi_usb_udc
115: 0 sun3i_irq sunxikbd
Err: 0
Thu Jan 1 00:03:54 GMT 1970
CPU0
13: 845 sun3i_irq sunxi_timer
38: 0 sun3i_irq PIN_GRP
39: 0 sun3i_irq PIN_GRP
40: 0 sun3i_irq PIN_GRP
101: 6389 sun3i_irq 1c02000.dma-controller
103: 0 sun3i_irq cedar_dev
104: 700 sun3i_irq uart1
105: 16 sun3i_irq twi0
106: 27748 sun3i_irq spi0
107: 40 sun3i_irq sunxi-mmc
108: 10149 sun3i_irq lcd
109: 0 sun3i_irq dispaly
113: 0 sun3i_irq csi_irq
114: 43 sun3i_irq sunxi_usb_udc
115: 0 sun3i_irq sunxikbd
Err: 0
13: 820 sun3i_irq sunxi_timer
13: 845 sun3i_irq sunxi_timer
845 - 820 = 25
离线
讲道理
CONFIG_HZ=100
一秒应该产生 100 次中断才对, 100秒应该是产生 1万次中断, 不知道为何是这个结果?
离线
tickless模式,有需要才中断
离线
#date;cat /proc/interrupts; sleep 100;date;cat /proc/interrupts
Thu Jan 1 00:00:51 UTC 1970
CPU0
16: 1424 sun4i_irq 13 Edge timer@1c20c00
17: 0 sun4i_irq 18 Edge 1c02000.dma-controller
18: 312 sun4i_irq 29 Edge 1c0c000.lcd-controller
19: 0 sun4i_irq 34 Edge cedar_dev
20: 1130 sun4i_irq 23 Edge sunxi-mmc
21: 1255 sun4i_irq 24 Edge sunxi-mmc
22: 1 sun4i_irq 26 Edge musb-hdrc.1.auto
28: 502 sun4i_irq 2 Edge ttyS0
29: 14 sun4i_irq 7 Edge mv64xxx_i2c
30: 0 sun4i_irq 32 Edge 1cb0000.csi
Err: 0
Thu Jan 1 00:02:31 UTC 1970
CPU0
16: 2916 sun4i_irq 13 Edge timer@1c20c00
17: 0 sun4i_irq 18 Edge 1c02000.dma-controller
18: 312 sun4i_irq 29 Edge 1c0c000.lcd-controller
19: 0 sun4i_irq 34 Edge cedar_dev
20: 3352 sun4i_irq 23 Edge sunxi-mmc
21: 1888 sun4i_irq 24 Edge sunxi-mmc
22: 1 sun4i_irq 26 Edge musb-hdrc.1.auto
28: 542 sun4i_irq 2 Edge ttyS0
29: 14 sun4i_irq 7 Edge mv64xxx_i2c
30: 0 sun4i_irq 32 Edge 1cb0000.csi
Err: 0
主线Linux产生了500个中断, 算下离 1万次也很远。
离线
tickless模式,有需要才中断
感谢大佬提醒, 我去狗一下
离线
#
# Timers subsystem
#
CONFIG_TICK_ONESHOT=y
CONFIG_NO_HZ_COMMON=y
# CONFIG_HZ_PERIODIC is not set
CONFIG_NO_HZ_IDLE=y
CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y
http://abcdxyzk.github.io/blog/2017/07/23/kernel-clock-8/
在前面章节的讨论中,我们一直基于一个假设:Linux中的时钟事件都是由一个周期时钟提供,不管系统中的clock_event_device是工作于周期触发模式,还是工作于单触发模式,也不管定时器系统是工作于低分辨率模式,还是高精度模式,内核都竭尽所能,用不同的方式提供周期时钟,以产生定期的tick事件,tick事件或者用于全局的时间管理(jiffies和时间的更新),或者用于本地cpu的进程统计、时间轮定时器框架等等。周期性时钟虽然简单有效,但是也带来了一些缺点,尤其在系统的功耗上,因为就算系统目前无事可做,也必须定期地发出时钟事件,激活系统。为此,内核的开发者提出了动态时钟这一概念,我们可以通过内核的配置项CONFIG_NO_HZ来激活特性。有时候这一特性也被叫做tickless,不过还是把它称呼为动态时钟比较合适,因为并不是真的没有tick事件了,只是在系统无事所做的idle阶段,我们可以通过停止周期时钟来达到降低系统功耗的目的,只要有进程处于活动状态,时钟事件依然会被周期性地发出。
原来如此!
@tpu 感谢大佬
离线
# date;cat /proc/interrupts; cat /dev/urandom > /dev/null;
Thu Jan 1 00:10:56 UTC 1970
CPU0
16: 10475 sun4i_irq 13 Edge timer@1c20c00
17: 0 sun4i_irq 18 Edge 1c02000.dma-controller
18: 312 sun4i_irq 29 Edge 1c0c000.lcd-controller
19: 0 sun4i_irq 34 Edge cedar_dev
20: 14615 sun4i_irq 23 Edge sunxi-mmc
21: 3516 sun4i_irq 24 Edge sunxi-mmc
22: 1 sun4i_irq 26 Edge musb-hdrc.1.auto
28: 1184 sun4i_irq 2 Edge ttyS0
29: 14 sun4i_irq 7 Edge mv64xxx_i2c
30: 0 sun4i_irq 32 Edge 1cb0000.csi
Err: 0
^C
# date;cat /proc/interrupts;
Thu Jan 1 00:11:23 UTC 1970
CPU0
16: 13154 sun4i_irq 13 Edge timer@1c20c00
17: 0 sun4i_irq 18 Edge 1c02000.dma-controller
18: 312 sun4i_irq 29 Edge 1c0c000.lcd-controller
19: 0 sun4i_irq 34 Edge cedar_dev
20: 15188 sun4i_irq 23 Edge sunxi-mmc
21: 3598 sun4i_irq 24 Edge sunxi-mmc
22: 1 sun4i_irq 26 Edge musb-hdrc.1.auto
28: 1340 sun4i_irq 2 Edge ttyS0
29: 14 sun4i_irq 7 Edge mv64xxx_i2c
30: 0 sun4i_irq 32 Edge 1cb0000.csi
Err: 0
13154 - 10475 = 2679 === 27(秒) * 100
找点事情让cpu做, 这下中断数量能对上了。
离线