Autor Tema: Dudas entre compiladores C  (Leído 3409 veces)

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

Desconectado raul6162

  • PIC10
  • *
  • Mensajes: 19
Dudas entre compiladores C
« en: 08 de Abril de 2017, 20:42:04 »
Saludos comunidad espero mi tema no sea redundante, recién empiezo en pics y el mundo de C.
Como introducción quiero mencionar, comencé a programar con java(alto nivel) y luego el compilador DEVC++ años atrás para c y c++.
Actualmente uso el CCS (con sus características para los MCU).

Pues bien mi duda surgio del hecho de que investigando encontré otros varios compiladores para pics que utilizan leguaje C,(MICROC,MPLAB, HIGH-TECH-C, etc.).

Estos compiladores son totalmente capaces de realizar las mismas funciones que un compilador nativo como DEVC++:
Es decir si pueden hacer/manejar estructuras de datos como pilas, colas, punteros, etc. o bien existen "ciertas limitantes" en comparación a DEVC++, ya que son orientados a pics. Debo añadir que escuche de un profesor mío comentarios sobre que hay cosas que luego no puedes hacer con ellos del leguaje C.
Y .. de igual modo alguno de estos compiladores esta mas cercano o alejado al lenguaje ???.
« Última modificación: 08 de Abril de 2017, 20:45:57 por raul6162 »

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re:Dudas entre compiladores C
« Respuesta #1 en: 09 de Abril de 2017, 06:23:41 »
Que yo sepa los más cercanos a ANSI C son los de Microchip y HiTech. De hecho los antiguos de microchip (C32, C18, etc.) estaban hechos por ellos con bastantes modificaciones/limitaciones. Si te coges ahora un XC32 es directamente una modificación de gcc y XC32++ de g++. Yo te diría que puedes hacer casi todo lo que haces con un compilador para PC pero teniendo en cuentas las limitaciones del hardware: así que lo primero es que te empolles lo que es un microcontrolador y las diferencias con un PC. Y sí: puedes hacer colas, pilas, listas enlazadas, punteros, estructuras, uniones, recursividad, etc. Pero acuerdate que no tienen ni tanta RAM ni un a pila de instrucciones con tantos niveles como en un PC: no intentes calcular 1000 decimales del número pi :D

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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Dudas entre compiladores C
« Respuesta #2 en: 09 de Abril de 2017, 12:07:10 »
Como dijo manwewe, podes hacer todo lo que haces con un compilador de una PC. De manejarse hay 3 compiladores actuales y 1 desfasado, eso no quita que puedan existir otros.

- CCS
A mi gusto se aleja mucho del C de los demas compiladores, tiene directivas propias, tiene funciones especificas que la fuente no esta en ningun lado, el compilador toma algunas decisiones por vos implicitamente, que si no lo sabes no tenes idea porque esta haciendo esas cosas.
Permite rapidamente gracias a esas directivas configurar algunos modulos y hacer prototipos , pero sin saber como funciona el micro/funciones podrias entrar en problemas.
Presenta ademas una mayor abstraccion del hardware que los demas compiladores, ya que no tenes que estar cambiando registro a registro para configurar un modulo.
Es pago... Pero no se puede hablar de pirateria en el foro, asi que de donde lo consigas es tu problema, lo mismo para todos los demas compiladores nombrados.

- XC8/XC16/XC32/XC32++
Esta es la familia mas actual del fabricante Microchip, XC8 es un poco especial, ya que su programacion en assembler (ASM) es propio de Microchip, es decir la sintaxis del ASM, por lo cual no podriamos juntarlos con los demas como XC16/XC32/XC32++ que como dijo manwewe son un port o caso especial de GCC. Lo bueno es que sus directivas y su forma de trabajo asimila a muchos otros lenguajes. XC8 como te decia es distinto en ves de usar direcciones de memoria en defines tiene unas definiciones de estructuras propias del compilador aunque no vas a nunca definir algo asi vos, pero esto es lo que mas se aleja de C de una PC en una programacion normal. Los demas pueden tener distintos __attrib__ pero su sintaxis es como al de GCC incluso en la parte de ASM.
Tiene algunas funciones BUILT-IN en el compilador, para facilitar algunas cosas, como generador de delays, o en algunos registros se requiere una secuencia como proteccion, entonces te ofrecen alguna funcion que hace todo eso como si fuera un solo paso nomas. XC8 posee algunas librerias para algunos PIC pero no es libre el contenido, XC16 en adelante, los codigos se encuentran en una carpeta aparte. Tambien XC8 posee una diferencia para las interrupciones propia al igual que CSS. Para que quede claro, XC8 = PIC12/16/18 , XC16 = dsPIC/PIC24, XC32/XC32++ = PIC32
Este tambien es pago.. o por subscripcion..

