本节书摘来自异步社区《树莓派实战秘籍》一书中的第1章,第1.5节,作者: 【美】Ruth Suehle , Tom Callaway 更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.5 技巧05监测树莓派的硬件
你是否担心你不在家时你的Pi投身疯狂派对?这个技巧是关于如何弄个摄像头对准它并将视频传输到Internet上的。开个玩笑!这个技巧中的工具只能监测你的这个小巧硬件的物理状态。
一个“正常的”Linux计算机可能会包括板载健康监测传感器,有相当多的监控芯片和元器件被用在各种系统上,但是对于树莓派来说,所有的硬件完全隐藏在Broadcom片上系统里面,因此你无法使用通常的方式访问它。
为了能够使用这些元器件监视你的Pi的健康,需要使用vcgencmd实用工具。任何可用的通用树莓派Linux发行版应该已经预安装了这个工具。如果你的发行版编译为支持ARM硬浮点,你可以在hardfp/子目录下查找,否则,可以在opt/子目录下查找。
检查硬浮点
在写这篇文章的时候,大多数Linux发行版(包括Pidora、Raspbian、Occidentalis、OpenELEC以及RaspBMC等)被构建为支持ARMv6硬浮点架构,因为这样可以提供树莓派的最佳性能。然而这些目标平台的一些老版本(以及其他操作系统平台)被构建为优化的ARMv6的软浮点。这两种优化级别彼此互不兼容。在Linux上,有一种很好的方法来检查是否支持ARMv6硬浮点,即使用readelf命令:
https://yqfile.alicdn.com/adc8c1bba7bdbf20fd9d8b6b4783d940fcde974a.png" >
你可以在树莓派的Linux发行版上直接运行此命令(可能需要先安装elfutils软件包),或者你也可以很方便地从已经装有readelf工具的树莓派Linux发行版并通过其他系统复制一份二进制文件或库文件。
如果二进制文件支持ARMv6硬浮点优化,你会得到类似下面的输出:
最后一行很重要:Tag_ABI_VFP_args: VFP registers。只有二进制文件被检查为构建时采用了ARMv6硬浮点优化时才会显示这些信息。
安装好vcgencmd工具后(如果需要),查看vcgencmd提供的选项:
https://yqfile.alicdn.com/d01ebe33b3bb1925e5833a32c42434fb857c7f4f.png" >
这将输出一个包含所有可以传递给vcgencmd工具的命令列表:
不幸的是,关于这些命令以及它们是干什么的,上面的输出实际上并没有给出什么有用的信息。命令中有些看上去似乎是显而易见的,但是当你运行它们的时候,它们会这样返回:
https://yqfile.alicdn.com/9bb0230395dabd373c88d22b1fddc2fa0ad080a0.png" >
这个工具的文档极其匮乏,不过树莓派社区已经汇集并找到了一些命令的用法。
**
1.5.1 测量元器件电压**
vcgencmd measure_volts命令显示了一些树莓派关键元器件的电压,特别是:
GPU处理器内核
https://yqfile.alicdn.com/e0e5df829a6956a67d2b371128a2dc21a6548680.png" >
SDRAM控制器
https://yqfile.alicdn.com/0a661177f396c65cac4929f9f3b367629c2b7a36.png" >
SDRAM输入/输出(I/O)
SDRAM物理内存
上述每一个元器件都可以作为选项传递给vcgencmd measure_volts命令(如果你没有指定参数,将返回core的值)。你也许会觉得奇怪为什么要关心并测量这些电压,而且在大多数情况下,你也许确实不需要关心它们。它们的值一般如表1-3所示:
你可能会关心这些元器件电压的唯一情况是:如果你决定将你的树莓派超频,在这种情况下这些电压均是可配置的(在技巧06中会有详细介绍)。
你也许希望这个命令返回系统主板电压(这个电压正常条件下在4.75V和5.25V之间变化),但它并不能。参见技巧09获取如何手工获取系统主板电压的相关内容。
1.5.2 测量温度
vcgencmd measure_temp命令会报告树莓派的BCM2835片上系统的core温度(摄氏):
https://yqfile.alicdn.com/ceb7916c1b6a6af05499bbac80ff5a9f1a692285.png" >
或者,你也可以直接读取/sys/class/thermal/thermal_zone0/temp文件获得同样的温度读数:
https://yqfile.alicdn.com/e95384426658b51bc3aedf8df57d69611ba825a0.png" >
趣味数学和科学
要将该值转换为摄氏温度,只需除以1000即可。要得到华氏温度,需要将摄氏温度乘以1.8再加上32。而要得到开尔文温度,则应将摄氏温度加上273.15。如此计算的温度值越来越高,是不是正如我们对树莓派的热情?
从监测树莓派硬件的角度来看,这种读数可能已经足够了。由于实际上CPU/GPU并没有分离(至少从物理和发热的角度来说没有分离),所以它只是给了你一个主板运行有多热的大致概念。也就是说,如果你想获得更详细的(或只是另一个)温度读数,你可以接入一个额外的温度传感器,如技巧37中所述。
1.5.3 监测内存划分
无论是强制分配还是动态分配,vcgencmd get_mem命令都可以返回ARM CPU和显卡GPU的内存值。
要查看当前分配给ARM CPU的内存大小,运行:
要查看当前分配给显卡GPU的内存大小,运行:
1.5.4 检查自定义配置重写
你已经忘记了你对你的树莓派所做的配置更改?具体来说,那些在固件中更改的设置?你可以在/boot/config.txt中查看,这里的vcgencmd get_config命令也可以帮助到你。
要查看所有使用数字(整型)数据类型的配置,运行:
要查看所有使用文本(字符串型)数据类型的配置,运行:
只有非常少的配置项是存储为字符串值而不是整型,因此如果vcgencmd get_config str命令没有返回任何值的时候,你不必过于惊讶。
如果你只是想检查某一个指定配置项的值,则用配置名称代替选项传递:
vcgencmd实用工具并不是对用户最友好的工具,但是它确实很深的介入到了树莓派的内部运作。由于这是一个开源工具(源代码可以从前述的树莓派GitHub固件库中checkout),如果你想深入了解树莓派硬件的内部工作原理的话,查看vcgencmd的源码将会是一个很好的起点。