Autor Tema: Convertir sketch a ensamblador  (Leído 19090 veces)

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

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Convertir sketch a ensamblador
« Respuesta #15 en: 20 de Abril de 2018, 15:16:46 »
A ver Loudness,  que todo esto no te líe.

Arduino se puede programar en C. Nada de lo que te digan puede cambiar esto.

Ahora vamos a entrar en más detalles.
C++ es un lenguaje que simplemente añade más funcionalidad al lenguaje C. Esto significa que TODOS los programas en C se pueden compilar en un compilador de C++ pero no al contrario. Por lo tanto tu puedes programar Arduino en lenguaje C sin ningún problema en absoluto.

Dicho esto, las librerías de Arduino están programadas en C++ y aprovechan muchas características del lenguaje C++ para que el usuario vea todo sencillo. Esto se consigue a costa de hacer las librerías lentas y complejas. Así que por ahora deberías olvidarte de analizar las librerías de Arduino por dentro porque te va a complicar mucho la vida. Simplemente utilízalas sin mirar dentro o haz las tuyas propias (que es lo que yo hago muy a menudo para ganar velocidad).


También puedes programar Arduino en ensamblador sin ningún problema.
La forma simple es añadiendo las instrucciones una a una. Te puede valer para pequeños programas:
https://playground.arduino.cc/Main/AVR

La forma más elaborada es añadiendo archivos de ensamblador separados, que se enlazan posteriormente:
https://arduino.stackexchange.com/questions/46397/how-to-use-arduino-ide-to-compile-s-files?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

En ningún caso tienes que quitar el bootloader y se puede hacer sin problema desde el IDE de Arduino o desde otro cualquiera.


En cuanto al listado ensamblador del programa en C, hacerlo con el IDE de Arduino es un poco complejo. Lo más sencillo es que lo compiles por separado desde línea de comandos (puedes hacerlo con un archivo batch) con la opción de generar el listado ensamblador.

Un saludo.


« Última modificación: 20 de Abril de 2018, 15:19:40 por Picuino »

Desconectado AleSergi

  • PIC16
  • ***
  • Mensajes: 214
Re:Convertir sketch a ensamblador
« Respuesta #16 en: 20 de Abril de 2018, 15:59:23 »
C a la primera....   con él podrás con los AVR o los PIC,  sin mucho esfuerzo,  una vez comprendido el lenguaje, además del lado de PIC,  tenes un compilador llamado CCS,  que abstrae fuertemente del hardware,  una especie de Arduino,  de los PICs.
Muchos de los módulos arduineros y sus librerias,  estan  portadas a C purista,  para compilarlas con AVR-GCC,  nada C++ en ellas...
La cosa es así,  aprender C,  te abre la puerta para muchisimos microcontroladores,  mejor anticiparse...  no sabemos cuanta vida les quedan a los 8bits, los 32bits, se programan C,  y ya estarías caminando por su mundillo.

Desconectado tsk

  • PIC18
  • ****
  • Mensajes: 258
Re:Convertir sketch a ensamblador
« Respuesta #17 en: 20 de Abril de 2018, 17:44:56 »
C++ es un lenguaje que simplemente añade más funcionalidad al lenguaje C. Esto significa que TODOS los programas en C se pueden compilar en un compilador de C++ pero no al contrario. Por lo tanto tu puedes programar Arduino en lenguaje C sin ningún problema en absoluto.

Bueno en realidad, hoy en día C y C++ son dos lenguajes distintos, que se pueda compilar C dentro de un programa de C++ es porque el compilador lo permite y puede manejar código hecho en C, pero no por ello C++ es una extensión de C, probablemente inició con esa idea, pero ya no se aplica.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Convertir sketch a ensamblador
« Respuesta #18 en: 20 de Abril de 2018, 20:39:28 »
Si C++ puede compilar todos los programas de C y además puede compilar otros programas, entonces C++ es igual que C con algo más.
De hecho el mismo nombre C++ viene de la sintaxis del C y significa C más uno o C añadido.

¿Por qué opinas que C++ no es una extensión del C?



