Distinguir entre problemas de hardware o firmware

1

Estoy escribiendo un firmware para CC3220SF desde TI utilizando una placa personalizada que he diseñado. Me enfrento a un comportamiento extraño y no estoy seguro de si se trata de hardware o firmware relacionado.

Aquí estoy buscando algunos consejos sobre cómo investigar más en esta situación.

Básicamente, mi aplicación sigue este patrón:

  1. se despierta de la hibernación
  2. lee el RTC interno
  3. adquiere algunos sensores
  4. los envía a una nube
  5. vuelva a leer el RTC si es necesario
  6. vuelve a hibernar

nada nuevo, lo sé. El problema es que, a veces, las lecturas de RTC son incorrectas. Con "incorrecto" me refiero a que durante las llamadas subsiguientes (incluso en la misma ventana activa) los valores de lectura están en el futuro (es decir, 2022), pero luego vuelven a los correctos.

Un ejemplo de mis registros:

[SYS] SlDateTime_t: 2017/11/28 23:16:5                                                                                                                                              
[SYS] struct tm: 117/10/28 23:16:5                                                                                                                                                  
[SYS] time_t   : 1511910965      
...
[SYS] SlDateTime_t: 2022/3/1 9:58:17                                                                                                                                                
[SYS] struct tm: 122/2/1 9:58:17                                                                                                                                                    
[SYS] time_t   : 1646128697         
...
[SYS] SlDateTime_t: 2017/11/28 23:16:9                                                                                                                                              
[SYS] struct tm: 117/10/28 23:16:9                                                                                                                                                  
[SYS] time_t   : 1511910969  

aquí el código que estoy usando para probarlo:

time_t _GetEpoch(void)
{
    _i16 ret;
    _u8 pConfigOpt = SL_DEVICE_GENERAL_DATE_TIME;
    _u16 pConfigLen = sizeof(SlDateTime_t);

    SlDateTime_t dateTime = {0};
    ret = sl_DeviceGet(SL_DEVICE_GENERAL, &pConfigOpt, &pConfigLen, (unsigned char *) &dateTime);
    ASSERT_ON_ERROR(ret);

    struct tm t;
    time_t t_of_day;

    t.tm_year = dateTime.tm_year - 1900;
    t.tm_mon = dateTime.tm_mon - 1;
    t.tm_mday = dateTime.tm_day;
    t.tm_hour = dateTime.tm_hour;
    t.tm_min = dateTime.tm_min;
    t.tm_sec = dateTime.tm_sec;
    t.tm_isdst = -1;
    t_of_day = mktime(&t);

    UART_PRINT("[SYS] SlDateTime_t: %d/%d/%d %d:%d:%d\r\n", dateTime.tm_year, dateTime.tm_mon, dateTime.tm_day, dateTime.tm_hour, dateTime.tm_min, dateTime.tm_sec);
    UART_PRINT("[SYS] struct tm: %d/%d/%d %d:%d:%d\r\n", t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
    UART_PRINT("[SYS] time_t   : %lld\r\n", t_of_day);

    return t_of_day;
}

Mis pensamientos:

  • Estoy afirmando contra los errores devueltos por sl_DeviceGet() , por lo tanto, la función se ejecuta correctamente
  • en los registros, verá que el error está en la estructura SlDateTime_t que devuelve la función sl_DeviceGet() , por lo tanto, no está relacionado con mktime o mi otra parte del código
  • por otro lado, si la próxima lectura es correcta, no parece ser un problema de hardware porque esperaría una corrupción de los valores también en las siguientes lecturas. En su lugar son correctos.

La última prueba fue un bucle infinito donde leí 100 veces el RTC, luego fui a la hibernación y otra vez. Los resultados confirmaron que una lectura entre 100 es incorrecta. ¡Los otros son correctos!

ACTUALIZACIÓN

Después de desconcertarme un poco, descubrí lo siguiente:

  • con el código de prueba obtuve 250 valores incorrectos en lecturas de menos de 60k
  • la diferencia entre un valor incorrecto y la lectura inmediatamente anterior o siguiente es siempre 134.217.728 segundos en el futuro.
pregunta Mark

1 respuesta

3

Aquí hay algunas reglas básicas:

  1. Normalmente es un problema de firmware.

  2. Las fallas de hardware intermitentes a menudo se pueden hacer menos intermitentes al cambiar la temperatura, el voltaje, la frecuencia de reloj u otras condiciones de operación. (Algunos errores de firmware son así, si su comportamiento depende del estado del hardware).

  3. Las fallas brutas de hardware suelen ser bastante sencillas. Si algo básico se rompe, y la sustitución de la unidad lo soluciona, fue un fallo de hardware.

  4. Conoce el hardware y el código. Un buen conocimiento de las partes interactivas del sistema es vital.

  5. A veces, un error de firmware puede parecer un problema de hardware (por ejemplo, infracciones de tiempo). Agregar retrasos en su firmware o disminuir la frecuencia de la CPU a veces puede ayudar a identificar el error.

  6. Intente reducir el subsistema exacto que está fallando. Si es un módulo interno, asegúrese de que sus registros de lectura y escritura estén funcionando correctamente. Si se está comunicando a través de un bus serie, verifique el bus con un osciloscopio.

  7. Si su firmware produce un valor decimal incorrecto, conviértalo en hexadecimal para buscar bits invertidos y bytes sin inicializar.

En su caso específico, parece que se invierte un bit en el byte más significativo (0x08000000). Sin duda, esto podría ser un error de hardware, pero para demostrarlo deberá verificar que está hablando con el módulo correctamente. Yo sugeriría que primero revise la hoja de datos para asegurarse de que haya configurado el RTC correctamente y que no esté violando ninguna restricción. Si tiene otro CC3220, vea si puede reproducir el fallo en él. De lo contrario, intente reducir la velocidad del reloj para ver si la falla está relacionada con la sincronización. Si puede ajustar los voltajes de suministro, intente correr a los voltajes mínimos, máximos y nominales de cada suministro y vea si la tasa de fallas es diferente. Ver el código fuente de sl_DeviceGet () también podría ser útil.

Si intenta leer el RTC lo más rápido posible, ¿ve muchas fallas seguidas (lo que podría significar un breve período de falla del hardware) o están más dispersas?

    
respondido por el Adam Haun

Lea otras preguntas en las etiquetas