树莓派CPU和GPU温度是否是同一个来源的思考

烂漫树林
发布于 2020-11-11 17:19
浏览
0收藏

最近在知乎上看到一个很有意思的问题,引起了我的深思,之前确实没仔细考虑过这个问题,经过比较长的思考,终于在偶然间发现了问题的答案,现在把我的答案和思考分享出来。

 

首先看下问题
树莓派测量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温度是否是同一个来源的思考-鸿蒙开发者社区

这里可以看到CPU和GPU通过两种不同的方式获取了温度值,并且温度值竟然相差1度。

那么问题来了,树莓派的CPU和GPU是集成在一个芯片上的,比如树莓派2系列使用的是博通 BCM2836芯片,树莓派3系列使用的是博通 BCM2837芯片,树莓派4使用的博通 BCM2711芯片,获得CPU温度和GPU温度是从两个不同的传感器上获得的吗?或者说,树莓派核心芯片上有几个温度传感器,到底怎么样才能获得最准确的温度值。

 

思考过程
看到这个问题,瞬间引起了我的思考?,因为之前在获得CPU和GPU温度的时候,从来没有思考过为什么CPU和GPU在一个芯片上,但是获得温度的代码不同。

要解决这个问题,首先要搞清楚一下几个问题。

一是树莓派的博通芯片上到底有几个温度传感器。

二是两个获得GPU和CPU温度的不同代码,其数值来源于那一个温度传感器。

为了搞清楚这两个问题的答案,我查找了博通芯片的说明书,还在网上查找了很多资料,费半天劲也没有找到这两个问题的答案。

直到有一次在看树莓派的文档时,偶然发现了问题的答案。

 

答案
在树莓派官网的文档中,关于温度中有两段是这么介绍的:

 

所有Raspberry Pi型号都执行一定程度的热管理,以避免在重负载下过热。SoC具有一个内部温度传感器,GPU上的该软件会轮询以确保温度不超过预定义的限制。所有型号的温度均为85°C。可以将其设置为较低的值,但不能将其设置为较高的值。随着设备接近极限,芯片(ARM,GPU)上使用的各种频率和电压有时会降低。这样可以减少产生的热量,从而使温度保持可控。

 

测量温度


由于Raspberry Pi系列上使用的SoC的体系结构以及Raspbian发行版中上游温度监控代码,基于Linux的温度测量可能不准确。有一个命令可以提供当前SoC温度的精确瞬时读数,因为它直接与GPU通信。

vcgencmd measure_temp

 

看到这里应该明白了吧,树莓派的芯片中只有一个内部温度传感器,GPU会轮询缺的温度的数值,而所谓CPU温度的数值来源也是这个温度传感器。

并且官方说了,基于Linux的温度测量可能不太准确,所以没有CPU或者GPU温度这一说,只有芯片温度,因为CPU、GPU是在一起的。

而且,最准确的测量温度代码是vcgencmd measure_temp.

 

原文作者:科技爱好者

分类
已于2020-11-11 17:19:05修改
收藏
回复
举报
回复
    相关推荐