https://es.wikipedia.org/wiki/C%2B%2B :
Citar
C++ es un lenguaje de programación diseñado a mediados de los años 1980 por Bjarne Stroustrup. La intención de su creación fue el extender al lenguaje de programación C mecanismos que permiten la manipulación de objetos.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Convertir sketch a ensamblador
« Respuesta #19 en: 20 de Abril de 2018, 20:41:32 »
Citar
El nombre "C++" fue propuesto por Rick Mascitti en el año 1983, cuando el lenguaje fue utilizado por primera vez fuera de un laboratorio científico. Antes se había usado el nombre "C con clases". En C++, la expresión "C++" significa "incremento de C" y se refiere a que C++ es una extensión de C.

Desconectado tsk

  • PIC18
  • ****
  • Mensajes: 258
Re:Convertir sketch a ensamblador
« Respuesta #20 en: 20 de Abril de 2018, 21:48:52 »
Comenzó con siendo una extensión de C y de hecho se le denominaba C con Clases, pero cada uno evolucionó con su propio estándar, lo cual los separó.

De hecho puedes encontrar construcciones que son totalmente validas en C++, que parecen C, pero que no te van a compilar en C, a menos que el compilador lo permita y también en el sentido contrario.

Por ejemplo esto en ambos es válido

Código: C
  1. struct Algo {
  2. };

Pero sólo en C++ es válido

Código: C
  1. Algo algo1,algo2;
  2. void print(Algo a);

Cuando en C debe de ser

Código: C
  1. struct Algo algo1,algo2;
  2. void print(struct Algo a);

De igual forma lo siguiente es válido en C

Código: C
  1. void *ptr;
  2. int *i = ptr;

pero para que pueda compilar en C++ requieres hacerlo de la siguiente forma

Código: C
  1. void *ptr;
  2. int *i = (int *)ptr;

Si no obtienes un error

Código: [Seleccionar]
main.cpp:5:11: error: invalid conversion from ‘void*’ to ‘int*’ [-fpermissive]
  int *i = ptr;

En C++ es válido

Código: C
  1. int i(10);

Lo que en C sería el equivalente de

Código: C
  1. int i = 10;

Como vez, cada uno evolucionó por su lado, y cada uno cuenta con sus propios estándares. Se parecen, pero es un error pensar que C es un subconjunto de C++ o que C++ son extensiones para el C.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Convertir sketch a ensamblador
« Respuesta #21 en: 21 de Abril de 2018, 06:46:21 »
De igual forma lo siguiente es válido en C

Código: C
  1. void *ptr;
  2. int *i = ptr;

pero para que pueda compilar en C++ requieres hacerlo de la siguiente forma

Código: C
  1. void *ptr;
  2. int *i = (int *)ptr;

Si no obtienes un error

Depende de las opciones del compilador. Si no haces una compilación estricta no da error:


* compila.png
(15.71 kB, 493x422 - visto 1551 veces)



Los demás son ejemplos de C++ que no se compilan en C y en eso estoy de acuerdo desde el principio porque todos los añadidos y todos los extras que tiene C++ no compilarán en C.


A efectos prácticos, que es lo que le interesa a Loudness, todos los programas en C se pueden compilar con un compilador de C++ como el de Arduino.
Y el compilador C++ de Arduino es uno de los mejores que existen, es un port de GCC, el compilador estandar de GNU/Linux.

Un saludo.

Desconectado locodelafonola

  • PIC10
  • *
  • Mensajes: 43
Re:Convertir sketch a ensamblador
« Respuesta #22 en: 21 de Abril de 2018, 11:50:47 »
Hola ., bueno creo que aqui hay confucion  ., primero el lenguaje de arduino es C++ (no C)
Lo segundo ., dudo que puedas programar un arduino en ASM ., a menos que desbloques los "FUSEBIT" y borres su BOOTLADER
LO tercero es que al ser C++ ., tiene funciones "emascaradas" ., a la cuales no tienes acceso
Si usas la herramienta de compilacion gratuita ATMELstudio 7xxx ., tenes la posibilidad de programar en tres tipos de lenguaje C++ ., C y ASM
Tambien tiene la funcion de "DISSEMBLER" ., que te podria servir de guia ., para la programacion de un chip nuevo y normal en ASM  .,  sin ser arduino 

