Autor Tema: int8_t, char y registros de 16bits  (Leído 3279 veces)

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

Desconectado Neutrino

  • PIC10
  • *
  • Mensajes: 29
int8_t, char y registros de 16bits
« en: 11 de Junio de 2018, 09:25:52 »
Hola muchachos, estoy jugando un poco con un dsPIC (16bits)  y leyendo el manual de xc16 dice que los char son de 8bits. Mi pregunta es, ya que los registros son de 16bits una variable de 8bits (char o int8_t) usa el registro entero? es decir los otros 8bits del registro se pierden, o pueden ser utilizdos por otra variable?

Saludos.

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re:int8_t, char y registros de 16bits
« Respuesta #1 en: 11 de Junio de 2018, 09:32:09 »
Hola muchachos, estoy jugando un poco con un dsPIC (16bits)  y leyendo el manual de xc16 dice que los char son de 8bits. Mi pregunta es, ya que los registros son de 16bits una variable de 8bits (char o int8_t) usa el registro entero? es decir los otros 8bits del registro se pierden, o pueden ser utilizdos por otra variable?

Saludos.

Los bits de un procesador/microcontrolador no indican el tamaño de los registros de memoria si no el tamaño del bus interno. Es decir, un micro de 16bit, tiene 16 bit de bus y puede enviar y recibir desde la CPU hasta 16bit en una sola operación. Los tamaños de los registros internos (SFR), RAM, FLASH, etc. pueden variar. Ejemplos:

1. Los PIC16F son de 8 bit pero los SFR de 14 bit.
2. Los procesadores de 32 bit se pueden comunicar con memorias RAM de 64 y 128 bit.

Saludos!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:int8_t, char y registros de 16bits
« Respuesta #2 en: 11 de Junio de 2018, 10:01:03 »
Solo para agregar algo, primero es como lo dice manwewe.

Otra de las cosas y que seguramente Neutrino es lo que esta interesado es la capacidad de direccionamiento del microcontrolador.

Los dsPIC tienen la capacidad de usar instrucciones en bytes. Sus registros internos son de 16bits, estarian usando la mitad de sus registros, pero en memoria RAM ocupan 8bits ya que el micro es capaz de direccionar de esta forma.
Todavia no conozco de algun micro (procesador o controlador) que no permita el manejo de bytes

Las mayores limitaciones suele ocurrir cuando los datos estan en la FLASH. Algunos micros exigen que su direccionamiento cumpla algunas caracteristicas, por ejemplo un micro con solo instrucciones de 32bits, tal ves considere que si se intenta acceder a una direccion no multiplo de 4 (los ultimos 2 bits a 0) sea un acceso erroneo y termine llevandote a un vector de error.

Si fuera el caso anterior, y no se provee otras forma de acceder, implicaria que una variable de 8 bits almacenada en FLASH ocuparia los 32 bits por ejemplo. A no ser que provea algun otro mecanismo para estos casos en donde permita leer la FLASH aparte y soportando los 8 bits.

Y como ves, depende enteramente de la arquitectura del microcontrolador y no de la cantidad de bits que maneje el mismo.

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re:int8_t, char y registros de 16bits
« Respuesta #3 en: 11 de Junio de 2018, 12:12:05 »
Muy elegante con las aclaraciones como siempre KILLERJC  ((:-)).
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado Neutrino

  • PIC10
  • *
  • Mensajes: 29
Re:int8_t, char y registros de 16bits
« Respuesta #4 en: 12 de Junio de 2018, 01:35:50 »
Muchas gracias a los dos por la aclaración y las respuestas. Ya me está quedando mucho más claras las cosas, por lo que veo en la Universidad esa parte del curso nos la dieron con las patas.

Los dsPIC tienen la capacidad de usar instrucciones en bytes. Sus registros internos son de 16bits, estarian usando la mitad de sus registros, pero en memoria RAM ocupan 8bits ya que el micro es capaz de direccionar de esta forma.
Todavia no conozco de algun micro (procesador o controlador) que no permita el manejo de bytes

Eso significa que los registros y la ram son cosas distintas? Porque según lo que me explicaron en clase son lo mismo

Y otra pregunta, con respecto al primer punto que menciona manwenwe de que sirve tener registros de 16bits si el tamaño del bus es de 8bits? Para procesarlos no haría falta dos ciclos de instrucción?


Saludos.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:int8_t, char y registros de 16bits
« Respuesta #5 en: 12 de Junio de 2018, 08:44:18 »
Eso significa que los registros y la ram son cosas distintas? Porque según lo que me explicaron en clase son lo mismo

Tal ves no me aclare demasiado, me refiero a los registros de la CPU.
En los PIC de 8 bits, cada posicion de memoria ( mejor dicho cada SFR y GPR - TODA LA RAM) se le suele llamar registro. Por eso tal ves la confusion. Ademas la CPU de los PICs de 8 bits se manejan con solo el registro W (este es del CPU). Estos PICs tienen la capacidad de que sus instrucciones pueden usar el dato desde la memoria directamente.

