Pregunta de firmware integrado: volcado de memoria

Ok, entonces la historia de fondo es esta. Conseguí una entrevista de código en línea con una empresa que permanecerá sin nombre.

Sé que no estoy listo para un trabajo allí, pero básicamente me dieron la oportunidad de una fuente. De todos modos, a continuación hay una imagen de la pregunta.

Tengo experiencia en la programación de registros y en el manejo de microcontroladores, pero todo esto es por mi cuenta, por lo que nunca he visto "código estándar de la industria real", por así decirlo. Definitivamente nunca he tratado con ningún "volcado de memoria" de un microcontrolador, porque bueno, nunca he tenido tal error o incluso sabía que podría hacer eso ...

Mi pregunta es doble... primero son las preguntas de la imagen... si alguien puede responderlas... y mi otra pregunta es... si un microcontrolador falla o algo sale mal y deja de funcionar, entonces cómo hace un volcado de memoria? me parece que requeriría que esté en condiciones de funcionar para ejecutar algo así. de lo contrario, solo obtendrá el volcado de memoria de cómo se veían las cosas "antes" del bloqueo.ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Respuestas (3)

El volcado de memoria en cuestión no se realizó en el momento del bloqueo. Fue tomado para la depuración. Se crea un volcado de memoria 'en caso de bloqueo' para un error de software (excepción) detectado en tiempo de ejecución por el programa o el depurador.

La pregunta es sencilla. El 'volcado' contiene una memoria ocupada por una instancia de la estructura package_S. Solo necesita interpretar los bytes en tipos de datos de variables miembro. Y la estructura es muy simple. Se necesitan 1 + 2 * 2 + 4 bytes.

El contenido de la estructura comienza en 0x1010, por lo que countes 0x6F. Esto no se ve afectado por 'endianes'. Los enteros y largos se ven afectados por el orden de los bytes, por lo que debe interpretarlos para A y B.

¿Entonces eso significa que los datos [0] y [1] serían 0xD5 y 0x70?
no, int son dos bytes
Oh, no, porque los datos son uint16, ¿entonces los datos [0] serían 0xD570? ¿correcto?
depende si el byte final es el primero o el último (endian)
cierto, pero intrínsecamente la pregunta es realmente simple, pero acabo de ver "volcado de memoria" y todas estas líneas y complicaron demasiado lo que estaban preguntando.
busque las opciones del compilador y endians
Esto no es muy correcto. Sin empaquetamiento de estructuras, el compilador alineará todo con límites de 4 bytes. La estructura utiliza 4 * 4 bytes.
@Jon, ¿qué quiere decir con empaque de estructura?
@EdwinFairchild, opciones del compilador mencionadas en la pregunta: desempaquetadas y alineadas naturalmente

Esta es una pregunta con trampa. Sin empaquetamiento de estructura, cada elemento se alineará con un límite de 4 bytes. Esto significa que hay bastantes bytes de relleno en la estructura. Aunque estos no son cero, su valor es irrelevante. También tenga en cuenta que el compilador no puede reordenar los elementos en la estructura. Esta información significa que el diseño de la memoria de la estructura está bien definido.

Little endian significa que la dirección más baja es el byte menos significativo. Entonces podemos calcular los valores de la estructura de la siguiente manera:

count = 0x6f
data[0] = 0x9994
data[1] = 0xb2ca
timestamp = 0x2ec5b98e
En alguna versión del compilador, la estructura "uint16_t data[2]" se empaqueta en dos datos de 16 bits. porque algunos controladores tienen una función ALU con la que pueden trabajar int16 en la tubería.
ahora lo resolviste por él y seguro que no consigue el trabajo, si el empleador potencial encuentra esto
@Juraj oh no, la entrevista ha terminado, graban tu pulsación de tecla y una vez que cierras la ventana, no hay segundas oportunidades jajaja

si un microcontrolador falla o algo sale mal y deja de funcionar, ¿cómo hace un volcado de memoria?

Generalmente no lo hace. Hacer un volcado de memoria amplio de toda la RAM es arriesgado, porque en muchas arquitecturas de microcontroladores, hacer una lectura de ciertas direcciones SFR tiene efectos no deseados, por lo que no puede iterar ingenuamente a través de direccionamiento indirecto en todo el espacio de direcciones de RAM.

Si esto es algo que realmente necesita, una opción es instalar un microcontrolador estilo años 80 con un bus de memoria externo y un perro guardián. Si el perro guardián se agota, tenga un microcontrolador post-mortem secundario que guarde el contenido de la RAM en un chip EEPROM (o lo que sea).