Hay muchas cosas que desacuerdo con eso. Pero esto no viene al caso, asi que voy a continuar con el tema.

C es un lenguaje, y C++ es otro, Picuino lo simplifico diciendo que es C ( a pesar que aclaro que es C++ ), y al menos yo los considero 2 lenguajes distintos a pesar que poseen algunas similitudes.
C le va a dar una base, y le va a permitir entender/programar cuaquier micro sin mirar atras, entonces es mi eleccion para el autor del hilo. Por otra parte si te interesa entender las librerias de Arduino vas a tener que ademas de aprender C agregar unas cuantas cosas mas, todo lo referente a clases, inheritance, overloading y no se si se me escapa alguna otra cosa.
Con un conocimiento de C mas un minimo o base de que son las cosas que nombre podrias entender las librerias de Arduino.

Por eso mismo sigo pensando que C seria la mejor opcion.

Respecto a los compiladores, en AVR no puedo proveerte informacion, pero en PIC si venis del ASM, pienso que vas a disfrutar mas usando XC8, y que vas a encontrar muy distinto que CCS por ejemplo, a pesar que este ultimo es muy lindo para alguien que comienza. Esto ya queda a tu criterio de eleccion.

Tutoriales hay bastantes en internet.
De igual forma lo siguiente es válido en C

Código: C
  1. void *ptr;
  2. int *i = ptr;

pero para que pueda compilar en C++ requieres hacerlo de la siguiente forma

Código: C
  1. void *ptr;
  2. int *i = (int *)ptr;

Si no obtienes un error

Depende de las opciones del compilador. Si no haces una compilación estricta no da error:

 - Tienes que ingresar para ver archivos adjuntos -


Los demás son ejemplos de C++ que no se compilan en C y en eso estoy de acuerdo desde el principio porque todos los añadidos y todos los extras que tiene C++ no compilarán en C.


A efectos prácticos, que es lo que le interesa a Loudness, todos los programas en C se pueden compilar con un compilador de C++ como el de Arduino.
Y el compilador C++ de Arduino es uno de los mejores que existen, es un port de GCC, el compilador estandar de GNU/Linux.

Un saludo.
Hola ., y perdonen si "meto la cuhara donde no debo"
Yo uso avr ., desde que empece con los micros ., ASM intente aprenderlo ., pero "no doy pie con bola" ., el consultante pregunta si se puede pasar de lenguaje C++ a ASM ., para grabar un arduino
Si bien el compilador acepta librerias con extencion .C (las redefiniciones para que funcione en C++  o .CPP tiene que estar en una libreria .H) ., y tambien acepta librerias .S (ASM)
Pero aca no es el problema del lenguaje ., sino si el arduino acepta que sea de otra manera (y es lo que no seme entendio)
Si yo quisiera grabar una compilacion ( C o ASM) ., en un arduino ., no me deja marca error
Y es a eso alo que me refiero ., cualquiera de las compilaciones anteriores ya tiene el "BOOTLADER" incomporado ., y el arduino lo agrega al momento de grabarlo
Si alguno piensa que se puede grabar con otro grbador por los terminales ISP ., veran que no los deja
La proteccion logica delos FUSEBIT ., (que se graban aparte en los ATMEGA., no es igual que los PIC)
La unica manera de solucionar esto es acceder desde el compilador en la plataforma arduino y cambiarlo desde alii (fusebit)
Entonces si podemos grabar deslos terminales ISP como si fuera cualquier micro
Yo creo que la confucion se da por el tema de los lenguajes ., pero aparte de eso ., esta la limitacion que impone el propio arduino par su programacion
Si el consultante quiere compilar en ASM ., puede hacerlo ., pero sobre un micro "virgen" o bien borrar el arduino y dejarlo con la configuracion igual a uno virgen
De otra manera ., dudo que pueda hacerlo
yo solo se que ...nose nada

Desconectado tsk

  • PIC18
  • ****
  • Mensajes: 258
Re:Convertir sketch a ensamblador
« Respuesta #23 en: 21 de Abril de 2018, 12:01:59 »


