MSP430 Instrucción ilegal

3

Algunas preguntas aquí en la misma línea, estoy mirando la hoja de datos de la familia MSP430x2xx (estoy usando el MSP430F235 FWIW). Dice allí en la sección 2.2.4 que "búsqueda de instrucción ilegal" es una fuente de interrupción para el vector de reinicio. Luego, por separado bajo 2.2.1 bajo el tema de Interrupciones no enmascarables (NMI), "una violación de acceso a la memoria flash" se cita como fuente.

(1) ¿Puede alguien explicarme la diferencia entre (y / o las causas de) estas dos fuentes de eventos aparentemente distintas (con diferentes consecuencias aparentemente diferentes)?

(2) ¿Puedo escribir un ISR para la fuente de NMI y hacer que actúe como un reinicio suave reinicializando el puntero de pila y "recursivamente" llamando a main o algo así, para que el registro y la RAM (variable global) estado no esta alterado?

(3) Suponiendo que no puedo interceptar el que resulta en un vector de reinicio (que supongo que también viene junto con una reinicialización de todos los registros), ¿puedo al menos detectar al inicio que sucedió al verificar algunos bit de estado para decidir qué hacer al respecto, y si es así, ¿qué registro / bit de estado sería?

    
pregunta vicatcu

1 respuesta

3

Instrucción ilegal significa que lee un código de operación, pero ese código de operación no coincide con ninguna instrucción de máquina válida.

Violación de acceso significa que intentó utilizar un tipo de acceso a memoria que no es compatible con el dispositivo. Para un flash, eso generalmente significa que intentó escribir en él sin usar el procedimiento adecuado para escribir o borrar una página.

La violación de acceso también puede significar que intentó ejecutar una instrucción privilegiada mientras estaba en modo de usuario, aunque no estoy seguro de que MSP430 admita esto.

Otro ejemplo de violación de acceso es tratar de obtener códigos de operación de una región de memoria marcada como no ejecutable, aunque dudo que el MSP430 tenga este tipo de soporte de protección de memoria.

  

¿Puedo escribir un ISR para la fuente de NMI y hacer que actúe como un reinicio suave reinicializando el puntero de pila y "recursivamente" llamando a main o algo así, de modo que el estado de registro y RAM (variable global) no esté t alterado?

Buscaría una nota de la aplicación o algo en la hoja de datos que diga cómo hacerlo. En general, saltar a main() no funciona. Por lo general, desea desactivar todas las interrupciones, inicializar el puntero de la pila y saltar al vector de reinicio. Es posible que deba restablecer los registros del modo procesador o los registros de control también. De esta manera, se ejecuta el código que configura las cosas antes de llamar a main() .

  

Suponiendo que no puedo interceptar el resultado de un vector de reinicio (que supongo que también viene con una reinicialización de todos los registros), ¿puedo al menos detectar en el inicio que sucedió al verificar algunos bits de estado para Decida qué hacer al respecto y, en caso afirmativo, ¿qué registro / bit de estado sería?

Sé que el AVR de Atmel tiene un registro que puede leer que le indica por qué se reinició. No estoy seguro sobre el MSP430.

    
respondido por el Mike DeSimone

Lea otras preguntas en las etiquetas