Microcontrolador (lpc1347) operación RMW

1

Soy un novato y estoy tratando de entender cómo funciona un registro particular (en lpc1347). Tal vez sea un problema común, tal vez es específico para placas lpc Me gustaría saber cómo funcionan los registros GPIO y PININT, así que empecé a aprender el manual lpc1347, pero estoy atascado en el punto mientras cambio el registro GPIO. Tomemos, por ejemplo, el registro GPIO llamado NOT, que cambia un pin a estado opuesto. Puedo modificarlo de dos maneras:

pointerToGPIO->NOT[0] |= 1 << pin;

o

pointerToGPIO->NOT[0] = 1 << pin;

NOTA: ambos funcionan correctamente. La primera forma se llama (seguramente) lectura-modificación-escritura, porque debo leer NO registrar, hacer O operación y guardarla. La segunda forma es guardar la máscara de pin directamente. He hecho una investigación simple y LPCOpen utiliza la segunda forma:

STATIC INLINE void Chip_GPIO_SetPinToggle(LPC_GPIO_T *pGPIO, uint8_t port, 
                   uint8_t pin)
{
    pGPIO->NOT[port] = (1 << pin);
}

Por supuesto, hay varios registros en el GPIO que debo modificar con máscaras OR / AND ... Mi pregunta es ¿Cómo puedo saber cuándo no tengo que hacer la operación de RMW y modificar el registro directamente? He buscado en el manual, pero no encontré ninguna mención de cómo distinguirlo. ¿Es alguna receta cómo hacerlo correctamente? ¿Debería el manual decirme la verdad o esto es un conocimiento general de cómo distinguirlo?

    
pregunta abba

2 respuestas

0

No hay un método único para ser utilizado; Todo depende de tu aplicación. Si desea establecer un valor directamente y el valor anterior no es útil, asigne directamente porque es más rápido.

Debe hacer RMW cuando desee conservar parte del valor anterior. Digamos que tiene un registro de 32 bits donde cada bit es el estado de un GPIO (salida 1 o 0). Si desea modificar solo el bit 0, utilizará RMW como:

PORTX |= 0x00000001; // Set bit 0.
PORTX &= 0x00000001; // Clear all but bit 0.
PORTX &= ~0x00000001; // Clear bit 0, but keep others.
PORTX ^= 0x00000001; // Toggle state of bit 0 whatever it is.

Como puede ver, usando RMW, puede mantener el estado anterior de otros bits si lo desea. Por lo tanto, si crea diferentes módulos independientes, puede usar RMW para modificar sus bits sin tener que preocuparse por el estado de los bits establecidos por otros módulos en su código. Sin embargo, usar RMW es un poco más lento que la asignación directa.

Ahora, algunas CPUs integran registros especiales para realizar un tipo de RMW sin tener que leer los registros como con su chip. El "NO" se debe a que su chip tiene un registro especial cuyo propósito es borrar los bits que haya establecido. Si bien esto es común en los microcontroladores ARM, no es el caso de todos los microcontroladores. Dichos registros especiales permiten realizar un RMW de hardware, por lo que no hay una penalización de rendimiento como con el software RMW. El microcontrolador de gama baja no integra dicha función porque requiere más transistores y la complejidad del hardware de chip es mayor.

Para responder a su pregunta directamente: ambos son RMW. Uno es el software implementado (primero) y el otro es el hardware implementado. Debe utilizar hardware siempre que sea posible. En tu chip está disponible. En el hardware de gama baja, tendría que utilizar la técnica del software.

    
respondido por el Mishyoshi
0
  

¿Cómo puedo saber cuándo no tengo que hacer la operación de RMW y modificar el registro directamente? He buscado en el manual, pero no encontré ninguna mención de cómo distinguirlo. ¿Es alguna receta cómo hacerlo correctamente? ¿Debería el manual decirme la verdad o esto es un conocimiento general de cómo distinguirlo?

De LPC1315 / 16/17/45/46/47 Manual del usuario , sección 9.5.3.9, (página 132) puede ver los registros NOT0 / 1:

  

"0 = sin operación"

     

"1 = Activar bit de salida".

Por lo tanto, los bits en 0 no se tocan, los bits en 1 se modifican.

Estosdosregistrosparticulares(asícomootros)tambiénsemarcancomosoloescritura.Realizarunprogramadelectura-modificación-escrituraseríasolounapérdidadetiempo.Elcompiladornosabequelaubicaciónessolodeescritura,porlotanto,enrealidadharáunalecturainútil(queprobablementeserá0),porquetambiénNOT[0]sedefinecorrectamentecomo"volátil".

EDITAR: @Chris Stratton sugirió que, en realidad, la operación de lectura de un registro de solo escritura podría generar basura (a menos que el manual indique que el microcontrolador implementa un "0 en la lectura de registros de solo escritura"). Esto podría ser muy peligroso, porque ese resultado se usará para calcular el valor de escritura real.

    
respondido por el next-hack

Lea otras preguntas en las etiquetas