Desde ahora para que te sirva mas adelante.. los PICs de 8bits hay una dificil forma de verlo como un CPU con una RAM, FLASH y perifericos atados al mismo, ya que no hay una gran "separación" a simple vista. Esto en los dsPIC si se nota, y ni hablar de un ARM que el CPU es totalmente aparte de los perifericos. Entonces hay que volver a lo basico en que tenes una CPU, una RAM, una FLASH, y perifericos, y vos lo estas uniendo a todo con buses.

Los PIC24 o dsPIC, ARM y los Atmega por ejemplo, estos poseen muchos mas registros en la CPU (registros que usan las instrucciones), entonces el paso para realizar una operaciones es, traer el dato de memoria a los registros de la CPU, operar sobre estos y luego devolverlo a memoria, aunque existe la posibilidad de por ahi un acceso indirecto. Los dsPIC (CPU) poseen 16 registros de trabajo, algunos tienen algunas particularidades ( Uno oficia de Stack Pointer, Frame Pointer), tambien posee un acumulador que es de 40 bits y varios registros mas para otras operaciones de la CPU..

dsPIC: http://ww1.microchip.com/downloads/en/DeviceDoc/70204C.pdf (Pag 6)
Atmega: http://microchipdeveloper.com/8avr:gpr

A esos registros me refiero. el dsPIC posee un bus de 16bits, por lo tanto puede mover hasta 16 bits por ves, ejemplo desde la RAM hacia el registro W0, o viceversa. Pero tambien ofrece un set de instrucciones que no usa todos los 16bits sino 8 bits, para no traer todo y luego tener que borrar la parte superior.

Y otra pregunta, con respecto al primer punto que menciona manwenwe de que sirve tener registros de 16bits si el tamaño del bus es de 8bits? Para procesarlos no haría falta dos ciclos de instrucción?

El primer punto que menciona manwewe es sobre la capacidad de direccion del PIC, con 8 bits solo direccionas de 0x00 a 0xFF, entonces necesitas mas.
Se confundio al decir SFR (Special function register) con FSR ( File Select Register) en los PIC16 van desde los 10 bits hasta los 14bits, ya que le es necesario direccionar toda la RAM, y algunos tambien lo usan para acceder a la flash.
Pero internamente son 2 SFR de 8bits. Esto implica que necesitas mover 2 datos para poder direccionar. Los PIC18 poseen incluso una instruccion especial para estos casos, asi cargar directamente el FSR. Pero que eso no te engañe, ya que como el bus es de 8bits, la instruccion tarda el doble, ya que el hardware limita que pueda realizarse de una sola ves.

Otro caso y que tiene relacion con tu pregunta es que los dsPIC poseen 16 bits, pero estando en la familia de los dsPIC te encontras que tenes el acumulador que es de 40bits.
De que sirve tener un registro de 40 bits si solo podemos mover 16 bits a la ves, es la pregunta. Sirve para no tener que renegar como se hace sin esto, suponete una instruccion MAC ( multiplicar y acumular), 16 bits * 16 bits son 32 bits seguro. Y si encima lo tenes que sumar te vas a pasar de esos 32 bits. De no tener tu acumulador, necesitarias de buscar un artificio de usar 5 registros de trabajo extras ( 2 para el resultado de la multiplicacion, 3 para llevar la suma) para llevar la cuenta, ademas de buscar en cada registro si se produjo el overflow para incrementar el siguiente cuando sumas y asi con cada uno, tambien realizar esto en cada suma que hagamos. En cambio tener esos 40 bits solo significa tener que trasladar 3 veces los datos. Mucho mas simple y rapido.
« Última modificación: 12 de Junio de 2018, 08:47:22 por KILLERJC »

Desconectado Neutrino

  • PIC10
  • *
  • Mensajes: 29
Re:int8_t, char y registros de 16bits
« Respuesta #6 en: 13 de Junio de 2018, 01:01:03 »
Muchas gracias KILLERJC por tomarte el tiempo de responder, cada vez voy comprendiendo más. Me podrías recomendar algún documento o material que me pueda servir para comprender mejor? teniendo en cuenta que la mitad de lo que me enseñaron está mal.

Saludos y muchas gracias de nuevo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:int8_t, char y registros de 16bits
« Respuesta #7 en: 13 de Junio de 2018, 09:40:55 »
Sobre documento o material, te podria decir que lo tenes todo al alcance de tus manos.

El mayor problema que te vas a enfrentar es contestar esta pregunta: ¿Para que? (Especialmente cuando programas en C)

Yo me conozco un poco las arquitecturas por mi intento de querer programar en ASM cada uno de esos micros, los PIC16/18 sin problemas por que son simples, pero los PIC24/dsPIC son un dolor de cabeza y ya te voy a explicar el porque..

Por ejemplo si quisiera aprender sobre la arquitectura de los PIC12/16/18, leeria su datasheet. Ahi esta explicado como es que direcciona la memoria, como esta dividida la RAM en algunos casos, donde estan los SFR, etc. Cada familia es distinta, y cada micro es distinto, por ejemplo hay PIC16 de los mas nuevos con muchas mejoras respecto a los primeros PIC16, aunque su arquitectura sigue un concepto similar.

