¿Cómo, por ejemplo PortB.B0 = 1; comando cambiar el estado de un pin específico en un microcontrolador.
El microcontrolador generalmente tiene una línea de datos de 8 bits, lo que significa que escribirá y leerá desde todo el puerto simultáneamente. Mi pregunta es, ¿es el trabajo del compilador leer todo el puerto , configurar el bit especificado y escribir el byte completo en el puerto o puede el microcontrolador cambiar un solo bit por sí solo?
Supongo que está hablando de los registros PORT en los PIC comunes de pasatiempos. Estos chips tienen un conjunto de niveles de bits e instrucciones claras, y se puede esperar que un compilador traduzca
PuertoB.B0 = 1;
a
PUERTO BSF, 0
PERO PERO PERO PERO PERO PERO
Estas instrucciones de establecimiento y borrado de bits se ejecutan como un ciclo completo de lectura, modificación y escritura de 8 bits. La CPU lee el puerto de 8 bits, borra el bit más bajo y vuelve a escribir el resultado. Esto sería solo de interés académico si no fuera por el hecho de que leer PORTB lee los niveles lógicos en los pines de los chips. (En la mayoría de las otras arquitecturas, leería el registro de salida PORTB). Cuando el pin está tan cargado que su nivel externo no lee el nivel donde el búfer de entrada lo reconoce correctamente, el valor leído puede diferir del valor escrito por última vez. él. Este es el temido problema de lectura-modificación-escritura. La solución canónica es realizar sus operaciones de bits en una ubicación de RAM (llamada la sombra del puerto) y luego escribir el búfer de sombra en el puerto usando operaciones normales de 8 bits.
Si no utiliza este enfoque canónico, vivirá tiempos interesantes: configurar un pin más en un puerto de salida puede, por ejemplo, borrar los pines que configuró anteriormente. Y, por supuesto, lo hará solo en una situación de producción, nunca en su banco de pruebas.
nota al margen: en el lenguaje Jal (que diseñé e implementé hace mucho tiempo, ahora lo mantienen otros) hay algo de magia de lenguaje y biblioteca para hacer
pin_a_5 = true
significar
port_a_shadow |= (1 << 5 )
port_a = port_a_shadow
Nota al margen 2:
Los PIC modernos tienen un registro LAT para cada puerto. La lectura de estos registros produce el último valor que se escribió en ellos, por lo que no sufren el problema de lectura, modificación y escritura. AFAIK Jal en esos chips no se molesta en usar un registro de sombra.
Si observa el desensamblaje de esa línea de código, lo más probable es que se compile hasta bsf LATB,0
. Esa es la instrucción de conjunto de bits. La forma en que los compiladores manejan este tipo de escenario varía según la arquitectura del procesador. Cada compilador y conjunto de instrucciones es diferente.
Andy alias
adam lorenzo
kenny