Los demás son ejemplos de C++ que no se compilan en C y en eso estoy de acuerdo desde el principio porque todos los añadidos y todos los extras que tiene C++ no compilarán en C.

A efectos prácticos, que es lo que le interesa a Loudness, todos los programas en C se pueden compilar con un compilador de C++ como el de Arduino.
Y el compilador C++ de Arduino es uno de los mejores que existen, es un port de GCC, el compilador estandar de GNU/Linux.

Un saludo.

Pero te desvías del estándar y es porque el compilador lo permite, pero no existe la certeza que con otros compiladores lo puedas hacer.

Lo que hace Arduino es que al compilador le agregan la opción -fpermissive, y como tiene una mezcla de liberías en C y en C++ usa tanto avr-gcc como avr-g++ al compilar las fuentes.

Es decir, todo lo que tenga terminación .cpp lo va a compilar a código objeto (.o) con avr-g++ y todos las fuentes que terminen con .c lo va a compilar a código objeto (.o) con avr-gcc y al finalizar los va a enlazar todos con avr-gcc.

Entonces, realmente no puedes decir que estás aprendiendo C y tampoco C++, estás aprendiendo un tipo de Frankenstein, porque si fuera completamente C++, no tendrías que hacer

pinMode(13,OUTPUT) y digitalWrite(13,HIGH)

Tendrias por ejemplo que declarar

DigitalOut LED(13)

Entonces LED pasaría a ser un objeto de la clase DigitalOut. Para después usarlo de la siguiente manera

LED = 0
LED = 1

Sobrecargando el operador =

o

LED.write(0)

y

LED.set()
LED.reset()
LED.toggle()

Entonces, que es lo que realmente estás aprendiendo. C con algunos conceptos que le piden prestado a C++, porque apenas estás tocando la superficie de lo que es C++.

¿Podrían haber alcanzado el mismo objetivo si hubieran usado sólo C?

Claro que sí.

¿Lo podían haber conseguido usando únicamente C++?

Claro que sí. Pero veamos los horrores de haber creado las funciones pinMode y digitalWrite para después compararlo con una seudo implementación en C++

pinMode
Código: C
  1. void pinMode(uint8_t pin, uint8_t mode)
  2. {
  3.         uint8_t bit = digitalPinToBitMask(pin);
  4.         uint8_t port = digitalPinToPort(pin);
  5.         volatile uint8_t *reg, *out;
  6.  
  7.         if (port == NOT_A_PIN) return;
  8.  
  9.         // JWS: can I let the optimizer do this?
  10.         reg = portModeRegister(port);
  11.         out = portOutputRegister(port);
  12.  
  13.         if (mode == INPUT) {
  14.                 uint8_t oldSREG = SREG;
  15.                 cli();
  16.                 *reg &= ~bit;
  17.                 *out &= ~bit;
  18.                 SREG = oldSREG;
  19.         } else if (mode == INPUT_PULLUP) {
  20.                 uint8_t oldSREG = SREG;
  21.                 cli();
  22.                 *reg &= ~bit;
  23.                 *out |= bit;
  24.                 SREG = oldSREG;
  25.         } else {
  26.                 uint8_t oldSREG = SREG;
  27.                 cli();
  28.                 *reg |= bit;
  29.                 SREG = oldSREG;
  30.         }
  31. }

digitalWrite
Código: C
  1. void digitalWrite(uint8_t pin, uint8_t val)
  2. {
  3.         uint8_t timer = digitalPinToTimer(pin);
  4.         uint8_t bit = digitalPinToBitMask(pin);
  5.         uint8_t port = digitalPinToPort(pin);
  6.         volatile uint8_t *out;
  7.  
  8.         if (port == NOT_A_PIN) return;
  9.  
  10.         // If the pin that support PWM output, we need to turn it off
  11.         // before doing a digital write.
  12.         if (timer != NOT_ON_TIMER) turnOffPWM(timer);
  13.  
  14.         out = portOutputRegister(port);
  15.  
  16.         uint8_t oldSREG = SREG;
  17.         cli();
  18.  
  19.         if (val == LOW) {
  20.                 *out &= ~bit;
  21.         } else {
  22.                 *out |= bit;
  23.         }
  24.  
  25.         SREG = oldSREG;
  26. }

