实时操作系统CPU软件降温研究报告
问题描述
随着CPU主频的不断提高,在嵌入式领域,在iRmx,psos,vxworks等实时操作系统下工作的高主频CPU往往需要考虑CPU降温的问题。通常采用的方法是通过风扇或散热片等硬件措施进行降温,但由于嵌入式系统的特殊性,某些嵌入式设备考虑到体积,外壳密闭等因素的限制不适合使用风扇或散热片进行降温,在这种情况下,我们不得不考虑软件降温的可行性。当然软件降温是在万不得已时采取的权宜之计,有条件的情况下当然是硬件降温效果最好。
目前网上有很多降温软件如CPUIdle等,但这些软件都是在win9x等非实时操作系统上运行的,实时操作系统如果用类似方法给CPU降温会不会影响操作系统的效率和操作系统的实时性?本文将着重阐述本人对上述问题的研究结果。
研究环境
硬件环境 Intel P 233 ,Intel PIII 700
软件环境 iRmx 实时操作系统
工作原理
上图是Intel Cpu 的电源管理部分状态迁移图,Intel 提供以下几种电源管理模式,Auto Halt,Stop Grant,Sleep,Deep Sleep ,Deeper Sleep 。除Auto Halt 外其它模式都会导致时钟停止。在时钟停止状态下,处理器将关闭对SMI#,INIT#和LINT[1:0]的侦听,只有在回到Normal状态时才重新开启,这会对系统特别是实时系统产生一定的影响,所以本文不讨论这些模式。
本文着重讨论的是Auto Halt 模式,这也是大多数的降温软件通常采用的方式。
Auto Halt 模式的特性
Intel Cpu 通过在Normal状态下执行 HLT 指令将状态迁移到Auto Halt 模式。此时Cpu将HLT指令插入指令序列,并停止处理指令序列,直到发生SMI#,INIT#,LINIT[1:0](NMI,INTR)或PSB 中断消息为止。当发生上述消息后Cpu重新回到Normal状态处理指令,并在处理完中断代码后继续从HLT指令的下一条指令执行。处理器在进入Auto Halt 模式后功耗将有所下降。
软件如何实现降温
由于软硬件系统在正常情况下大部分时间CPU利用率都较低,所以只要在CPU空闲时对CPU下一条HLT指令,就可以大大降低CPU的功耗,从而达到降温的目的。
在实时操作系统中,通常我们会设计一个最低优先级的任务做死循环处理,系统在空闲时都会走到该任务中。我们只要在这个任务的循环中加入一条HLT指令就可以达到上述目的。
相关研究
CPU 占用率的计算
CPU 占用时间的计算方法: 通过获得上面所提到的最低优先级任务在一段时间T内的CPU占用时间t0, 来推算CPU的占用率,计算公式为 CpuRate = (T-t0) /T 。下面所有实验的CPU占用率计算方法都同该方法。
实验方法
实验编号 1
实验环境 Intel P233 ,iRmx
目的 验证不Halt 和 Halt 情况下CPU占用率的计算结果有没有偏差。
实验内容
每100毫秒由高优先级任务 Task1 向 低优先级任务Task2 发送100个 长度为900的消息,低优先级任务收到该消息后做 Times 次循环,通过改变Times的值来控制CPU占用率。分别测试不Halt 和 Halt 情况下,相同Times 时根据上述方法计算处理的CPU占用率数值。
CPU Rate Times | No Halt | Halt |
100 | 6% | 6% |
1000 | 12% | 12% |
5000 | 35% | 35% |
10000 | 64% | 64% |
13000 | 82% | 82% |
15000 | 95% | 95% |
结论
不Halt 和 Halt 情况下CPU占用率的计算结果没有偏差
实验总结
我在做这个测试之前一直想当然的认为这个问题是HALT和不HALT在软件上的最大变化。我的理由是当HLT指令被执行,最低优先级任务按说应该不占用CPU时间,这样通过得它的CPU占用时间来计算CPU占用率就会有很大偏差。
然而当我做过测试以后,惊讶地发现HALT和不HALT CPU占用率的计算没有什么变化。经过反思后,我恍然大悟,原来操作系统在计算任务的CPU占用时间时是以任务的上下文切换作为统计的触发条件,当任务在执行HLT指令时操作系统并没有进行任务上下文切换,操作系统自然 认为CPU 进入AUTO HALT 状态的这段时间依然是被该任务占用的。
CPU 的降温幅度
实验方法
实验编号 2
实验环境Intel PIII 700 CPU 带小散热片 ,iRmx
目的 验证不Halt 和 Halt 情况下不同CPU占用率条件下对CPU温度的影响。
实验内容
测出两种情况下不同CPU占用率对应的CPU温度。
CPU占用率 | 温度(No Halt)摄氏度 | 温度(Halt)摄氏度 |
100% | 54 | 54 |
80% | 54 | 51 |
60% | 54 | 47 |
40% | 54 | 45 |
20% | 54 | 42 |
10% | 54 | 40 |
3% | 54 | 38 |
从上面测得的数据来看CPU在执行HLT指令后,温度确实有了很明显的下降。下面我们看看上面测得的值和从温度理论推导出来的结果是否吻合。
根据温度理论,CPU的功耗E,热阻R 和 温度T 三者之间的关系是
T-T0 = E×R ,T0 为初始温度
CPU 占用率r在通常情况下和功耗E成正比,CPU在HALT以后还有部分在工作,以及环境温度的影响,所以CPU肯定存在一个初始温度,即r=0时的温度。
在热阻一定的情况下,根据上面所述我们可以设 r = K(T-T0),或T = r/K + T0
其中R=1/K
将 r=100 ,T=54 和 r= 10 ,T=40 带入上面公式,得K=6.4 ,T0 = 38.4
理论值对应的温度表为
CPU占用率 | 温度(Halt)摄氏度 | 误差 |
100% | 54.0 | 0 |
80% | 50.9 | +0.1 |
60% | 47.8 | -0.8 |
40% | 44.6 | +0.4 |
20% | 41.5 | +0.5 |
10% | 40.0 | 0 |
3% | 38.8 | -0.8 |
0% | 38.4 | - |
由于我使用的温度计的误差范围在正负1摄氏度范围内,所以上面的测试结果符合理论推导的结果。
结论
CPU 在执行HLT指令后,CPU温度和CPU占用率成正比,和CPU热阻成反比,相同散热条件下,CPU占用率越高,CPU温度越高;相同CPU占用率条件下,热阻越大,即散热越不好,CPU 温升幅度越大。
对系统实时性的影响
实验方法
实验编号 3
实验环境 Intel P233 ,iRmx
目的 验证不Halt 和 Halt 情况下不同CPU占用率条件下软件实时性是否受到影响。
实验内容
CPU 占用率的计算和获得方法同实验1。通过Pentium CPU的一个扩展指令RDTSC(Read Time Stamp Counter) 获得计算机启动以后累计的系统时钟数 sysclkcounter。在实验的软件系统的高最优先级任务CMOSTIMETASK 中断任务中计算每次进入该中断时sysclkcounter 和上次中断时的差值,得到两次中断任务的时间间隔。CMOS 中断每十毫秒发生一次。计算不同CPU占用率下 No Halt 和 Halt 对CMOS 中断间隔的系统时钟数。
因为 CMOS 中断本身有一定误差,sysclkcounter interval 的有效数字我们只精确到十万位,即时间精确到1毫秒左右。
sysclkcounter interval Cpu Rate | No Halt | Halt |
3% | 1100000 | 1100000 |
10% | 1100000 | 1100000 |
30% | 1100000 | 1100000 |
50% | 1100000 | 1100000 |
80% | 1100000 | 1100000 |
90% | 1100000 | 1100000 |
实验编号 4
实验环境 Intel P233 ,iRmx
目的 验证不Halt 和 Halt 情况下不同中断频度条件下软件实时性是否受到影响。
实验内容
通过向系统不停发送UDP数据包来触发网卡中断,测试不同数据流量下CMOS 中断间隔的系统时钟数。
因为 CMOS 中断本身有一定误差,sysclkcounter interval 的有效数字我们只精确到十万位,即时间精确到1毫秒左右。
每百毫秒发送的UDP包数 | 包大小(UDP包长度) | CPU 占用率(No Halt) | CPU 占用率(Halt) | 10毫秒系统时钟次数,精确到10万次(No Halt) | 10毫秒系统时钟次数,精确到10万次(Halt) | 每秒钟网卡中断数 |
0 | - | 3% | 3% | 1100000 | 1100000 | 20 |
1 | 10 | 4% | 4% | 1100000 | 1100000 | 110 |
50 | 10 | 27% | 27% | 1300000 | 1300000 | 200 |
100 | 10 | 56% | 56% | 1800000 | 1800000 | 320 |
150 | 10 | 90% | 90% | 2300000 | 2300000 | 370 |
实验分析
如果读者细心的话,会发现当网卡中断数增加以后,CMOS中断间隔时间有很大的变化,我在最初看到这个结果时一时无法理解,因为CMOS中断的优先级是我所做实验的系统中最高的(高于网卡中断),网卡中断怎么会对比自己优先级高的CMOS中断产生这么大的影响呢?后来我发现,我所做实验的软件系统中,在响应网卡中断时关闭了所有的中断包括比它优先级高的CMOS中断,这样做的目的是为了防止中断重入时造成堆栈不足,导致系统崩溃。那么这样就不难理解为什么网卡中断会对CMOS中断有如此的影响了。
不过在相同影响的情况下no halt 和 halt 没有什么差别。
结论
HLT 指令的执行对软件系统实时性没有影响。
研究总结
通过上述实验,我们可以下结论,CPU 在执行HLT指令后,CPU温度和CPU占用率成正比,和CPU热阻成反比,相同散热条件下,CPU占用率越高,CPU温度越高;相同CPU占用率条件下,热阻越大,即散热越不好,CPU 温升幅度越大。
CPU 执行HLT指令对于实时操作系统的实时性没有影响。