Autor Tema: Problemas con RAM en el CCS  (Leído 6179 veces)

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

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Problemas con RAM en el CCS
« Respuesta #15 en: 13 de Mayo de 2009, 18:08:08 »
Viendo el ensamblador es más claro.

Pero no creo que CCS esté ignorando el int8, en mi opinión es correcto.

Por ejemplo, si yo pongo...

Código: [Seleccionar]
float *valor;
Lo que CCS va a hacer es una variable apuntador de 9 bits (2 bits banco + 7 bits dirección) que indique el comienzo de una variable float normal, por lo que el apuntador tendrá un tamaño de 16bits (necesita 9 pero habrá que usar dos bytes para llenarlo) y no de 4 bytes.

En estas condiciones me atrevo a decir que para todos los siguientes apuntadores...

Código: [Seleccionar]
int8 *ent1;
int16 *ent2;
int32 *ent3;
float *valor1;
char *valor2;

... CCS siempre apartará 2 bytes ya que la máxima dirección ram direccionable para ellos siempre es de 9 bits.

Pero ahora que nos ponemos quisquillosos... ¿qué pasará con un apuntador a int1? Bueno, nada... porque la gente de CCS todavía no se anima a implementarlos  :D Ya existen los arreglos de int1, pero no se vale usarlos apuntados.

Código: [Seleccionar]
int1 superbits[20]; //Válido
int1 *apunta;        //Inválido

Por cierto, con tu ejemplo en ensamblador resolví otra duda que ya tenía hace tiempo... ¿qué endian usa CCS? Se ve que el 0x0100 se guarda en little endian. Primero el 0x00 y después el 0x01.  :wink:
« Última modificación: 13 de Mayo de 2009, 18:22:32 por migsantiago »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problemas con RAM en el CCS
« Respuesta #16 en: 13 de Mayo de 2009, 18:44:32 »
Si, es verdad lo que decís. Se me chispoteó. :D
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Problemas con RAM en el CCS
« Respuesta #17 en: 13 de Mayo de 2009, 19:05:06 »
Una cosa que yo aprendí es que el size del puntero no tiene que ver con el tipo de datos del puntero. Cuando se declara un puntero con un tipo de datos, al recorrerlo, se incrementa en el ancho dado por el tipo de datos.

y el ccs adopta por default el size de 2 bytes (aunque es posible cambiárselo por directivas)

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problemas con RAM en el CCS
« Respuesta #18 en: 13 de Mayo de 2009, 19:19:48 »
Exáctamente Pedro. El tipo de datos con el que se declara al puntero sirve para saber en cuántas direcciones de memoria deberá incrementarse o decrementarse el puntero si fuese necesario. Buen dato.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Tulkas

  • PIC10
  • *
  • Mensajes: 14
Re: Problemas con RAM en el CCS
« Respuesta #19 en: 14 de Mayo de 2009, 07:09:31 »
Hola chicos, gracias por responder.

Lo que no entiendo ahora es que si yo quiero almacenar 512 bytes de datos y cada dato es de 1 byte, si creo un puntero de 16 bits y hago  *(ptr+1), pasará por ejemplo de la posición de memoria 0x300 a la 0x301 o hará un salto de 2 bytes y estaríamos en la 0x302?. Si esto es así, como podría incrementar el puntero en 1 byte pero llegando a superar los 256 bytes de ram?

Muchas gracias.

Un saludo.



Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problemas con RAM en el CCS
« Respuesta #20 en: 14 de Mayo de 2009, 13:15:19 »
Hola!

Vamos a resumir la cosa:

Cuando un declara un puntero, lo hace de esta manera:

tipo *nombre_puntero;

"tipo" es el que le indica al compilador de qué tamaño es la variable o estructura a la que apunta. Esto sirve para que el compilador sepa en cuántas direccionas debe incrementar el puntero si deseas incrementarlo, cuántas(posiciones) restar en caso de querer decrementarlo, etc...

Y nombre_puntero es un nombre que uno elije.

El tamaño del puntero es elegido por el compilador automáticamente.

Si vos declarás:

int8 *ptr;                   
ptr=0x300                  //ptr=0x300
ptr++;                       //ptr=0x301

En cambio si hacés, por ejemplo:

int32 *ptr;                   
ptr=0x300                  //ptr=0x300
ptr++;                       //ptr=0x304

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Problemas con RAM en el CCS
« Respuesta #21 en: 14 de Mayo de 2009, 14:31:06 »
Yo pensaba que siempre incrementaba en 1 sin importar que tipo de apuntador era pero estaba mal. Bruno está en lo correcto...

Código: [Seleccionar]
.................... int8 *apuntador;
.................... int32 *apunta32;
.................... float *flota;
.................... 
.................... apuntador=0x20;
000D:  BCF    03.5
000E:  CLRF   22
000F:  MOVLW  20
0010:  MOVWF  21
.................... apunta32=0x30;
0011:  CLRF   24
0012:  MOVLW  30
0013:  MOVWF  23
.................... flota=0x40;
0014:  CLRF   26
0015:  MOVLW  40
0016:  MOVWF  25
.................... 
.................... ++apuntador;
0017:  INCF   21,F
0018:  BTFSC  03.2
0019:  INCF   22,F
.................... ++apunta32;
001A:  MOVLW  04
001B:  ADDWF  23,F
001C:  BTFSC  03.0
001D:  INCF   24,F
.................... ++flota;
001E:  MOVLW  04
001F:  ADDWF  25,F
0020:  BTFSC  03.0
0021:  INCF   26,F

Para el int8* un simple INCF basta, pero para los que miden 4 bytes es necesario sumar 4.