Se viola el principio de no repetirse así mismo

Código: C
  1. uint8_t bit = digitalPinToBitMask(pin);
  2.         uint8_t port = digitalPinToPort(pin);
  3.         volatile uint8_t *reg, *out;
  4.  
  5.         if (port == NOT_A_PIN) return;
  6.  
  7.         // JWS: can I let the optimizer do this?
  8.         reg = portModeRegister(port);
  9.         out = portOutputRegister(port);
  10.  
  11. -------------------------------------------------
  12.         uint8_t timer = digitalPinToTimer(pin);
  13.         uint8_t bit = digitalPinToBitMask(pin);
  14.         uint8_t port = digitalPinToPort(pin);
  15.         volatile uint8_t *out;
  16.  
  17.         if (port == NOT_A_PIN) return;
  18.  
  19.         if (timer != NOT_ON_TIMER) turnOffPWM(timer);
  20.  
  21.         out = portOutputRegister(port);

Son cosas que sólo se tienen que verificar cuando se declara el pin como salida (en el constructor), por lo tanto hay configuraciones que pueden quedar alamacenadas en variables protegidas dentro de una clase de nombre DigitalOut

Así, la implementación de un supuesto write incluiría únicamente las siguientes lineas

Código: C
  1. uint8_t oldSREG = SREG;
  2.         cli();
  3.  
  4.         if (val == LOW) {
  5.                 *out &= ~bit;
  6.         } else {
  7.                 *out |= bit;
  8.         }
  9.  
  10.         SREG = oldSREG;

Hay mucha diferencia en el rendimiento, ya que no tienes que estar haciendo

Código: C
  1. uint8_t bit = digitalPinToBitMask(pin);
  2.         uint8_t port = digitalPinToPort(pin);
  3.         ...
  4.  
  5.         if (port == NOT_A_PIN) return;
  6.  
  7.         if (timer != NOT_ON_TIMER) turnOffPWM(timer);
  8.  
  9.         out = portOutputRegister(port);

Cada vez que quieres leer o escribir en el pin, además de propiciar a que el compilador optimice mejor la parte de la escritura en el pin por medio de las funciones, sbi y cbi.

Así por ejemplo un LED.set() el compilador lo podría traducir por un

Código: ASM
  1. sbi 0x08, 7

Y un LED.reset()

Código: ASM
  1. cbi 0x08, 7

Esto es porqué, el avr-gcc, es demasiado inteligente para saber que

Código: C
  1. PORTC |= 0B10000000;
  2. PORTC |= 1<7;

es el equivalente a querer un sbi 0x08, 7

Código: C
  1. PORTC &= 0B01111111;
  2. PORTC &= ~(1<7);

es el equivalente a querer un cbi 0x08, 7
Hola ., y perdonen si "meto la cuhara donde no debo"
Yo uso avr ., desde que empece con los micros ., ASM intente aprenderlo ., pero "no doy pie con bola" ., el consultante pregunta si se puede pasar de lenguaje C++ a ASM ., para grabar un arduino
Si bien el compilador acepta librerias con extencion .C (las redefiniciones para que funcione en C++  o .CPP tiene que estar en una libreria .H) ., y tambien acepta librerias .S (ASM)
Pero aca no es el problema del lenguaje ., sino si el arduino acepta que sea de otra manera (y es lo que no seme entendio)
Si yo quisiera grabar una compilacion ( C o ASM) ., en un arduino ., no me deja marca error
Y es a eso alo que me refiero ., cualquiera de las compilaciones anteriores ya tiene el "BOOTLADER" incomporado ., y el arduino lo agrega al momento de grabarlo
Si alguno piensa que se puede grabar con otro grbador por los terminales ISP ., veran que no los deja
La proteccion logica delos FUSEBIT ., (que se graban aparte en los ATMEGA., no es igual que los PIC)
La unica manera de solucionar esto es acceder desde el compilador en la plataforma arduino y cambiarlo desde alii (fusebit)
Entonces si podemos grabar deslos terminales ISP como si fuera cualquier micro
Yo creo que la confucion se da por el tema de los lenguajes ., pero aparte de eso ., esta la limitacion que impone el propio arduino par su programacion
Si el consultante quiere compilar en ASM ., puede hacerlo ., pero sobre un micro "virgen" o bien borrar el arduino y dejarlo con la configuracion igual a uno virgen
De otra manera ., dudo que pueda hacerlo