- MikroC
Este compilador es el que menos veo, pero se parece bastante a los compiladores XC de Microchip en el sentido de como hace para acceder a los registros del micro. Ayudando a gente vi que posee algunas funciones extras, no se si seran "privadas" las funciones o te daran el codigo (librerias) para poder acceder a las mismas y ver que hace. Es casi lo mismo que XC pero por ser una tercera parte no posee el soporte a todos los micros como es XC.
Tambien es pago.

- HI-TECH C, C18, C32, ASM30 (assembler para los otros PICs)
Estos fueron los primeros compiladores de C para los PIC y que Microchip como fabricante le daba soporte ( de Hi-Tech ), todavia se pueden bajar desde la pagina de Microhip, dentro de sus "archivos". La ultima version dentro de la pagina pertenece a 2011 para los PIC10/12/16, C18 para PIC18 la ultima es de 2014. Lo bueno es que te ofrecen las versiones PRO, por lo cual podes tener optimizaciones de forma gratuita, lo malo a mi gusto es que ya no tenes mas soporte para los mismos.

Citar
Estos compiladores son totalmente capaces de realizar las mismas funciones que un compilador nativo como DEVC++:
Es decir si pueden hacer/manejar estructuras de datos como pilas, colas, punteros, etc. o bien existen "ciertas limitantes" en comparación a DEVC++, ya que son orientados a pics. Debo añadir que escuche de un profesor mío comentarios sobre que hay cosas que luego no puedes hacer con ellos del leguaje C.
Y .. de igual modo alguno de estos compiladores esta mas cercano o alejado al lenguaje ???.

Entonces ahora a aclarar tus ideas:

- La mayoria es son compiladores C y no C++ ( como el DEVC++) eso ya hace que sea distinto lenguaje.
- Podes realizar todo lo que podes hacer en C en una PC, las limitantes de Hardware como te dijeron y la potencia de los mismos hacen que por ejemplo la memoria dinamica sea irrealizable (no conveniente), multi-thread podes si es que el micro puede almacenar un SO que maneje tareas pero recorda que tenes 1 solo nucleo, En casi la mayoria de las aplicaciones de microcontrolador simples no tiene sentido ocupar y gastar el espacio para un SO, ya en cosas mas avanzadas si ( exigiendo micros con mas memoria)
- No te pondrias nunca a usar la libreria stdio para sacar datos, a lo sumo como maximo usar la funcion sprintf, todo lo demas corre por cuenta tuya realizarlo.
- Muchas funciones son mejores ser realizadas por uno que usar de las librerias, ya que la funcion de uno sirve para lo que solamente necesitas, aumentando la velocidad.

Y creo que no es acerca de cual esta mas cercano o alejado al lenguaje... Todos son C y se manejan igual, todas la forma de estructuras, arrays, uniones, control de flujo, manejo del stack, etc son iguales en todos, la unica forma que se diferencian entre uno u otro es la forma de acceder al hardware (y tal ves la forma en que pasan los parametros en ASM). El acceso a registros algunos mediante funciones y otros a traves de estructuras. Esto respecto a los compiladores.

Luego tenes que entender la limitaciones de hardware como dijo manwewe, los PIC10/12/16/18 poseen una pila limitada, los micros de 16bits en adelante usan la RAM para tener la Pila, asi que quita esa limitacion. Otros micros pueden ser diferentes, como los Attiny de la ex-Atmel ahora Microchip, son distintas arquitecturas.


Mi opinion: Absolutamente mia y que no se tome como una orden o una verdad que se deba respetar, por lo observado en el foro solo hablando de los PICs lo mejor para mi es XC.
- Los compiladores Cxx. no tienen mas soporte. Hay gente que lo sigue usando por el tema de las optimizaciones.
- CCS, por lo que veo en el foro la mayoria que comienza no tiene problemas en el tema del flujo del programa, sino en como usar las directivas , o que el compilador les cambia cosas por si solo, Por supuesto si a esto le sumas que recien comienza en C y no posee manejo del flujo del programa se vuelve peor. Tiene una curva un poco mayor de aprendizaje respecto al compilador, y cuando tienen que tratar cosas del micro en si, empiezan los problemas ya que tenes que estar definiendo registro a registro. Pero no todo es malo, es excelente para prototipos rápidos que es lo que la mayoría hace cuando aprende. No es lo mismo escribir 1 linea sin saber nada del micro que modificar 5 registros para 1 solo modulo y tener que leer el datasheet del micro. Y cuadno ya conoces las cosas que hace el compilador y sus funciones, seguramente sea mas rapido (Tiempo de desarrollo ) hacerlo con CCS. El otro tema es el soporte a TODOS los PICs, no creo que los soporte a todos, aunque eso no importa mucho porque casi siempre se usan algunos en especial.
- MikroC no se quien podria querer complicarse con esto. No hay mucha gente que lo use por lo visto aca en el foro. Lo bueno es que segun donde lo consigas podrias tener un "XC..." con optimizaciones.
- XC es genial porque te permite tener el control completo del micro, se cuando voy a limpiar algun flag de interrupcion, se que registro estoy modificando y que valor le pongo, puedo modificar registros de forma rapida sin necesidad de declarar otra cosa. Todo lo que se ejecute es por que yo lo escribi. Lo malo es que necesitas pagar para obtener las optimizaciones, y eso mata al compilador. Pero a no ser que tus requerimientos sean bastantes puntuales no creo que tengas problemas, FLASH deberia sobrar siempre, sino por unos $$ mas obtenes uno mucho mejor y con mas FLASH/PINES/RAM/etc.