Como te decia, los PIC12/16/18 no presentan una clara distincion de lo que es el nucleo, memoria, perifericos y buses, y eso lo podes ver en sus diagramas de bloque:
http://ww1.microchip.com/downloads/en/DeviceDoc/35007b.pdf (Pagina 5)
http://ww1.microchip.com/downloads/en/DeviceDoc/40001350F.pdf (Pagina 10)

El PIC16F84 es dentro de todo lo mas simple, Y mirando el bloque de diagrama, podes entender como es que una operacion como sumar, puede recibir un operando desde W y otro desde la misma instruccion o desde la memoria.
Tambien luego en el capitulo Memory Oganizartion te explica las formsa de direccionamiento.

------------------------------------

Respecto a los PIC24/dsPIC es otro tema. Y muchisimo mas grande, ya toda la informacion no esta en el datasheet, cuando buscas algun dsPIC en la pagina de Microchip, supongamos este:

https://www.microchip.com/wwwproducts/en/dsPIC33EP128GM304

En la parte de Documents, bajo el titulo de Reference Manual vas a tener todo lo que buscas sobre la arquitectura del PIC y cada uno de sus modulos. Los que te interesarian serian:

CPU y Data Memory, Tal ves la flash.

Aun asi es MUCHO tratar de entenderlo todo, soy fanatico del ASM y me llevo unos dias tratar de entender como es que funciona el direccionamiento de los dsPIC especialmente, y que si no vas a programar en ASM como te digo, no tiene mucho sentido. El problema de los dsPIC es que dejas de tener 1 solo bus para leer y escribir, sino que tenes 1 bus que permite lectura y escritura al mismo tiempo, y otro bus que permite lectura, de esa forma poder ejecutar instrucciones con varios parametros y almacenarlo todo en una sola instruccion.

-----------------------

Sobre ARM, me baje los documentos sobre su core para tratar de programarlo tambien.

-----------------------

En fin, no te puedo dar ningun documento mas de los que ofrecen los fabricantes, no estan escritos de la mejor forma para que se entienda con muchos ejemplos, pero estan. Y programar en ASM es un dolor de cabeza, especialmente si tenes muchas familias, ya que cambia de familia a familia. PIC16 y PIC18 hay cambios minimos, pero pasar a PIC24/dsPIC es otro ASM completamente distinto.

Citar
teniendo en cuenta que la mitad de lo que me enseñaron está mal.

No creo que haya sido el caso, recorda que estan usando un lenguaje de alto nivel de programacion, por lo tanto no es de tanta importancia como es que se maneja internamente el micro, ya que es tarea del compilador arreglarselas. Tal ves una "sobre" simplificacion de algunos temas, para que no pierdan el hilo en eso, y aborden los temas que le corresponden.
Ejemplo en C, sabiendo como funcionan los perifericos, o solamente viendo el datasheet del periferico (para saber que registros le corresponden - SFR ) les sobra para programar lo que deseen.

Desconectado Neutrino

  • PIC10
  • *
  • Mensajes: 29
Re:int8_t, char y registros de 16bits
« Respuesta #8 en: 13 de Junio de 2018, 12:09:39 »
Hola KILLERJC de nuevo muchas gracias por responder. Aparte de dsPIC también estoy aprendiendo ASM aunque poor ahora lo estoy haciendo con un pic10f200 ya que casi no tiene casi periféricos, así me puedo concentrar primero en la lógica de ASM y ya luego me paso con un pic16, seguramente cuando eso me vean mucho por el foro de ASM.

Entiendo que los dsPIC y en especial los micros de más de 8bits su complejidad a la hora de programar en ASM aumenta lo que hace a C una mejor opcion teniendo en cuenta el tiempo de desarrollo, pero en uno de los tantos user manuals o datasheets que he visto mientras consulto sobre el dsPIC vi que el xc16 permite ejecutar instrucciones de ASM en línea y me parece interesante esta opción.

Saludos.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:int8_t, char y registros de 16bits
« Respuesta #9 en: 13 de Junio de 2018, 12:24:35 »
pero en uno de los tantos user manuals o datasheets que he visto mientras consulto sobre el dsPIC vi que el xc16 permite ejecutar instrucciones de ASM en línea y me parece interesante esta opción.

Por ejemplo no hay instrucciones en C para las instrucciones DSP, si buscas codigos de ejemplo de un filtro FIR supongamos. Te vas a dar cuenta que usa una funcion en C para MAC, pero luego esa funcion en C es una linea de ASM con la instruccion de DSP. Yo jugue un poco con XC16, no hice mucho, lo postee aca en el foro de ASM, pero ya ni recuerdo donde esta. Por supuesto es todo ASM aunque bajo el compilador XC16.

Y los PIC10, con respecto a los demas PIC12/16 no vas a notar demasiada diferencia, PIC18 cambia una buena parte. Y luego PIC24/dsPIC es otra cosa, y PIC32 otra totalmente distinta.

PD: Encontre la parte de XC16 y ASM
http://www.todopic.com.ar/foros/index.php?topic=45240.0
« Última modificación: 13 de Junio de 2018, 12:43:36 por KILLERJC »


 

anything