¿Cómo encontrar y superar la corrupción de RAM en tiempo de ejecución en un microcontrolador? [cerrado]

2

¿Cómo puedo encontrar y superar cualquier daño de RAM en un microcontrolador (ARM Cortex M0) durante el tiempo de ejecución? Por ejemplo, si dos o tres ubicaciones están dañadas, diga 0x2E 0x2F, 0x30. ¿Cómo puedo dejar que el sistema se ejecute superando o ignorando esta corrupción?

    
pregunta Arun Joe

7 respuestas

1

Debe elegir la MCU correcta que tenga las funciones que necesita. Aquí es un ejemplo del chip Cortex M0 que tiene tanto EDAC (corrección de errores de un solo bit) como Scrub ( actualización periódica del contenido de la memoria que evita la acumulación de errores).

Si no tiene funciones de hardware de corrección de errores, lo mejor que puede hacer es verificar periódicamente el contenido de la memoria que no se esperaba que cambie y reiniciarse si se detecta un cambio.

    
respondido por el Dmitry Grigoryev
2
  

¿Cómo puedo dejar que el sistema se ejecute superando o ignorando este daño?

En un Cortex M0 general: probablemente no. Si bien esto es más fácil (no es fácil) si tiene una MMU que puede asignar memoria, es probable que su microprocesador ARM no tenga eso. Así que tendría que escribir su software y los scripts de vinculador de una manera que específicamente evite estas direcciones, y compile eso, y ejecútelo en el µC.

  

¿Cómo puedo encontrar ...

Normalmente, ese es el trabajo de los mecanismos de hardware de validación de memoria. En el mundo de PC / Servidor / Estación de trabajo / Computación de estilo clúster, optaría por la memoria ECC y posiblemente incluso por la redundancia de memoria. En las aplicaciones a bordo de vehículos espaciales, es posible que tenga controladores de memoria que tengan una Corrección de errores hacia adelante (FEC) mucho más elaborada en la RAM, el mismo tipo de pensamiento que utiliza el almacenamiento masivo de estado sólido para evitar errores de bits, o su receptor de TV digital. / p>

El problema aquí es: no tiene un controlador de memoria que pueda hacer eso en un Cortex M0. Por supuesto, primero puede comprobar cada región de la RAM contra una suma de comprobación antes de acceder a ella con frecuencia en el software, pero esa será una tarea enorme , y tampoco ayudará si la corrupción de memoria ocurre durante la lectura repetida. o una escritura.

Entonces, si un Cortex M0 ha roto la memoria, se rompe y necesita ser reemplazado.

Lo bueno es que este tipo de chip definitivamente no tiene que mucha RAM, por lo que la probabilidad de error de bit debido a la distribución de Bernoulli causada por "o" ing a muchos "es este bit ¿roto?" las probabilidades no son tan altas Lo que más significa que debe reemplazar el chip en el campo si se ha roto la memoria RAM: hay algo mal con el chip y es difícil predecir qué fallará a continuación.

    
respondido por el Marcus Müller
2

Cortex M0 no tiene funciones específicas de detección de fallas o confiabilidad, como ECC. Hay microcontroladores (basados en Cortex-M7, por ejemplo) que tienen algunas de estas características, estas deberían ayudarlo a mejorar la confiabilidad.

Dejando de lado la causa de los errores (un entorno operativo con alta radiación sería un caso razonable), debe lograr al menos dos cosas. Detección de la falla antes de que se haya hecho demasiado daño a su estado guardado y recuperación del sistema. Estos no son triviales, y el mejor enfoque depende de su aplicación. Las cosas que puedes considerar son:

  • perro guardián
  • Sumas de comprobación ejecutables
  • Duplicación de región de datos y sumas de comprobación
  • Subprocesos o núcleos
  • Validación de datos (repetidamente)

Una vez que se detecta un fallo, lo más sensato es restablecer el núcleo y comenzar de nuevo. Simplemente restablecer el núcleo con un temporizador externo de vez en cuando puede ayudar.

    
respondido por el Sean Houlihane
2

La sobrescritura de RAM puede ser un síntoma de un error de software en lugar de una falla o falla del hardware. Las dos causas más comunes en los programas C incrustados se deben a los punteros y los accesos de matriz fuera de límites. A menudo, las herramientas de depuración le permiten establecer puntos de interrupción en las escrituras de memoria en ubicaciones específicas, por lo que es posible que pueda encontrar la línea del código C que es responsable de la sobrescritura y luego determinar por qué ocurrió este error.

