¿Se garantiza que este código solo afectará al pin 22?
int* FIO0PIN = (int*)0x2009C014;
*FIO0PIN ^= (1<<22);
Al principio parece una pregunta tonta, pero recuerdo que trabajé con un microcontrolador PIC18 en el que podría dañar la salida del puerto al hacer esto. La corrupción ocurrió cuando una escritura anterior en el latch de salida aún no se reflejaba en el estado de salida (el pin está impulsando una carga capacitiva), XOR en un bit no relacionado significaba leer el puerto, hacer el XOR y volver a escribir en el latch de salida (con el antiguo valor de dicho pin no relacionado).
int* FIO0PIN = (int*)0x2009C014;
*FIO0PIN &= (1<<4); //set bit 4
*FIO0PIN ^= (1<<22); //if pin 4 has not yet transitioned to 1 because of capacitive load
//will this clear it again?
¿Cómo evita el Cortex este problema? ¿O lo hace?
Soy consciente de los registros FIOxSET y FIOxCLR, sin embargo, la activación de bits a través de ellos es mucho menos eficaz si uno no conoce el valor actual del bit en cuestión. Estoy escribiendo un lenguaje específico de dominio utilizando la programación de C ++ que resume todas las funciones básicas de IO y realiza las optomizaciones en conjuntos de ellas. Con las partes de LPC11xx, la implementación del bit toggeling es súper fácil, solo uso el registro dedicado, me gustaría obtener la implementación de LPC17xx lo más eficiente posible.
Aquí está el código en caso de que alguien esté interesado: enlace la fábrica de "makeToggle" crea la "acción de registro" aquí enlace utilizando una especialización de plantilla aquí enlace Actualmente hago una XorAction de este chip, sin embargo No estoy seguro de si es correcto.
Soy consciente de que el FIOxPIN está en la zona direccionable de la banda de bits, sin embargo, según UM10360.pdf página 749 "Los accesos de datos a esta región se vuelven a correlacionar con la banda de bits región. Una operación de escritura se realiza como leer-modificar-escribir. Los accesos de instrucciones no están permitidos ", lo que, en mi opinión, sería tan susceptible al problema mencionado anteriormente.