Microchip: bugs en el silicio
Posted by Rodrigo G. on 20th July 2007
Actualmente en mi trabajo estoy desarrollando sistemas embebidos basados en microcontroladores (uC) PIC de la empresa Microchip, en particular estoy usando el 18F6722. La aplicación que estoy desarrollando, como tantas otras, necesita guardar el valor de algunas variables en una memoria no volátil, por lo que decidí codear algunas rutinas para grabar datos en la memoria EEPROM del PIC. Como buen desarrollador que soy (autobombooo), decidí primero leer el manual del integrado (¡estas son cosas que uno aprende a la fuerza !). En la sección referida al manejo de la memoria EEPROM el documento hace referencia a una misteriosa especificación llamada specification D124. Buscando y buscando me topé con un documento de la gente de Microchip llamado PIC18F6620/8620/6720/8720 Rev. A3 Silicon/Data Sheet Errata. Mmmm… ¿errata?… esto huele mal. Este documento es un compendio de errores que se encuentran en el manual de estos PIC’s y eventuales errores en su funcionamiento.
Aparece la especificación que estaba buscando, la cual indica la cantidad de veces que Microchip garantiza que se puede borrar/grabar un byte de memoria EEPROM en forma confiable (entre 1 y 10 millones de veces), los cuales son valores estándares, o sea, nada nuevo aquí. Saciada mi curiosidad, seguí leyendo el documento y me encontré con cosas realmente aterradoras.
Una de ellas es la siguiente: si la primera instrucción que se pone en la dirección de RESET de la memoria ROM del PIC (dirección 0×0000) es un GOTO, esta instrucción en contados casos no se ejecuta, lo que implica que el sistema NO arranca, algo para nada trivial. En código ensamblado:
GOTO main;
Por suerte la gente de Microchip nos tira un work around, o dicho en castellano una forma de safar de este posible problema, muy pero muy pero muuuuuuy ingeniosa, la cual no es más ni menos que poner un NOP como primera instrucción en lugar del GOTO. Qué genialidad !
NOP
GOTO main;
Suena un poco a tomada de pelo, pero es lo que aconsejar hacer. De todas formas generalmente la primera instrucción que se pone en la dirección de RESET de un microcontrolador es aquella que deshabilita todas las interrupciones, para de esta forma inicializar a nuestro gusto los periféricos del uC y algunas variables sin que algo venga a “golpearnos la puerta”.
CLRF INTCON,A
GOTO init;
Si uno sigue leyendo esta fe de erratas se puede encontrar con otros bugs escalofriantes ¿Quién dijo que sólo el software tiene bugs? No señor, a veces también vienen en encapsulados de plástico con patitas.
Tags: dev, uC
Posted in I+D | No Comments »