De hecho con avrdude puedes subir cualquier programa al arduino usando el bootloader de arduino, por lo que no lo tienes que borrar el micro antes.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:Convertir sketch a ensamblador
« Respuesta #24 en: 21 de Abril de 2018, 12:20:02 »
Si el consultante quiere compilar en ASM ., puede hacerlo ., pero sobre un micro "virgen" o bien borrar el arduino y dejarlo con la configuracion igual a uno virgen [/left]
De otra manera ., dudo que pueda hacerlo


No tiene porque estar en estado virgen el microcontrolador para poder grabarle un programa compilado desde un fuente en ensamblador, se puede cargar perfectamente desde el bootloader, da igual el lenguaje en el que estuviera el fuente.

La única diferencia entre un programa compilado para cargarlo por un bootloader o no, es la dirección de arranque del programa. En C eso lo puedes configurar en el Linker Script, y es probable que también lo puedas hacer igual si el fuente está en ensamblador, ya que eso afecta solo al proceso de enlazado, no al de compilación.

Otra cosa, es localizar donde narices esconde Arduino los linker script, para modificarlos a tu antojo, a mi me costó lo suyo encontrarlos para los Teensy (que usan Arduino), así puedo compilar para cargar mis programas sobre un Kinetis que instala mi propio bootloader encriptado, cuando es para dárselo al cliente, o sin bootloader ni encriptación durante la fase de  desarrollo. Los menús de Arduino, los tengo modificados para poder elegir entre compilar o no para mi booloader, lo único que hace es elegir uno u otro linker script.

Arduino es un entorno muy oscuro, buena parte de su infraestructura está escondida, por eso no es nada recomendable para alguien que quiera aprender con intención de poder abrirse a cualquier otro entorno que respete un estandard, como es ARM. Es lo mismo que esos entornos basados en diagramas de flujo, te quedas atrapado en un mundo propietario del que no puedes salir, con sus reglas y sus limitaciones, que son muchas, con nula portabilidad.  Mucho mejor optar por micros basados en ARM, como STM32, NXP Kinetis, LPC, Atmel SAM y otros.
« Última modificación: 21 de Abril de 2018, 12:40:30 por planeta9999 »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Convertir sketch a ensamblador
« Respuesta #25 en: 21 de Abril de 2018, 13:57:06 »
tsk:
Estoy de acuerdo con que las funciones de Arduino son lentas y se pueden optimizar mucho más.
De hecho lo que suelo hacer yo es escribir directamente el pin que me interesa con una sencilla orden. Si quiero activar el pin4:
   PORTD |= (1<<4);
Si quiero apagarle:
   PORTD &= ~(1<<4);

https://www.arduino.cc/en/Reference/PortManipulation
https://upload.wikimedia.org/wikipedia/commons/thumb/c/c9/Pinout_of_ARDUINO_Board_and_ATMega328PU.svg/800px-Pinout_of_ARDUINO_Board_and_ATMega328PU.svg.png


Pero estas órdenes están llenas de complicaciones para alguien que comienza, así que en Arduino se pueden utilizar las órdenes:
   digitalWrite(4, HIGH);
   digitalWrite(4, LOW);
y todos tan contentos.


Yo creo que si Loudness quiere aprender C, ha quedado claro que en el foro conocemos bien el lenguaje y estamos dispuestos a ayudarle.

Lo único que queda es que comience a programar y a preguntar dudas para que se las podamos resolver.



Un saludo.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Convertir sketch a ensamblador
« Respuesta #26 en: 21 de Abril de 2018, 14:12:22 »
Arduino es un entorno muy oscuro, buena parte de su infraestructura está escondida, por eso no es nada recomendable para alguien que quiera aprender con intención de poder abrirse a cualquier otro entorno que respete un estandard, como es ARM. Es lo mismo que esos entornos basados en diagramas de flujo, te quedas atrapado en un mundo propietario del que no puedes salir, con sus reglas y sus limitaciones, que son muchas, con nula portabilidad.  Mucho mejor optar por micros basados en ARM, como STM32, NXP Kinetis, LPC, Atmel SAM y otros.