Incluso sin este tipo de soporte, puede reducir las líneas sospechosas al descubrir qué variables o matriz se asignaron justo antes de estas direcciones, ya que esto proporciona una sugerencia. Por ejemplo, si hay una matriz de 8 elementos y cada elemento es de 1 byte, y comienza en 0x2E-0x08 = 0x26, entonces si algún código está escribiendo en esta matriz pero el índice es 9, se sobrescribiría 0x2E. (Tal vez tenga una matriz de estructuras, cada una de las cuales es de 3 bytes, por lo que los "datos erróneos" podrían darle una pista de dónde viene esto).

Sin embargo, si se trata de un puntero sin capitalizar que se está utilizando, es poco probable que el diseño de la memoria sirva de ayuda. Pero aún puede buscar en su código el uso del puntero o utilizar comprobadores de código estático, o los niveles de advertencia del compilador para buscar los punteros que se están utilizando antes de inicializarse con una dirección válida.

Finalmente, si puede producir repetidamente esta sobrescritura pero no puede determinar qué línea de código es la causa, un enfoque de fuerza bruta es eliminar secciones de código que sospeche hasta que lo encuentre. Sin embargo, esto corre el riesgo de perturbar el resto del código tanto que el error se mueve.

En el caso de un error de software, no desea encontrar una manera de dejar que el sistema siga funcionando con tal corrupción; Usted debe encontrar y corregir el error. Si tuviera que configurar las opciones del enlazador para evitar esta área de la memoria, es probable que el error se mueva a otro lugar (siempre que no tenga un hardware defectuoso).

    
respondido por el Martin
0

donde se necesita alta confiabilidad, a menudo, varios sistemas se ejecutan en paralelo y votan sobre las decisiones.

    
respondido por el Jasen
0

Al final, simplemente no puede protegerse contra todos los fallos de memoria. Afortunadamente, estos son extremadamente raros a menos que su dispositivo vaya al espacio.

Usted puede, utilizando ciclos adicionales, protegerse de la corrupción en ciertas partes específicas de la memoria. Por ejemplo, podría guardar varias copias de una estructura de datos crítica, cada una con su propia suma de comprobación. Tendría que acceder a los datos en esta sección a través de subrutinas que actualizan las copias múltiples, calcular las sumas de comprobación y lidiar con las discrepancias.

Muchas de las cosas que se escuchan como estrategias, especialmente para lidiar con fallas en la memoria del programa, empeoran las cosas. Por ejemplo, si su código toma 1 kB, pero con la comprobación de errores toma 2 kB, acaba de duplicar la posibilidad de ser golpeado por un error aleatorio. Cualquiera que sea la comprobación que haga ahora tiene que superar eso solo para compensar. ¿Y cómo se comprueba el corrector? Como dije al principio, simplemente no puede protegerse contra todas las fallas.

Una estrategia más realista es minimizar la posibilidad de falla en primer lugar. Podría usar un microcontrolador antiguo con un tamaño de función más grande. Eso hace que sea menos probable que ciertos eventos puedan cambiar un poco. Los subsistemas de memoria externa pueden tener corrección y detección de errores, hasta cierto nivel de errores.

Si algo se invierte un poco en la ALU o en uno de los registros clave del procesador, se va a atornillar. En algunos casos un perro guardián puede ayudar. Cuando el código ya no borra el temporizador de vigilancia con regularidad, el procesador se reinicia y puedes volver a empezar.

Básicamente, si necesita una confiabilidad extra alta, se logrará mejor con múltiples sistemas redundantes a un nivel más alto que con trucos cutesey en un microcontrolador.

    
respondido por el Olin Lathrop
0

Puede usar la codificación de corrección de errores (ECC) para corregir o detectar errores de memoria. Esto aumentará significativamente el tamaño de la utilización de RAM e introducirá los gastos generales de procesamiento.

ECC funciona utilizando solo un conjunto de palabras disponibles. Como ejemplo, establezca 000 y 111 como palabras válidas. Si lees 101, sabes que esta no es una palabra válida. ECC es un tema amplio con muchos esquemas diferentes de diversa complejidad. El esquema anterior, por ejemplo, se llama código de repetición.

Aunque la probabilidad de obtener un error aumenta, debido al aumento en el uso de la memoria, su capacidad para corregir los errores aumenta más rápidamente. La pregunta es qué tasa de error de bits (BER) puede tolerar mientras se mantiene dentro de sus otras restricciones. Puede seguir aumentando la palabra clave para lograr la BER deseada, sacrificando la eficiencia de la memoria.

    
respondido por el user110971

Lea otras preguntas en las etiquetas