Y mi ultima opinion... Hay mas fabricantes de micros, que ofrecen herramientas de desarrollo muy baratas con programador incluido, Compiladores totalmente gratuitos con optimizaciones (GCC), con nucleos ARM. No voy a nombrar marcas porque existen muchas, vos elegis que te parece mas conveniente.
« Última modificación: 09 de Abril de 2017, 12:10:06 por KILLERJC »

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re:Dudas entre compiladores C
« Respuesta #3 en: 09 de Abril de 2017, 14:27:13 »
KILLERJC, te llevo siguiendo tiempo: eres "el puto amo" de la programación para PIC  ((:-)) ((:-)) ((:-)) ((:-)) ((:-))

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

Desconectado colotron

  • PIC12
  • **
  • Mensajes: 73
    • Canal de YouTube
Re:Dudas entre compiladores C
« Respuesta #4 en: 09 de Abril de 2017, 19:53:27 »
Para mí es indeseable tener directivas "específicas" del compilador (#fuses, etc). Eso en realidad está incorporando código o constantes sobre las que no se tiene un control muy directo.

Primero está como cada compilador establece su librería estandar, la cual trataría de no utilizar siempre y cuando no sean funciones que tengan una implementación clara y optimizada para un microcontrolador. Por ejemplo, en vez de printf que a veces ocupa mucho espacio en memoria (depende del compilador) podría usar un itoa() (ok, no es estandar, pero se entiende la idea).

Operaciones de punto flotante: evitarlas siempre que se pueda, la mayoría de los micros no tienen una unidad de punto flotante, algunos ni siquiera tienen multplicador hardware para enteros.

Memoria dinámica?: en lo posible no, saber siempre cuanta memoria se está usando, y mucho cuidado de que no haya una serie de llamadas a función encadenadas que te lleven a un stack overflow (con micros chicos en 6..8 funciones anidadas ya estamos al filo del overflow, depende de los parámetros de las mismas).

Segundo vienen las librerías de periféricos que ya dependen a la vez de micro y compilador. Si son periféricos sencillos (puertos de entrada/salida, conversor analógico digital, timers, uart, spi, i2c) yo prefiero escribir directamente a los registros de configuración y operación de cada módulo. Las librerías que proveen los fabricantes muuuuuchas veces tienen errores, que para una versión están corregidos pero luego aparecen en una versión siguiente. Además para entender lo que hay que pasar a las funciones de la api de periféricos del fabricante, tienen unos parámetros que no son triviales, cada bit cuenta, y luego sucede que para entender como funciona esa función invertiste un tiempo similar o mayor que para manejar el periférico escribiendo/leyendo los registros SFR (de función especial, los registros de hardware).
Cual es la excepción?: cuando hay librerías monstruo por ejemplo usb, tft, ethernet, etc; donde en realidad uno elige el micro para tener esa funcionalidad.

Y por último pero lo más importante: la forma de trabajo. No se programa de la misma forma una pc que un micro. No hay teclado, pantalla, ni archivos. El depurador ya no es solo un software sino que es un hardware específico del fabricante (pickit para Microchip, launchpad para Texas, OpenOCD para ARM.
Y a veces ni depurador, con un bootloader (como usan los Arduino) y activando/desactivando salidas o por puerto serie uno va viendo como se ejecuta el programa.
Y hay que programar/flashear el micro, que es escribir el código binario en la memoria flash del micro, cosa que no existe en el mundo pc.

Como se empieza a programar un micro?: haciendo que primero encienda y apague un led, porque no sabemos si la placa está bien alimentada, si tenemos todo bien soldado, si la señal de reloj está bien configurada, etc.
Y siempre vas a estar programando MUY cercano al hardware, después de todo esa es la gracia de un microcontrolador. Tensión, corriente, resistores, capacitores, sensores, operacionales, leds, reguladores de tensión... van a ser cosas a las que tu micro va a estar conectado y que se precisa que funcionen perfectamente.
Buena parte del esfuerzo de programación es hacer funcionar ese hardware aledaño al micro, la parte lógica del sistema (lo que se programa en una PC) a veces es la parte más sencilla para proyectos simples.
No hay sistema operativo, o bueno... se puede usar... pero de vuelta a depender de un proveedor que va a tener sus condiciones de licencia y a rogar que esté bien implementado para nuestro micro, y a leer un buen rato como definir tareas y hacerlas trabajar con una interrupción por ejemplo.

Entonces esa es otra cuestión, en una pc no me tengo que preocupar de hacer un escaneo del teclado para determinar si en los últimos 100 milisegundos se presionó una tecla, en un microcontrolador sí. Ni hablar para mostrar algo en una pantalla (mucho más complejo escribir en un display alfanumérico en PIC que mostrar una foto en una PC).

El diseño de hardware está íntimamente ligado a la utilización de micros, si bien hoy para empezar se puede contar con la ventaja de comprar un Arduino shield y enchufarlo sabiendo que por lo menos nuestra electrónica no (debería) echar humo.

Seguro hay muchas cosas más para decir, pero ya se hizo largo.

Desconectado raul6162

  • PIC10
  • *
  • Mensajes: 19
Re:Dudas entre compiladores C
« Respuesta #5 en: 09 de Abril de 2017, 23:30:10 »
Tengo que reconocer que he estando evitando el trabajar directamente los registros del pic pues muchas de las funciones, directivas del CCS, me lo ahorran pero es tal como mencionan el MCU no es lo mismo en recursos hardware a un PC, tengo que entender bien y tener esa perspectiva de lo que el hace internamente el micro en cada instrucción de lo contrario no avanzare. independientemente del lenguaje a usar.
Tal como me dices KILLERJC asumo que la elección del compilador es muy gusto personal y con el que se sienta cómodo hasta no tener una aplicación  muy particular con otro mejor.
Citar
Y creo que no es acerca de cual esta mas cercano o alejado al lenguaje... Todos son C y se manejan igual, todas la forma de estructuras, arrays, uniones, control de flujo, manejo del stack, etc son iguales en todos, la unica forma que se diferencian entre uno u otro es la forma de acceder al hardware (y tal ves la forma en que pasan los parametros en ASM). El acceso a registros algunos mediante funciones y otros a traves de estructuras. Esto respecto a los compiladores.

Luego tenes que entender la limitaciones de hardware como dijo manwewe, los PIC10/12/16/18 poseen una pila limitada, los micros de 16bits en adelante usan la RAM para tener la Pila, asi que quita esa limitacion. Otros micros pueden ser diferentes, como los Attiny de la ex-Atmel ahora Microchip, son distintas arquitecturas.

Me has despertado interés por probar los XC, KILLERJC, ¿como no tuve en la universidad un profesor así en mi materia de microcontroladores :(
Deberías considerar el volverte maestro o mejor aun deberías poner un canal de YouTube para enseñar PICs ..ya tienes aquí tu primer suscriptor xD

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re:Dudas entre compiladores C
« Respuesta #6 en: 18 de Abril de 2017, 01:20:30 »
Saludos comunidad espero mi tema no sea redundante, recién empiezo en pics y el mundo de C.
Como introducción quiero mencionar, comencé a programar con java(alto nivel) y luego el compilador DEVC++ años atrás para c y c++.
Actualmente uso el CCS (con sus características para los MCU).
Dev-C++ no es un compilador, es un IDE, que generalmente se usa con el compilador MinGW (un port para Windows de GCC). Sería similar al IDE MPLABX de Microchip con sus compiladores XC8, XC16, XC32.

Pues bien mi duda surgio del hecho de que investigando encontré otros varios compiladores para pics que utilizan leguaje C,(MICROC,MPLAB, HIGH-TECH-C, etc.).

Estos compiladores son totalmente capaces de realizar las mismas funciones que un compilador nativo como DEVC++:

Es decir si pueden hacer/manejar estructuras de datos como pilas, colas, punteros, etc. o bien existen "ciertas limitantes" en comparación a DEVC++, ya que son orientados a pics. Debo añadir que escuche de un profesor mío comentarios sobre que hay cosas que luego no puedes hacer con ellos del leguaje C.
Y .. de igual modo alguno de estos compiladores esta mas cercano o alejado al lenguaje ???.
Lo que puedas hacer con cada compilador depende de la implementación del lenguaje que soporte el compilador y de las características del dispositivo para el cual estás compilando los programas (arquitectura).
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/


 

anything