El vcgencmd ha estado enterrado profundamente en el sistema operativo Raspberry Pi durante muchos años, pero tomó el Frambuesa Pi 5 para que realmente aprendamos a amarlo. En su nivel más básico, el comando se utiliza para generar información desde la GPU VideoCore, que forma parte del SoC. Pero con algunas opciones/argumentos adicionales podemos obtener datos en vivo sobre la temperatura de la CPU, voltajes, velocidades de reloj para muchos componentes diferentes y mucho más.
En este tutorial, presentaremos el uso básico del comando y luego escribiremos un script Bash personalizado que comparará cualquier Frambuesa Pi sistema.
Uso básico de Vcgencmd
El comando tiene múltiples opciones para medir velocidades de reloj, temperaturas, voltajes, etc. Repasémoslas y veamos cómo se usa cada comando y un ejemplo de su resultado.
Medir velocidades de reloj
Cada computadora tiene más de una velocidad de reloj. Es posible que la CPU esté funcionando en Gigahertz, pero algunas partes de su computadora funcionarán a velocidades mucho más bajas. El comando vcgencmd tiene opciones para monitorear
Descripción | Dominio | Salida de ejemplo |
---|---|---|
Obtenga la velocidad del núcleo de la CPU Arm | vcgencmd brazo de medida_reloj | frecuencia(0)=1500004352 |
Obtenga la velocidad del núcleo de la GPU | vcgencmd medida_reloj núcleo | frecuencia(0)=500001504 |
Obtenga velocidad de bloque H.264 | vcgencmd medida_reloj h264 | frecuencia(0)=0 |
Obtener velocidad de canalización del sensor de imagen | vcgencmd medida_reloj isp | frecuencia(0)=500000672 |
Obtener velocidad de bloque 3D | vcgencmd medida_reloj v3d | frecuencia(0)=500001504 |
Obtener velocidad UART | vcgencmd medida_reloj uart | frecuencia(0)=43999120 |
Obtener bloque PWM (salida de audio analógica) | vcgencmd medida_reloj pwm | frecuencia(0)=0 (Raspberry Pi 5 tiene salida de vídeo analógico, pero no audio) |
Obtener la velocidad del reloj de la interfaz de la tarjeta SD | vcgencmd medida_reloj emmc | frecuencia(0)=200000432 |
Obtener valores de píxeles | vcgencmd medida_reloj píxel | frecuencia(0)=107999800 |
Obtenga la velocidad del codificador de video analógico | vcgencmd medida_reloj vec | frecuencia(0)=0 |
Obtener reloj HDMI | vcgencmd medida_reloj hdmi | frecuencia(0)=648002816 |
Obtener la velocidad del reloj de la interfaz paralela de visualización | vcgencmd medida_reloj ppp | frecuencia(0)=0 |
Medir voltajes
Usando vcgencmd, podemos medir los voltajes del chip VideoCore, la RAM y los voltajes y corrientes en uso en muchas fuentes de energía, incluido el IC de administración de energía (PMIC).
Descripción | Dominio | Salida de ejemplo |
---|---|---|
Obtener voltaje VideoCore | vcgencmd medida_voltios núcleo | voltio = 0,7200 V |
Obtener el voltaje del núcleo de la RAM | vcgencmd medida_voltios sdram_c | voltio = 0,6000 V |
Obtener voltaje de E/S de RAM | vcgencmd medida_voltios sdram_i | voltio = 0,6000 V |
Obtener voltaje RAM Phy | vcgencmd medida_voltios sdram_p | voltio = 1,1000 V |
Leer voltajes PMIC | vcgencmd pmic_read_adc | 3V7_WL_SW_A corriente(0)=0.00390372A 3V3_SYS_A corriente(1)=0.05562801A 1V8_SYS_A corriente(2)=0.16493220A DDR_VDD2_A corriente(3)=0.02049453A DDR_VDDQ_A corriente(4)=0.00000000 A 1V1_SYS_A corriente(5)=0.18152300A 0V8_SYS_A corriente (6)=0.32693650A VDD_CORE_A corriente(7)=0.71440000A 3V3_DAC_A corriente(17)=0.48840000A 3V3_ADC_A corriente(18)=0.42735000A 1V1_SYS_A corriente(16)=5.55555000A HDMI_A corriente(2 2)=0.02344320A 3V7_WL_SW_V voltios(8 )=3.71462400V 3V3_SYS_V voltios(9)=3.31096100V 1V8_SYS_V voltios(10)=1.79926600V DDR_VDD2_V voltios(11)=1.11355200V DDR_VDDQ_V voltios(12)=0.60842430V 1V1_ SYS_V voltios(13)=1.10622600V 0V8_SYS_V voltios(14)= 0,80476110V VDD_CORE_V voltios(15)=0,72097620V 3V3_DAC_V voltios(20)=3,30768900V 3V3_ADC_V voltios(21)=3,30494200V 1V1_SYS_V voltios(19)=0,79765500V HDMI_V voltio(23)=5.10004000V EXT5V_V voltio(24)=5.09602000V BATT_V voltios(25)=0,00683760V |
Salida selectiva de valores PMIC. Busque el valor que desee de la lista y agréguelo como argumento. | vcgencmd pmic_read_adc EXT5V_V | EXT5V_V voltios(24)=5.12416000V |
Estado del acelerador del sistema
Cuando la Raspberry Pi alcance alrededor de 80 grados Celsius, entrará en aceleración térmica. Esto reduce la velocidad de la CPU en un intento de mantenerla fría. Cuando ejecutamos pruebas comparativas, necesitamos saber si una CPU está acelerada y vcgencmd tiene el comando para decirnos eso.
Descripción | Dominio | Salida de ejemplo |
---|---|---|
Devuelve el estado del acelerador del sistema como un patrón de bits. | vcgencmd get_throttled | estrangulado = 0x0 |
Fila 1 – Celda 0 | Fila 1 – Celda 1 | Fila 1 – Celda 2 |
Tabla de bits de estado del acelerador del sistema
Descripción | Poco | Valor hexadecimal |
---|---|---|
Subtensión detectada | 0 | 0x1 |
Frecuencia del brazo limitada | 1 | 0x2 |
Actualmente estrangulado | 2 | 0x4 |
Límite de temperatura suave activo | 3 | 0x8 |
Se ha producido subtensión | dieciséis | 0x10000 |
Se ha producido una limitación de frecuencia del brazo | 17 | 0x20000 |
Se ha producido estrangulamiento | 18 | 0x40000 |
Se ha producido un límite de temperatura suave | 19 | 0x80000 |
Información de configuración del sistema con Vcgencmd
El vcgencmd se puede utilizar para inspeccionar y volcar la configuración actual del sistema. De forma predeterminada, la salida se dirige a la salida estándar (la terminal), pero mediante una tubería la salida se puede redirigir a un archivo para comparar.
Descripción | Dominio | Salida de ejemplo |
---|---|---|
Devuelve la configuración del sistema | vcgencmd get_config int | arm_64bit=1 arm_boost=1 arm_freq=2400 arm_freq_min=1000 arm_peri_high=1 audio_pwm_mode=2 auto_initramfs=1 camera_auto_detect=1 core_freq=910 core_freq_min=500 desactivar_commandline_tags=2 desactivar_fw_kms_setup=1 desactivar_l2cache=1 desactivar_overs can=1 display_auto_detect=1 display_default_lcd=-1 display_hdmi_rotate =-1 display_lcd_rotate=-1 dvfs=4 enable_gic=1 enable_uart=-1 force_eeprom_read=1 force_pwm_open=1 framebuffer_ Depth=16 framebuffer_ignore_alpha=1 framebuffer_swap=1 gpu_freq_min=500 hdmi_enable_4kp60=1 hevc_freq =910 hevc_freq_min=500 ignorar_lcd=-1 init_uart_clock= 0x2dc6c00 isp_freq=910 isp_freq_min=500 mask_gpu_interrupt1=16418 max_framebuffers=2 over_voltage_avs=0x20404 pausa_burst_frames=1 program_serial_random=1 total_mem=8192 usb_max_current_enable=1 v3d_freq=960 v3d_freq_min =500 vpred=8921 hdmi_force_cec_address:0=65535 hdmi_force_cec_address:1=65535 |
Devuelve la memoria dividida para Arm CPU | vcgencmd get_mem brazo | brazo = 1020M |
Devuelve la memoria dividida para GPU | vcgencmd get_mem gpu | gpu=4M Nota: Para Pi 5, esto parece estar asignado dinámicamente. |
Un script de evaluación comparativa simple con Vcgencmd
Con nuestro conocimiento de vcgencmd y secuencias de comandos Bash, podemos crear una herramienta de evaluación comparativa simple que tomará una lectura de la temperatura, la velocidad y el estado del acelerador de la CPU cada 60 segundos y luego almacenará los detalles en un archivo CSV.
El guión se divide en tres secciones. Una lectura de temperatura inactiva de 60 segundos que proporciona una línea de base a partir de la cual hacer referencia. La segunda parte es la prueba de estrés en sí, en la que se utiliza el estrés para impulsar los cuatro núcleos durante cinco minutos. Finalmente repetimos el período de inactividad durante 60 segundos para mostrar que la CPU se está enfriando.
Vamos a escribir este script en una Raspberry Pi 5, pero el mismo script funcionará en todos los modelos de Raspberry Pi.
1. Abra una terminal y actualice los repositorios de software y luego instale estrés. Stress es una herramienta de línea de comandos para realizar pruebas de estrés en las CPU.
sudo apt update && sudo apt install stress
2. Desde el menú principal del escritorio de Raspberry Pi, seleccione Programación >> Geany. Geany es un editor de texto excelente y liviano para codificar.
3. Dígale al script dónde encontrar el shell del sistema. Esto tiene el nombre “shabang”, una concatenación de sostenido (#) y bang (!).
#!/bin/bash
4. Envía un mensaje al shell, informando al usuario de lo que hará la aplicación. Luego cree una variable para almacenar el nombre del archivo de salida. Debería ser un archivo CSV, pero el nombre puede ser elegido por usted.
echo "Tom's Hardware Benchmark Tool"
output_file="benchmark.csv"
5. Cree un encabezado para el archivo CSV y escriba en el archivo. Esto establecerá los encabezados de las columnas en el archivo CSV y la hoja de cálculo.
echo "Timestamp,CPU Temperature (°C),CPU Clock Speed (MHz),CPU Throttled" > "$output_file"
6. Envíe un mensaje para indicar que la aplicación estará inactiva durante 60 segundos.
echo "Idle data for 60 seconds"
7. Crea un bucle for que se repetirá 60 veces.
for i in 1..60; do
8. Escriba la hora actual en una variable, luego imprima la marca de tiempo en el shell.
timestamp=$(date +"%Y-%m-%d %H:%M:%S")
echo "$timestamp"
9. Utilice vcgencmd para obtener la temperatura actual de la CPU, elimine cualquier información excepto la temperatura y guárdela en una variable. Luego haga eco de la temperatura al caparazón. Si no hacemos esto, tendremos que desinfectar los datos del archivo CSV, pero ahora mismo podemos automatizar su eliminación.
cpu_temp=$(vcgencmd measure_temp | cut -d= -f2 | cut -d' -f1)
echo "$cpu_temp"
10. Usando vcgencmd, obtenga la velocidad actual de la CPU en MHz, guárdela en una variable y luego imprima la velocidad en el shell. Tenemos que dividir la velocidad de la salida del comando y luego dividirla por 1.000.000 para obtener la velocidad en MHz.
cpu_clock_speed=$(($(vcgencmd measure_clock arm | awk -F= 'print $2') / 1000000))
echo "$cpu_clock_speed"
11. Compruebe si la CPU ha sido acelerada, guarde los datos en una variable e imprímalos en el shell. Esto devolverá un patrón de bits; consulte la tabla para decodificarlo.
throttled_status=$(vcgencmd get_throttled)
echo "$throttled_status"
12. Repite una serie de # en el shell. Esto ayudará a dividir los datos en secciones cuando se impriman en la ventana del terminal.
echo "################"
13. Escriba los datos en el archivo CSV. Tenga en cuenta que usamos >> para agregar los datos al archivo CSV. Si solo hubiera un >, se sobrescribiría.
echo "$timestamp,$cpu_temp,$cpu_clock_speed,$throttled_status" >> "$output_file"
14. Aún dentro del bucle for, haga una pausa de un segundo y luego ciérrelo. El código en el bucle for escribirá 60 lecturas en el archivo CSV, una por segundo del tiempo de inactividad.
sleep 1
done
15. Llame al comando estrés para ejecutar una prueba de esfuerzo en los cuatro núcleos de la CPU durante 300 segundos (cinco minutos). El «&» colocará el comando en segundo plano y no bloqueará la ejecución de nuestro script.
stress --cpu 4 -t 300 &
dieciséis. Haga eco (imprima) un mensaje para informar que la prueba de esfuerzo ya está comenzando.
echo "Stress data for 300 seconds"
17. Repetimos el bucle for de antes, simplemente cambie 60 a 300 y luego registre la misma temperatura, velocidad de la CPU y estado del acelerador en las variables y luego escriba en el archivo CSV.
for i in 1..300; do
timestamp=$(date +"%Y-%m-%d %H:%M:%S")
echo "$timestamp"
cpu_temp=$(vcgencmd measure_temp | cut -d= -f2 | cut -d' -f1)
echo "$cpu_temp"
cpu_clock_speed=$(($(vcgencmd measure_clock arm | awk -F= 'print $2') / 1000000))
echo "$cpu_clock_speed"
throttled_status=$(vcgencmd get_throttled)
echo "$throttled_status"
echo "################"
echo "$timestamp,$cpu_temp,$cpu_clock_speed,$throttled_status" >> "$output_file"
# Sleep for 1 second
sleep 1
done
18. La sección final es un período de enfriamiento que permite que la CPU vuelva a la normalidad. Este es el mismo ciclo que el período inactivo.
echo "Cool down data for 60 seconds"
for i in 1..60; do
# Get current timestamp
timestamp=$(date +"%Y-%m-%d %H:%M:%S")
echo "$timestamp"
# Get CPU temperature in degrees Celsius
cpu_temp=$(vcgencmd measure_temp | cut -d= -f2 | cut -d' -f1)
echo "$cpu_temp"
# Get CPU clock speed in MHz
cpu_clock_speed=$(($(vcgencmd measure_clock arm | awk -F= 'print $2') / 1000000))
echo "$cpu_clock_speed"
# Check if the CPU is throttled
throttled_status=$(vcgencmd get_throttled)
echo "$throttled_status"
echo "################"
# Append data to CSV file
echo "$timestamp,$cpu_temp,$cpu_clock_speed,$throttled_status" >> "$output_file"
# Sleep for 1 second
sleep 1
done
19. Guarde el código como benchmark.sh en su directorio de inicio.
20. En una terminal, haga que el archivo sea ejecutable.
chmod +x benchmark.sh
21. Desde la terminal, ejecute el código y espere a que se complete la prueba comparativa.
./benchmark.sh
22. Importe el archivo CSV a una hoja de cálculo y utilícelo para producir gráficos/tablas de sus hallazgos.
Listado de códigos completo
#!/bin/bash
echo "Tom's Hardware Benchmark Tool"
output_file="benchmark.csv"
echo "Timestamp,CPU Temperature (°C),CPU Clock Speed (MHz),CPU Throttled" > "$output_file"
echo "Idle data for 60 seconds"
for i in 1..60; do
timestamp=$(date +"%Y-%m-%d %H:%M:%S")
echo "$timestamp"
cpu_temp=$(vcgencmd measure_temp | cut -d= -f2 | cut -d' -f1)
echo "$cpu_temp"
cpu_clock_speed=$(($(vcgencmd measure_clock arm | awk -F= 'print $2') / 1000000))
echo "$cpu_clock_speed"
throttled_status=$(vcgencmd get_throttled)
echo "$throttled_status"
echo "################"
echo "$timestamp,$cpu_temp,$cpu_clock_speed,$throttled_status" >> "$output_file"
# Sleep for 1 second
sleep 1
done
stress --cpu 4 -t 300 &
echo "Stress data for 300 seconds"
for i in 1..300; do
timestamp=$(date +"%Y-%m-%d %H:%M:%S")
echo "$timestamp"
cpu_temp=$(vcgencmd measure_temp | cut -d= -f2 | cut -d' -f1)
echo "$cpu_temp"
cpu_clock_speed=$(($(vcgencmd measure_clock arm | awk -F= 'print $2') / 1000000))
echo "$cpu_clock_speed"
throttled_status=$(vcgencmd get_throttled)
echo "$throttled_status"
echo "################"
echo "$timestamp,$cpu_temp,$cpu_clock_speed,$throttled_status" >> "$output_file"
# Sleep for 1 second
sleep 1
done
echo "Stress test complete, 60 second cool down period"
echo "Cool down data for 60 seconds"
for i in 1..60; do
timestamp=$(date +"%Y-%m-%d %H:%M:%S")
echo "$timestamp"
cpu_temp=$(vcgencmd measure_temp | cut -d= -f2 | cut -d' -f1)
echo "$cpu_temp"
cpu_clock_speed=$(($(vcgencmd measure_clock arm | awk -F= 'print $2') / 1000000))
echo "$cpu_clock_speed"
throttled_status=$(vcgencmd get_throttled)
echo "$throttled_status"
echo "################"
echo "$timestamp,$cpu_temp,$cpu_clock_speed,$throttled_status" >> "$output_file"
# Sleep for 1 second
sleep 1
done