Planeta, eso hay que matizarlo. Para alguien que no conozca nada de Arduino puede dar una impresión falsa.

1º Arduino es de código abierto. TODOS los fuentes están disponibles y no existe NINGUNA restricción para leer, modificar o distribuir los ficheros fuentes originales o modificados. Es por completo Open-Source.

2º La infraestructura no está escondida, simplemente no aparece en los menús de usuario porque estos están dirigidos a usuarios inexpertos a los que no les interesa nada lo que hay por debajo. Pero todas las librerías que busques las puedes encontrar en su directorio de instalación, en código fuente (no compilado).

3º Todo el código de Arduino está escrito en C o en C++ estandar y puedes portarlo sin problemas a otras plataformas. Es open-source, así que no tendrás ningún problema. No estás atrapado por nada.


A partir de aquí es cierto que si utilizas mucho las librerías de Arduino, tienes el problema de que en otros entornos no están disponibles y tendrás que portarlas tú mismo a mano si quieres utilizarlas. Por otro lado ya hemos visto que estas funciones y librerías están hechas para facilitar la vida a los principiantes y son muy lentas e ineficientes.
Otro problema que puedes encontrar es que las librerías tienen muchos comentarios en el código, pero no existen manuales para hackearlas (se supone que un usuario inexperto no lo necesita), así que si quieres modificarlas como ha hecho planeta, te tocará leer unos cuantos ficheros fuentes hasta entenderlo y poder modificarlo.
Pero esos son los únicos fallos de Arduino y los está comentando alguien experto que ha decidido modificar los fuentes de Arduino y lo ha conseguido hacer de forma completamente legal. El único problema consiste en que ha tardado más tiempo de lo que esperaba, por falta de manuales.
« Última modificación: 21 de Abril de 2018, 14:17:26 por Picuino »

Desconectado tsk

  • PIC18
  • ****
  • Mensajes: 258
Re:Convertir sketch a ensamblador
« Respuesta #27 en: 21 de Abril de 2018, 15:02:18 »
2º La infraestructura no está escondida, simplemente no aparece en los menús de usuario porque estos están dirigidos a usuarios inexpertos a los que no les interesa nada lo que hay por debajo. Pero todas las librerías que busques las puedes encontrar en su directorio de instalación, en código fuente (no compilado).

3º Todo el código de Arduino está escrito en C o en C++ estandar y puedes portarlo sin problemas a otras plataformas. Es open-source, así que no tendrás ningún problema. No estás atrapado por nada.

Si estás atrapado por algo, las Licencias. Puedes verlo como una trampa o no dependiendo de los objetivos que tengas.

El core de Arduino está en LGPL (sin ninguna excepción), por lo que al distribuir el sistema, tienes la obligación de incluir el código objeto (.o) de tu aplicación y con las instrucciones y/o mecanismos para que lo pueda re enlazar con otras librerías, que por lo general serían actualizaciones. Hay otras librerías, como la que maneja las tarjetas SD que está bajo GPL 3 y tienes que liberar el código fuente de tu aplicación, a menos que te quieras ver inmerso en problemas legales.

El año pasado, el creador de la librería SdFat le cambió la licencia por MIT, pero aun en la versión 1.8.5 que se puede descargar y la versión nightly, todavía no hay ningún cambio, siguen usando la versión que está licenciada bajo GPL 3. La GPL3 era un impedimento para que las librerías SD se pudieran licenciar en otros términos distintos.

Aquí está la versión que están en MIT.

https://github.com/greiman/SdFat

Y aquí está el commit del cambio de Licencia

https://github.com/greiman/SdFat/commit/e4190e50a4ed83c73fb046b7fce2694e8cfe2ddb  (4 de Octubre de 2017)

Si nos vamos un poco más abajo, se requieren unas librerías que usa el mismo toolchain (avr-gcc) que son las libgcc y las avr-libc. Las primeras están en GPL3, pero con una excepción que evita que tengas que liberar el código fuente de tu aplicación, o incluso tener que entregar el código objeto de tu aplicación, y las avr-libc si más no recuerdo están bajo una licencia modificada tipo BSD, con lo cual tampoco hay problemas.

