科技爱好者博客

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

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

首先看下问题

树莓派测量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()

输出结果为:

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

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

思考过程

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

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

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

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

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

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

答案

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

All Raspberry Pi models perform a degree of thermal management to avoid overheating under heavy load. The SoCs have an internal temperature sensor, which software on the GPU polls to ensure that temperatures do not exceed a predefined limit; this is 85°C on all models. It is possible to set this to a lower value, but not to a higher one. As the device approaches the limit, various frequencies and sometimes voltages used on the chip (ARM, GPU) are reduced. This reduces the amount of heat generated, keeping the temperature under control.

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具有一个内部温度传感器,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.

 

原创文章,转载请注明: 转载自科技爱好者博客

本文链接地址: 树莓派CPU和GPU温度是否是同一个来源的思考 (https://www.tujing.site/4220)

如果博客对您有帮助,请给我 赞助


退出移动版