El vcgencmd ha estado enterrado profundamente en el sistema operativo Raspberry Pi durante muchos años, pero tomó Frambuesa Pi 5 para que aprendamos verdaderamente a amarlo. En su nivel más básico, el comando se utiliza para extraer información de la GPU VideoCore, que forma parte del SoC. Pero con algunas opciones/argumentos más 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 procedimiento, introduciremos el uso básico del comando y luego escribiremos un script Bash personalizado que evaluará cualquier pastel de frambuesa sistema.
Uso básico de Vcgencmd
El comando tiene varias opciones para medir velocidades de reloj, temperaturas, voltajes, etc. Repasémoslos y veamos cómo se usa cada comando, así como un ejemplo de su resultado.
Medición de velocidades del reloj
Cada computadora tiene varias velocidades de reloj. El procesador puede funcionar a gigahercios, pero algunas partes de su computadora funcionarán a velocidades mucho más bajas. El comando vcgencmd proporciona opciones para monitorear
Descripción | Orden | Salida de ejemplo |
---|---|---|
Obtenga la velocidad del núcleo de la CPU Arm | brazo vcgencmd medición_reloj | frecuencia (0) = 1500004352 |
Obtenga la velocidad del núcleo de la GPU | kernel vcgencmd medición_reloj | frecuencia (0) = 500001504 |
Obtenga velocidad de bloque H.264 | vcgencmd reloj_medida h264 | frecuencia(0)=0 |
Obtener velocidad de canalización del sensor de imagen | vcgencmd medición_reloj isp | frecuencia (0) = 500000672 |
Consigue la velocidad de los bloques 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) |
Obtenga la velocidad del reloj desde la interfaz de la tarjeta SD | vcgencmd medición_reloj emmc | frecuencia (0) = 200000432 |
Obtener valores de píxeles | vcgencmd pixel_clockmeasure | 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 |
Obtenga la velocidad del reloj desde la interfaz paralela de visualización | vcgencmd reloj_medida ppp | frecuencia(0)=0 |
Medir voltajes
Usando vcgencmd podemos medir los voltajes del chip VideoCore, la RAM y los voltajes y corrientes utilizados en muchas fuentes de energía, incluido el circuito integrado de administración de energía (PMIC).
Descripción | Orden | Salida de ejemplo |
---|---|---|
Obtener voltaje VideoCore | Núcleo vcgencmd Medida_voltios | voltios = 0,7200 V |
Obtener el voltaje del núcleo de la RAM | vcgencmd medición_voltios sdram_c | voltios = 0,6000 V |
Obtener voltaje de E/S de RAM | vcgencmd medición_voltios sdram_i | voltios = 0,6000 V |
Obtener el voltaje de RAM Phy | vcgencmd medición_voltios sdram_p | voltios = 1,1000 V |
Leer voltajes PMIC | vcgencmd pmic_read_adc | 3V7_WL_SW_A actual (0) = 0,00390372A 3V3_SYS_A actual (1) = 0,05562801A 1V8_SYS_A actual (2) = 0,16493220A DDR_VDD2_A actual (3) = 0,02049453A DDR_VDDQ_A actual (4) = 0,000 00000 Corriente A 1V1_SYS_A (5 ) = 0.18152300A Corriente 0V8_SYS_A (6)=0.32693650A Corriente VDD_CORE_A(7)=0.71440000A Corriente 3V3_DAC_A(17)=0.48840000A Corriente 3V3_ADC_A(18)=0.42735000A Corriente 1V1_SYS_A(16)=5.55555000A Corriente HDMI_A(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.608424 30 V 1V1_ SYS_V voltios (13) = 1,10622600 V 0V8_SYS_V voltios (14 ) = 0,80476110 V VDD_CORE_V voltios (15) = 0,72097620 V 3V3_DAC_V voltios (20) = 3,307 68900 V 3V3_ADC_V voltios (21) = 3,30494200 V 1V1_SYS_V voltios (19) = 0. 79765500 V HDMI_V Voltios(23)=5.10004000V EXT5V_V Voltios(24) =5.09602000V BATT_V voltios (25) = 0.00683760 V |
Salida selectiva de valores PMIC. Encuentre el valor deseado en la lista y agréguelo como argumento. | vcgencmd pmic_read_adc EXT5V_V | EXT5V_V voltios(24)=5.12416000V |
Estado de limitación del sistema
Cuando la Raspberry Pi alcanza unos 80 grados centígrados, entra en regulación térmica. Esto reduce la velocidad del procesador en un intento de mantenerlo frío. Al ejecutar pruebas comparativas, necesitamos saber si un procesador está acelerado y vcgencmd tiene el comando para informarnos.
Descripción | Orden | Salida de ejemplo |
---|---|---|
Devuelve el estado del controlador del sistema como un patrón binario. | vcgencmd get_throtled | limitado = 0x0 |
Fila 1 - Celda 0 | Línea 1 - Celda 1 | Línea 1 - Celda 2 |
Tabla de bits de estado de limitación del sistema
Descripción | Pequeño | valor hexadecimal |
---|---|---|
Subtensión detectada | 0 | 0x1 |
Límite de frecuencia de activación | 1 | 0x2 |
Actualmente limitado | 2 | 0x4 |
Límite de temperatura suave activo | 3 | 0x8 |
Se ha producido subtensión | dieciséis | 0x10000 |
Se ha producido una limitación en el número de exposiciones de activación. | 17 | 0x20000 |
Se ha producido una estrangulación | 18 | 0x40000 |
Se ha producido un límite de temperatura suave | 19 | 0x80000 |
Información sobre la 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 (el terminal), pero mediante una tubería, la salida se puede redirigir a un archivo para fines de comparación.
Descripción | Orden | 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 Disable_commandline_tags=2 Disable_fw_kms_setup=1 Disable_l2cache=1 Disable able_overs puede = 1 pantalla _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_grado=16 framebuffer_ignore_alpha=1 framebuffer_swap=1 gpu_freq_min=500 hdmi_enable_4kp60=1 hevc_freq =910 hev c _freq_min=50 0 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 distribución de memoria para el procesador Arm. | vcgencmd get_mem brazo | brazo = 1020M |
Devuelve la asignación de memoria para la 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
Utilizando nuestro conocimiento de los scripts vcgencmd y Bash, podemos crear una herramienta de evaluación comparativa simple que medirá la temperatura, la velocidad y el estado del acelerador de la CPU cada 60 segundos y luego almacenará los detalles en un archivo CSV.
La trama se divide en tres secciones. Una lectura de temperatura en cámara lenta de 60 segundos que proporciona una línea de base para 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 periodo de inactividad durante 60 segundos para indicar enfriamiento de la CPU.
Escribiremos 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, luego instale estrés. Stress es una herramienta de línea de comandos para probar procesadores.
sudo apt update && sudo apt install stress
2. Desde el menú principal del escritorio Raspberry Pi, seleccione Programación >> Geany. Geany es un excelente editor de texto liviano para codificar.
3. Dígale al script dónde encontrar el shell del sistema. Esto se llama "shabang", una concatenación de libra (#) y bang (!).
#!/bin/bash
4. Envía un mensaje al shell, informando al usuario qué hará la aplicación. Luego cree una variable para almacenar el nombre del archivo de salida. Debe ser un archivo CSV, pero puedes elegir el nombre.
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. Muestra un mensaje de 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 toda la 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 limpiar los datos del archivo CSV, pero ahora podemos automatizar su eliminación.
cpu_temp=$(vcgencmd measure_temp | cut -d= -f2 | cut -d\' -f1)
echo "$cpu_temp"
diez. Usando vcgencmd, obtenga la velocidad actual de la CPU en MHz, guárdela en una variable y luego imprima la velocidad en el shell. Necesitamos 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 binario; consulte la tabla para decodificarlo.
throttled_status=$(vcgencmd get_throttled)
echo "$throttled_status"
12. Haga eco de una serie de # en el shell. Esto ayudará a dividir los datos en secciones al imprimirlos 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 uno >, se sobrescribiría.
echo "$timestamp,$cpu_temp,$cpu_clock_speed,$throttled_status" >> "$output_file"
14. Aún dentro del bucle for, haga una pausa por un segundo y luego ciérrelo. El código del bucle for escribirá 60 lecturas en el archivo CSV, una por cada segundo de tiempo de inactividad.
sleep 1
done
15. Invoque el comando de 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 indicar que la prueba de esfuerzo está comenzando ahora.
echo "Stress data for 300 seconds"
17. Repetimos el bucle for de antes, simplemente cambie 60 a 300, luego guarde la misma temperatura, velocidad de la CPU y estado del acelerador en las variables, 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 el procesador vuelva a la normalidad. Este es el mismo ciclo que el período de inactividad.
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 resultados.
Lista completa de códigos
#!/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
Deja una respuesta