Arduino vs PIC nop. ¿Es la misma cosa?

Si tengo la siguiente línea de código en un proyecto basado en Arduino:

__asm__("nop\n\t");

¿Tendrá esto exactamente el mismo efecto que nop en PIC12F675? ¿Importa que el PIC en cuestión y el Arduino puedan operar a diferentes velocidades?

Solo me preguntaba por qué se eliminó el enlace que tenía aquí a una pregunta anterior de donde procedía el código. Lo siento, soy bastante nuevo aquí.
@stevenvh se trataba de construir un transmisor IR (en lugar de un robot), y era la fuente del código PIC que proporcionaba como referencia. Gracias

Respuestas (2)

A NOPgeneralmente toma 1 ciclo de instrucción . El PIC12F675 parece dividir el reloj por cuatro para un ciclo de instrucción:

"Un ciclo de instrucción consta de cuatro períodos de oscilador; para una frecuencia de oscilador de 4 MHz, esto da un tiempo de ejecución de instrucción normal de 1 m s." (hoja de datos p. 71)

Entonces, un reloj de 20 MHz le dará un retraso de 200 ns (4/20 MHz).

ingrese la descripción de la imagen aquí

El AVR utilizado en Arduino OTOH ofrece 1 MIPS/MHz, por lo que a 20 MHz de reloj lo más probable es que dé un retraso de 50 ns (1/20 MHz).

esto es perfecto, puedo ajustar mi código para atender estos cambios. ¿Hay un conjunto de términos o áreas temáticas que pueda investigar que expliquen más estos conceptos? Su respuesta responde perfectamente a mi pregunta, solo me refiero a una mayor educación de mi parte. Gracias.
En investigaciones posteriores, parece que el retraso es de 62,5 ns: arduino.cc/playground/Main/AVR
Vaya, bueno, ahora estoy confundido :) 250ns parece mucho
gracias de nuevo por una gran información. Una pregunta 'sub' relacionada, ¿hay alguna manera de probar esto sin un osciloscopio?
@ElectroNoob - Sí. Cree un retraso prolongado con varios bucles anidados, digamos 10 segundos y encienda un LED durante ese tiempo. Luego agregue el NOP en su ciclo más interno y cuente cuántas veces se ejecuta ese ciclo. Si eso es 10 000 000 veces, el retraso se habrá extendido de 10 segundos a 12,5 segundos.
@stevenvh: Sí, este PIC usa 4 ciclos de reloj por ciclo de instrucción. Algunas de las partes principales de 24 bits, como la otra pregunta, eran sobre el uso de 2 ciclos de reloj por instrucción. Sin embargo, la serie 30F, que también es una parte central de 24 bits, utiliza 4 ciclos de reloj por ciclo de instrucción. Tienes que revisar la hoja de datos.
@stevenvh: Eso habla de arduinos, que no me importan, y AVR, con los que no estoy familiarizado, así que no puedo decir si está mal o no.
@ElectroNoob - ¡No, me confundiste! El 62.5 ns es correcto. Pensé que todavía estábamos hablando del PIC. ¡Pero Arduino es AVR! Y eso hace 1 MIPS/MHz, como también dije en mi respuesta. ¡Perdón por la confusión!

Cada procesador tiene su propio conjunto de instrucciones y, por lo tanto, su propio lenguaje ensamblador. En realidad, puede haber diferentes ensambladores para el mismo procesador, cada uno con una sintaxis un poco diferente. Es el ensamblador el que especifica qué nombres debe proporcionar para indicar instrucciones particulares. Por lo general, los ensambladores usarán los mismos nombres para las instrucciones (llamados mnemónicos de instrucción ) que usa la documentación para el procesador, pero no siempre es así. Está preguntando acerca de las instrucciones en dos procesadores diferentes que usan diferentes ensambladores, por lo que, en general, no puede asumir ninguna similitud solo porque los nombres son los mismos.

Sin embargo, a lo largo de los años han surgido algunos nombres de instrucción comunes (aunque ciertamente no estándar). Uno de esos nombres es NOP, que se refiere a Sin operación . La mayoría de los procesadores tienen una instrucción que no hace nada y la mayoría de los ensambladores llaman a esta instrucción NOP. Sin embargo, nuevamente, no hay garantía de que esto sea cierto para ningún ensamblador, por lo que siempre debe verificar en lugar de asumir.

No estoy familiarizado con el conjunto de instrucciones AVR, y ciertamente no estoy familiarizado con él tal como lo presentan las herramientas arduino. Por lo tanto, no sé qué hace el arduino NOP al que te refieres. Si de hecho simplemente toma un ciclo de instrucción y no hace nada más como sugiere el nombre NOP, entonces sí, tiene el mismo efecto que la instrucción NOP PIC 12F675 (en realidad, un dispositivo central de 14 bits). En los dispositivos tradicionales de núcleo de 14 bits de PIC, NOP toma una sola palabra de instrucción y se ejecuta en un solo ciclo de instrucción.

Los NOP generalmente se usan para insertar esperas cortas en el código, como esperar un microsegundo para que se establezca una línea. Por cierto, en este PIC, si desea desperdiciar 2 ciclos de instrucciones, puede hacerlo con la única instrucción "GOTO $+1" con algunas restricciones que no vale la pena mencionar aquí.

El 6809 (el 8-bit más hermoso de la historia) tenía una instrucción BRN (Branch Never), debido a la ortogonalidad del conjunto de instrucciones: había un BRA (BRanch Always), y cada instrucción de rama tenía su complemento, por lo que también estaba el BRN.
@stevenvh: La serie NMOS 6502 tenía algunos códigos de operación no documentados que procesaban un operando de memoria e ignoraban el resultado. Un "nop 0" era una instrucción de dos bytes que tardaba tres ciclos en ejecutarse (a diferencia de "nop", que era de dos bytes/dos ciclos). Útil como parte de un retardo de número impar de ciclos. Había un código de operación de no hacer nada que era de dos bytes/dos ciclos. Una "lectura de memoria absoluta e ignorar el resultado" podría ser útil como medio para omitir una instrucción de dos bytes. Las instrucciones "BIT zp" y "BIT abs" eran instrucciones documentadas que leían la memoria y solo afectaban a las banderas.
@stevenvh: Las instrucciones BIT se usaban a menudo en el pasado, ya que no había soporte para las indocumentadas. Tenga en cuenta que, a veces, omitir instrucciones (o incluso usar "nop 0") podría causar problemas si el ciclo de lectura resultante afectara accidentalmente al hardware (p. ej., se encontraría con un registro de estado de interrupción "clear on read").
MC6800 tenía una duración infinita "NOP" :-) - también conocido como HCF o "Halt & Catch Fire" = $dd. Implementarlo y el software sabio "no hizo nada" durante mucho tiempo. Sin embargo, las líneas de dirección contaban a la velocidad del reloj (Reloj/4 en MC6802), lo que resultó muy útil para las pruebas del decodificador de direcciones y similares. Un código útil para eventos de "tirar las manos y alejarse" y trampas de memoria. Rellene la memoria no utilizada con $dd. Si el procesador alguna vez dejara el universo, seguramente no volvería a entrar aleatoriamente en otro lugar. Si esto era una buena idea dependía en la aplicación, etc