Problemas Conocidos
Fecha de análisis: 2026-06-27 Última actualización: 2026-06-27 Total: 7 issues — 0 críticos, 3 moderados, 4 leves
Correcciones Recientes ✅
| ID | Fecha | Descripción |
|---|---|---|
| — | — | — |
🔴 Críticos
No se han encontrado issues críticos.
🟡 Moderados
SS-01 — h3lis_update() ejecuta SPI bloqueante dentro de la ISR del SysTick
- Archivo:
h3lis.c:107-137,main.c:7-9 - Descripción:
h3lis_update()se llama desdesys_tick_handler()a 1 kHz y ejecuta una ráfaga SPI de 6 bytes (más overhead de CS y direccionamiento). Aunque la transacción completa (~12 µs a 5.25 MHz) cabe holgadamente en la ventana de 1 ms, las operaciones SPI bloqueantes en contexto de interrupción son frágiles: si el periférico SPI se cuelga o si otra ISR de mayor prioridad interrumpe la transacción, el sistema puede quedar bloqueado o generar datos corruptos. - Impacto: Medio — no bloquea el sistema en condiciones normales, pero reduce la robustez y complica la depuración.
- Mitigación actual: Ninguna. La ISR del SysTick es la de mayor prioridad software (grupo 1), y USART1 está en prioridad 2, por lo que no hay riesgo de preempción por USART.
- Solución propuesta: Mover la lectura SPI a un flag activado por SysTick y ejecutar
h3lis_update()en el bucle principal, o usar SPI con DMA para descargar la CPU.
SS-02 — WHO_AM_I esperado (0x33) podría no coincidir con el silicio real
- Archivo:
h3lis.h:23,main.c:19 - Descripción: El firmware espera
WHO_AM_I = 0x33(H3LIS_DEVICE_ID), pero el datasheet del H3LIS331DL indica que el valor esperado es0x32. El propio README reconoce esta ambigüedad: "Debe devolver 0x32 (o 0x33 en ciertos casos)". Si el sensor real devuelve0x32,h3lis_init()fallará y el firmware entrará en el bucle de error indefinidamente. - Impacto: Medio — impide el funcionamiento si el silicio devuelve
0x32en lugar de0x33. - Mitigación actual: El firmware imprime el valor real de
WHO_AM_Ien el mensaje de error, facilitando el diagnóstico. - Solución propuesta: Aceptar ambos valores (
0x32y0x33) como válidos, o verificar contra una máscara de revisión (0xF0) si la familia de chips comparte los bits altos.
KN-01 — sqrtf() dentro de ISR activa la FPU en contexto de interrupción
- Archivo:
h3lis.c:115,123 - Descripción:
h3lis_update()llama asqrtf()dos veces (líneas 115 y 123) dentro de la ISR del SysTick. En Cortex-M4, las operaciones FPU en contexto de interrupción requieren guardar y restaurar los registros de coma flotante (S0-S31, 128 bytes), lo que añade latencia a la ISR y a cualquier ISR anidada. Aunque el impacto en rendimiento es bajo (la FPU del M4 es rápida), contribuye al jitter del sistema. - Impacto: Medio — latencia adicional en ISR. No es un bug funcional pero sí una práctica desaconsejada en sistemas de tiempo real estrictos.
- Mitigación actual: Ninguna.
- Solución propuesta: Marcar la ISR con
__attribute__((naked))y gestionar el contexto FPU manualmente, o mover los cálculos consqrtf()al bucle principal. Alternativamente, usar una LUT parasqrtf()en el rango esperado de operación.
🟢 Leves
SW-01 — Dependencia circular entre delay.h y setup.h
- Archivo:
delay.h:8,setup.h:13 - Descripción:
delay.hincluyesetup.h, ysetup.hincluyedelay.h. Los include guards evitan la recursión infinita, pero esta dependencia bidireccional indica que las responsabilidades no están bien separadas.delay.hsolo necesitastdint.hydwt.h— no necesita incluirsetup.h. - Impacto: Bajo — no causa errores de compilación gracias a los include guards, pero dificulta el mantenimiento y análisis de dependencias.
- Mitigación actual: Include guards (
#ifndef __DELAY_H,#ifndef __SETUP_H). - Solución propuesta: Eliminar
#include "setup.h"dedelay.h. Las dependencias reales sonstdint.hylibopencm3/cm3/dwt.h, que ya están incluidas.
DB-01 — Conversión \n → \r\n comentada en _write()
- Archivo:
usart.c:18-19 - Descripción: La conversión de
\na\r\nestá comentada. En terminales serie que no realizan conversión automática (comoscreenominicomsin flags adecuados), la salida deprintfmostrará un efecto escalera (cada línea empieza donde terminó la anterior en lugar de en la columna 0). - Impacto: Bajo — solo afecta la legibilidad de la salida serie en ciertos terminales. La mayoría de terminales modernos y
pio device monitormanejan\ncorrectamente. - Mitigación actual: El monitor de PlatformIO (
monitor_speed = 115200) típicamente maneja la conversión. - Solución propuesta: Descomentar las líneas 18-19 si se usa un terminal que requiera
\r\n.
SW-02 — Aritmética flotante innecesaria en delay_us()
- Archivo:
delay.c:30 - Descripción:
delay_us()calcula los ciclos de espera con aritmética de punto flotante:Conuint32_t sleep_cycles = (uint32_t)(SYSCLK_FREQUENCY_HZ * ((float)us / (float)MICROSECONDS_PER_SECOND));SYSCLK_FREQUENCY_HZ = 84000000yMICROSECONDS_PER_SECOND = 1000000, esto equivale aus * 84. Se puede reemplazar por aritmética entera:uint32_t sleep_cycles = us * (SYSCLK_FREQUENCY_HZ / MICROSECONDS_PER_SECOND); - Impacto: Bajo — la operación flotante añade algunos ciclos de CPU pero
delay_us()no se usa en la ISR, así que no afecta al tiempo real. - Mitigación actual: Ninguna necesaria — funciona correctamente.
- Solución propuesta: Reemplazar con aritmética entera para claridad y eficiencia.
HW-01 — Múltiples lecturas SPI redundantes de WHO_AM_I en el camino de error
- Archivo:
main.c:19-20 - Descripción: En el camino de error (sensor no detectado),
h3lis_who_am_i()se llama hasta 3 veces: una en la condiciónif, otra en elprintfdelif, y potencialmente otra en elprintfdelelse. Cada llamada realiza una transacción SPI completa. Como el sensor no responde, estas transacciones son tiempo perdido. - Impacto: Bajo — solo ocurre durante el arranque en caso de error.
- Mitigación actual: Ninguna.
- Solución propuesta: Guardar el resultado de
h3lis_who_am_i()en una variable local antes delif:uint8_t who = h3lis_who_am_i(); if (who != H3LIS_DEVICE_ID) { ... }
Documento generado el 2026-06-27. Los issues se añaden y actualizan mediante /doc-review al auditar el código fuente.