最近在知乎上看到一个很有意思的问题,引起了我的深思,之前确实没仔细考虑过这个问题,经过比较长的思考,终于在偶然间发现了问题的答案,现在把我的答案和思考分享出来。
首先看下问题
树莓派测量CPU温度和GPU温度的代码如下(参考树莓派CPU、GPU、磁盘、内存、负载监控脚本):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import commands
def main():
# 查看GPU温度
gpu = commands.getoutput( '/opt/vc/bin/vcgencmd measure_temp' ).replace( 'temp=', '' ).replace( '\'C', '' )
gpu = float(gpu)
print('gpu Temp: %.2f ' % gpu)
# 查看CPU温度
file = open("/sys/class/thermal/thermal_zone0/temp")
cpu = float(file.read()) / 1000
file.close()
print('cpu Temp: %2.2f' % cpu)
if __name__ == '__main__':
main()
输出结果为:
gpu Temp: 35.80 cpu Temp: 36.86
这里可以看到CPU和GPU通过两种不同的方式获取了温度值,并且温度值竟然相差1度。
那么问题来了,树莓派的CPU和GPU是集成在一个芯片上的,比如树莓派2系列使用的是博通 BCM2836芯片,树莓派3系列使用的是博通 BCM2837芯片,树莓派4使用的博通 BCM2711芯片,获得CPU温度和GPU温度是从两个不同的传感器上获得的吗?或者说,树莓派核心芯片上有几个温度传感器,到底怎么样才能获得最准确的温度值。
思考过程
看到这个问题,瞬间引起了我的思考?,因为之前在获得CPU和GPU温度的时候,从来没有思考过为什么CPU和GPU在一个芯片上,但是获得温度的代码不同。
要解决这个问题,首先要搞清楚一下几个问题。
一是树莓派的博通芯片上到底有几个温度传感器。
二是两个获得GPU和CPU温度的不同代码,其数值来源于那一个温度传感器。
为了搞清楚这两个问题的答案,我查找了博通芯片的说明书,还在网上查找了很多资料,费半天劲也没有找到这两个问题的答案。
直到有一次在看树莓派的文档时,偶然发现了问题的答案。
答案
在树莓派官网的文档中,关于温度中有两段是这么介绍的:
Measuring temperature
Due to the architecture of the SoCs used on the Raspberry Pi range, and the use of the upstream temperature monitoring code in the Raspbian distribution, Linux-based temperature measurements can be inaccurate. There is a command that can provide an accurate and instantaneous reading of the current SoC temperature, as it communicates with the GPU directly:
vcgencmd measure_temp
翻译过来是这样的:
所有Raspberry Pi型号都执行一定程度的热管理,以避免在重负载下过热。SoC具有一个内部温度传感器
测量温度
由于Raspberry Pi系列上使用的SoC的体系结构以及Raspbian发行版中上游温度监控代码,基于Linux的温度测量可能不准确。有一个命令可以提供当前SoC温度的精确瞬时读数,因为它直接与GPU通信。
vcgencmd measure_temp
看到这里应该明白了吧,树莓派的芯片中只有一个内部温度传感器,GPU会轮询缺的温度的数值,而所谓CPU温度的数值来源也是这个温度传感器。
并且官方说了,基于Linux的温度测量可能不太准确,所以没有CPU或者GPU温度这一说,只有芯片温度,因为CPU、GPU是在一起的。
而且,最准确的测量温度代码是vcgencmd measure_temp
.
原创文章,转载请注明: 转载自科技爱好者博客
本文链接地址: 树莓派CPU和GPU温度是否是同一个来源的思考 (https://www.tujing.site/4220)
如果博客对您有帮助,请给我 赞助
所以说,还是要多看文档啊