TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado por: elmasvital en 21 de Diciembre de 2008, 11:53:26
-
Estoy haciendo una tarea que requiere máxima sincronización con los tiempos.... Llevo una semana dandole vueltas al asunto porque no me salian las cuentas. Me dejo media salud en ello porque no veo el problema y me encuentro finalmente con esto
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=24215.0;attach=8264)
alguien sabe porqué mete ese nop de mas?
(por si alguien no lo sabe... la ventana de la izquierda es el codigo fuente y la ventana de la derecha Program Memory es el código máquina que realmente tiene grabado el pic desemsamblado)
en el programmers reference manual indica lo siguiente en relacion con el btss
Cycles: 1 (2 or 3 if the next instruction is skipped)... OK pero cuando 2 y cuando 3??? Yo asumía, iluso de mi, que consumiría 1 si no hacia un salto y 2 si hacía un salto (interpreté ese 3 para cuando trabaja en modo 16 bits... pero no).
Otra cosa que no entiendo es cómo el compilador me mete cosas de más que yo no he escrito... Una cosa es que una instrucción consuma mas de un ciclo (porque tenga que cargar el pc, etc etc) pero que te meta instrucciones de mas?
-
bueno he adivinado mas sobre el tema...
efectivamente parece que en los ejemplos que se dan del btsc se ve que si se pone luego un goto indica aparece un espacio en blanco entre el goto y la siguiente instrucción...
no obstante si sustituyo el goto por un bra que igualmente es (o mas bien dicho puede ser) un salto incondicional no aparece el problema que comento.
1 saludo
-
Bueno parece que solucionaste el problema .. sin embargo, el detalle del NOP no es precisamente del BTSC sino del GOTO .. ya que el GOTO necesita de 2 words, es decir, el GOTO + NOP ... mira lo que encontre en el programmers reference, (DS70157C-page 5-122):
Syntax: {label:} GOTO Expr
Operands: Expr may be label or expression (but not a literal).
Expr is resolved by the linker to a lit23, where lit23 ∈ [0 ... 8388606].
Operation: lit23 → PC
NOP → Instruction Register
La primera palabra es el GOTO .. la segunda el NOP.
Mi hipotesis del porque, seria que el GOTO lee de memoria la direccion a donde se debe dar el salto, pero el PC está cargado con la siguiente direccion (que seria el NOP) ahora es hasta el NOP que la direccion de salto se actualiza en el PC. Como diria el chapulin colorado ... "bueno, la idea es esa!"
-
Bueno parece que solucionaste el problema .. sin embargo, el detalle del NOP no es precisamente del BTSC sino del GOTO .. ya que el GOTO necesita de 2 words, es decir, el GOTO + NOP ... mira lo que encontre en el programmers reference, (DS70157C-page 5-122):
Syntax: {label:} GOTO Expr
Operands: Expr may be label or expression (but not a literal).
Expr is resolved by the linker to a lit23, where lit23 ∈ [0 ... 8388606].
Operation: lit23 → PC
NOP → Instruction Register
La primera palabra es el GOTO .. la segunda el NOP.
Mi hipotesis del porque, seria que el GOTO lee de memoria la direccion a donde se debe dar el salto, pero el PC está cargado con la siguiente direccion (que seria el NOP) ahora es hasta el NOP que la direccion de salto se actualiza en el PC. Como diria el chapulin colorado ... "bueno, la idea es esa!"
Todas las instrucciones que implican saltos en el orden de instrucción gastan al menos 2 ciclos de instrucción porque lo que hacen en realidad es cargar en el PC la siguiente linea a ejecutar. Sin embargo en el siguiente caso:
Btss f, #1
goto 0x333
se realizaria siempre en 3 ciclos de reloj porque o bien btss no implica salto y solo gastaría 1 ciclo de reloj o bien btss si salta pero no ejecuta goto por lo tanto 3 ciclos de reloj.
El caso que yo presento aqui es diferente, porque lo que habia visto hasta ahora es que aunque las instrucciones gasten mas de un ciclo de instrucción, ésto no se traducía en que el compilador te añada nops o instrucciones que no has insertado manualmente (en asm8)
De hecho con ese nop no gasta 2 ciclos sino que gasta 3.
lo que no comprendo bien es por qué btss con goto gasta 3 ciclos y con bra 2 ciclos...
-
Cuando usas instrucciones de 2 words el ensamblador coloca la segunda instrucción como NOP. Esto es totalmente normal. Cuando usas BRA no se gasta el ciclo NOP extra ya que BRA se ensambla como un sólo word. El NOP después de cada GOTO no está sobrando como comentas. Es necesario ya que es una instrucción de 2 words y debe ensamblarse de ésa manera. Esto no tiene nada que ver (como justamente infieres) con lo del btfs en sus diferentes estados, sino que la forma en que se ensamblan los words en la memoria requiere este NOP después del GOTO.
-
es cierto lo que mencionas... es cosa dle goto y no del btss... después de unas cuantas horas el cerebro no funciona igual...