Autor Tema: #Byte?  (Leído 2080 veces)

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

Desconectado fitson

  • PIC10
  • *
  • Mensajes: 38
#Byte?
« en: 06 de Agosto de 2017, 17:33:33 »
Hola me gustaría saber la diferencia que hay entre declarar con la directiva #Byte y crear un puntero a tal dirección.
La única diferencia que he visto de momento es que #Byte carga mucho antes que el puntero, pero no noto ninguna diferencia más.
« Última modificación: 06 de Agosto de 2017, 17:40:09 por fitson »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:#Byte?
« Respuesta #1 en: 06 de Agosto de 2017, 18:07:06 »
Pienso que #byte es tratado como un ALIAS a esa direccion. Supongamos

#byte var = 0x6

Cuando use var en alguna instruccion va a suplantar ese valor directamente. En C suponete que tenes:

var = 10;

Esa instruccion solo haria que guarde el valor en 0x6, sin previamente pasar por nada. Funciona como un puntero.
En ASM verias que se carga el valor 10 en W y luego lo pone en la direccion 0x06.

El puntero por su parte ocupa espacio fisico, si el puntero es constante sera en la FLASH y si no lo es sera en la RAM.
Puede considerarse de 2 formas. Si es const, el compilador puede interpretarlo de la forma que explique el #byte, esto ocurre en C++ por ejemplo y no reservaria lugar en la FLASH, pero en C usualmente este puntero se guarda en la Flash, sin optimizaciones va a hacer que el programa busque el valor del puntero lo cargue en los registros para determinar a donde debe guardarlo, ya que el compilador no conoce el valor de ese puntero ni le interesa, asi poder tratar a todos los punteros por igual.
En caso de que no sea constante, existe la posibilidad de cambiarle el valor, y eso indica que debe tratarse de forma general por lo cual hay mas pasos involucrados tal y como lo dije antes.

Si queres sacarte la duda podes subir un .hex con un ejemplo muy simple ( sin ningun agregado ) en el que uses #byte y luego uses un puntero, para ver la diferencia que genera el compilador.

Desconectado fitson

  • PIC10
  • *
  • Mensajes: 38
Re:#Byte?
« Respuesta #2 en: 06 de Agosto de 2017, 18:31:18 »
He compilado el código con ccs para tener el .cof y poder depurar en el proteus.
Los resultados han sido extraños.

Como dijistes el puntero ocupa espacio y lo he podido ver y el lugar que ocupa guarda la dirección donde apunta.
sin embargo #Byte parece que provenga de otra memoria porque no se puede localizar en los registros, lo único que puedo ver en el mapeo de variables que esta mirando a la dirección de los registros PORTB pero nada de la ubicación de esta.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:#Byte?
« Respuesta #3 en: 06 de Agosto de 2017, 18:47:20 »
Es que no necesitas memoria. Es una simple sustitucion pensalo como que funciona como un "#DEFINE" pero en este caso es registro. Cada compilador posee su forma de hacerlo.

En XC8 no usa la directiva BYTE, sino que al definir una variable hace uso del arroba @ para indicarle al compilador que esa definicion que no ocupa espacio fisico esta ya "pre creada" en esa direccion. Por eso puedo usar PORTA o PORTAbits.RA0

CCS no posee manejo de registros, es mas te lleva a intentar no usarlos, para eso te provee funciones para que nunca tengas que saber que registros modificar, simplemente conociendo las funciones es suficiente, el compilador hace el resto. Es mas, PIN_A0 por ejemplo es un numero en CCS, que luego el compilador interprete a que PIN te referias y genere el codigo para ese solo pin es tema del compilador.


 

anything