Por más principiante que seas, debes saber o te deben de informar en que te estas metiendo y al menos, por cortesía deberían de poner que licencias están involucradas.

Por ejemplo:
https://www.arduino.cc/en/Reference/SD

No hay referencia que se encuentra bajo GPL 3.

Desconectado locodelafonola

  • PIC10
  • *
  • Mensajes: 43
Re:Convertir sketch a ensamblador
« Respuesta #28 en: 21 de Abril de 2018, 15:13:12 »
Hola ., para no seguir desviandonos del tema ., esto es lo que se pregunta en el primer mensaje
Hola a todos

Llamarme loco que lo estoy :D pero hay queda la pregunta:

Se puede pasar un sketch de arduino a ensamblador?

O un poco mas: se puede programar arduino en ensamblador?

Me vais a decir que es una locura, que no es necesario, que aprenda c...
Pero todavia no tengo valor (tiempo) para ponerme con el c y lo de utilizar un sketch o cualquier programa sin entenderlo, la verdad es que no me gusta.

Por eso quiero pasarlo a ensamblador, para comprenderlo, modificarlo y utilizarlo con seguridad e, incluso dado el momento pasarlo a un pic 8)

Espero cualquier comentario, idea o reprimenda sobre el tema

Saludos
Si bien dice que quiere aprender C ., ese no es el problema
como bien explica quiere usar la plataforma arduino para cargar compilaciones en ASM
Como dije antes .,  arduino no lo permite (aparte de tener el FUSEBIT del ISP desabilitado)
Pero si  queremos grabar una complacion ditinta a C++ ya sea ASM o C tambien no largaria error
A menos que borramos el chip y dejaramos los fusebit de fabrica ., por el simple hecho de que cuando el compilador arduino ., compila el sketch se agrega el BOOTLADER
De la misma manera lo hace el compilador en otro lenguaje (C o ASM es igual )

* compilador AVR.jpg
(68.98 kB, 720x509 - visto 1403 veces)
O sea que al momento de grabar ., nos esta grabando DOS BOOTLADER ., y alli marca error
Y si alguno piensa que no es asi ., fijencen que pines usas la interfaz arduino para grabar el atmega328p (por ejemplo)
No es solamente una cuestion de lenguaje ., sino tambien el modo en que lo hace ., y alli solo acepta C++ ., y no otro lenguaje
« Última modificación: 21 de Abril de 2018, 15:20:47 por locodelafonola »
yo solo se que ...nose nada

Desconectado tsk

  • PIC18
  • ****
  • Mensajes: 258
Re:Convertir sketch a ensamblador
« Respuesta #29 en: 21 de Abril de 2018, 15:54:13 »
El problema es que inicialmente quería saber si podía obtener el ASM de un sketch, y por lo tanto también programar una placa de Arduino en ASM. Lo cual es totalmente posible

No requiere borrar el bootloader del arduino ni resetearlo.

avrdude puede usar el bootloader de arduino como protocolo para subir cualquier binario generado, ya sea con el IDE de Arduino o sin el IDE de Arduino. No importa si lo haces en C o ASM. Lo he hecho en varias oportunidades.

Se hace con la siguiente instrucción:

Código: [Seleccionar]
avrdude -F -V -c arduino -p ATMEGA328P -P /dev/ttyUSB0 -b 57600 -U flash:w:programa.hex

También arduino no agrega a tu sketch el bootloader. Con eso se eliminaría el objetivo pricipal del bootloader, además de que se tendría que sobreescribir el mismo cada vez que se suba un nuevo programa.

El bootloader puede estar hecho en C, pero le puedes subir programas hechos en ASM, C, C++, Pascal o cualquier otro que pueda generar código máquina para el microcontrolador. No importa como obtuviste el programa.hex, lo que importa es que el contenido tenga instrucciones válidas para la arquitectura del microcontrolador.

PD: También agregó que hiciéramos  comentarios y reprimendas, ergo, no nos estamos desviando del tema  :lol:


 

anything