Autor Tema: Problema con ASM30. NOP's que sobran  (Leído 2602 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Problema con ASM30. NOP's que sobran
« 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



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?
« Última modificación: 21 de Diciembre de 2008, 12:18:32 por elmasvital »

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Re: Problema con ASM30. NOP's que sobran
« Respuesta #1 en: 21 de Diciembre de 2008, 15:13:07 »
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

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Problema con ASM30. NOP's que sobran
« Respuesta #2 en: 21 de Diciembre de 2008, 15:39:40 »
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!"




Control Automático, DSP & Microcontroladores

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Re: Problema con ASM30. NOP's que sobran
« Respuesta #3 en: 21 de Diciembre de 2008, 16:07:28 »
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...

jacrmr

  • Visitante
Re: Problema con ASM30. NOP's que sobran
« Respuesta #4 en: 22 de Diciembre de 2008, 04:28:35 »
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.
« Última modificación: 22 de Diciembre de 2008, 04:41:01 por jacrmr »

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Re: Problema con ASM30. NOP's que sobran
« Respuesta #5 en: 22 de Diciembre de 2008, 07:36:18 »
es cierto lo que mencionas... es cosa dle goto y no del btss... después de unas cuantas horas el cerebro no funciona igual...

« Última modificación: 22 de Diciembre de 2008, 07:40:21 por elmasvital »