Revista 100% Verde

exit status 1 using typedef-name ‘fpos_t’ after ‘struct’

Por Soloelectronicos @soloelectronico

Si está viendo este página probablemente se deba que esta intentando actualizar el firmware Marlin de su impresora 3d desde el IDE de Arduino y no lo logra.

Marlin es un firmware de código abierto para la familia RepRap de replicar prototipos rápidos, popularmente conocidos como "impresoras 3D". Se deriva de Sprinter y grbl,y se convirtió en un proyecto de código abierto independiente el 12 de agosto de 2011 con su lanzamiento de Github. Marlin tiene licencia bajo la GPLv3 y es gratis para todas las aplicaciones.

Desde el principio Marlin fue construido por y para los entusiastas de RepRap para ser un controlador de impresora sencillo, confiable y adaptable que "simplemente funciona". Como testimonio de su calidad, M arlin es utilizado por varias impresoras 3D comerciales respetadas. Ultimaker, Printrbot, AlephObjects (Lulzbot) y Prusa Research son solo algunos de los vendedores que envían una variante de Marlin. Marlin también es capaz de conducir CNC y grabadores láser.

Una clave de la popularidad de Marlin es que se ejecuta en microcontroladores Atmel AVR de 8 bits de bajo costo - Marlin 2.x ha añadido soporte para placas de 32 bits. Estos chips están en el centro de la popular plataforma de código abierto Arduino/Genuino. Las plataformas de referencia para Marlin es un Arduino Mega2560 con RAMPS 1.4 y Re-Arm con rampas 1.4.

Como producto comunitario, Marlin tiene como objetivo ser adaptable a tantas placas y configuraciones como sea posible intentando ser configurable, personalizable, extensible y económico tanto para aficionados como para proveedores. Una construcción Marlin puede ser muy pequeña, para su uso en una impresora sin cabeza con solo hardware modesto. Las características se habilitan según sea necesario para adaptar Marlin a los componentes añadidos.

Marlin Firmware se ejecuta en la placa principal de la impresora 3D, gestionando todas las actividades en tiempo real de la máquina. Coordina los calentadores, pasos, sensores, luces, pantalla LCD, botones y todo lo demás involucrado en el proceso de impresión 3D.

Marlin implementa un proceso de fabricación aditiva llamado Fused Deposition Modeling (FDM), también conocido como Fused Filament Fabrication (FFF). En este proceso, un motor empuja el filamento de plástico a través de una boquilla caliente que funde y extruye el material mientras la boquilla se mueve bajo control informático. Después de varios minutos (o muchas horas) de colocar finas capas de plástico, el resultado es un objeto físico.

El lenguaje de control para Marlin es un derivado del código G. Los comandos de código G le dicen a una máquina que haga cosas simples como "establecer el calentador de 1 a 180o" o "mover a XY a la velocidad F." Para imprimir un modelo con Marlin, debe convertirse en código G utilizando un programa llamado "slicer". Dado que cada impresora es diferente, no encontrará archivos de código G para descargar; tendrás que cortarlos tú mismo.

A medida que Marlin recibe comandos de movimiento, los agrega a una cola de movimiento para ser ejecutados en la orden recibida. La "interrupción paso a paso" procesa la cola, convirtiendo los movimientos lineales en pulsos electrónicos con precisión en los motores paso a paso. Incluso a velocidades modestas Marlin necesita generar miles de pulsos paso a paso cada segundo. (p. ej., 80 pasos por mm * 50 mm/s a 4000 pasos por segundo!) Dado que la velocidad de la CPU limita la velocidad con la que la máquina puede moverse, ¡siempre estamos buscando nuevas formas de optimizar la interrupción paso a paso!

Los calentadores y sensores se gestionan en una segunda interrupción que se ejecuta a una velocidad mucho más lenta, mientras que el bucle principal controla el procesamiento de comandos, la actualización de la pantalla y los eventos del controlador. Por razones de seguridad, Marlin realmente se reiniciará si la CPU se sobrecarga demasiado para leer los sensores.

exit status 1 using typedef-name ‘fpos_t’ after ‘struct’

Instalación de Marlin en su impresora

Normalmente todas las impresoras 3d ya llevan el firmware instalado ( incluso las que vienen en kit ) pero conviene estar al tanto de las actualizaciones de este ( en cuyo caso habar que seguir el procedimiento siguiente) o puede que sea necesario cambiarlo para añadir alguna funcionalidad extra como por ejemplo la autonivelación o el cambio de idioma

En todos estos casos normalmente estos son los pasos que se siguen:

1. Instale Arduino en su PC.
Si su impresora es A10/A10M/A20/A20M, utilice Arduino 1.8.5 para finalizar la carga; Si es Prusa I3 Pro B/W/X/C, por favor vaya por Arduino 1.0.1!! De lo contrario, es posible que reciba algunos errores durante la verificación.
Descargue Arduino 1.0.1 o Arduino 1.8.5 aquí: https://www.arduino.cc/en/Main/OldSoftw ... s-anterior


2. Conecte la impresora al PC con el cable USB.
3. Descomprima el firmware. Aquí tomaremos el firmware para el extrusor dual I3 pro C, por ejemplo el proceso para la serie A10/A20 es bastante similar, excepto el Arduino en una versión diferente. Puede descargar el de su impresora aquí:
http://www.geeetech.com/forum/viewtopic ... 10&t-17046


4. Haga doble clic en el Marlin.ino, luego abrirá todo el firmware en el arduino.

exit status 1 using typedef-name ‘fpos_t’ after ‘struct’

5. Seleccione el puerto Com adecuado.


6. En Herramientas, en Board, seleccione Mega 2560 .


7. Finalmente haga clic en la flecha para compilar y cargar el firmware en su impresora.

Bien es cierto que debería de compilar el sw y nuestra impresora ya si estaría actualizada, pero lamentablemente no siempre es así, y desgraciadamente puede que nos lance un error de que no se puede compilar .

Por ejemplo en el caso de una Geetech Prusa i 3 W este es el mensaje que lanza el IDE de Arduino al intentar verificar el firmware:

Arduino:1.8.10 (Windows 10), Tarjeta:"Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)" In file included from sketch\Marlin.h:23:0, from sketch\ConfigurationStore.cpp:1: sketch\pins.h:2956:0: warning: "X_MAX_PIN" redefined #define X_MAX_PIN -1 sketch\pins.h:1363:0: note: this is the location of the previous definition #define X_MAX_PIN 24 sketch\pins.h:2957:0: warning: "Y_MAX_PIN" redefined #define Y_MAX_PIN 28 In file included from sketch\Marlin.h:23:0, from sketch\BlinkM.cpp:5: sketch\pins.h:2956:0: warning: "X_MAX_PIN" redefined #define X_MAX_PIN -1 sketch\pins.h:1363:0: note: this is the location of the previous definition #define X_MAX_PIN 24 sketch\pins.h:2957:0: warning: "Y_MAX_PIN" redefined #define Y_MAX_PIN -1 sketch\pins.h:1369:0: note: this is the location of the previous definition #define Y_MAX_PIN 28 In file included from sketch\Marlin.h:23:0,#define X_MAX_PIN 24 sketch\pins.h:2957:0: warning: "Y_MAX_PIN" redefined #define Y_MAX_PIN -1 sketch\pins.h:1369:0: note: this is the location of the previous definition #define Y_MAX_PIN 28 In file included from sketch\Marlin.h:23:0, #define X_MAX_PIN -1 sketch\pins.h:1363:0: note: this is the location of the previous definition #define X_MAX_PIN 24 sketch\pins.h:2957:0: warning: "Y_MAX_PIN" redefined #define Y_MAX_PIN -1 sketch\pins.h:1369:0: note: this is the location of the previous definition #define Y_MAX_PIN 28 In file included from sketch\Marlin.h:23:0,#define X_MAX_PIN -1 sketch\pins.h:1363:0: note: this is the location of the previous definition #define X_MAX_PIN 24 sketch\pins.h:2957:0: warning: "Y_MAX_PIN" redefined #define Y_MAX_PIN -1 sketch\pins.h:1369:0: note: this is the location of the previous definition #define Y_MAX_PIN 28 In file included from sketch\Marlin.h:23:0,sketch\pins.h:2956:0: warning: "X_MAX_PIN" redefined #define X_MAX_PIN -1 sketch\pins.h:1363:0: note: this is the location of the previous definition #define X_MAX_PIN 24 sketch\pins.h:2957:0: warning: "Y_MAX_PIN" redefined #define Y_MAX_PIN -1 sketch\pins.h:1369:0: note: this is the location of the previous definition #define Y_MAX_PIN 28 sketch\Marlin_main.cpp:2667:36: warning: invalid suffix on literal; C++11 requires a space between literal and string macro [-Wliteral-suffix]#define X_MAX_PIN -1 sketch\pins.h:1363:0: note: this is the location of the previous definition #define X_MAX_PIN 24 sketch\pins.h:2957:0: warning: "Y_MAX_PIN" redefined #define Y_MAX_PIN -1 sketch\pins.h:1369:0: note: this is the location of the previous definition #define Y_MAX_PIN 28 In file included from sketch\SdFile.h:27:0,sketch\Marlin_main.cpp:998:36: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] planeNormal.debug("planeNormal"); ^ In file included from sketch\SdBaseFile.cpp:24:0:SdBaseFile.h:38:8: error: using typedef-name 'fpos_t' after 'struct' struct fpos_t { ^~~~~~ In file included from sketch\Marlin.h:10:0, from sketch\SdBaseFile.cpp:21:sketch\SdBaseFile.cpp: In member function 'void SdBaseFile::getpos(fpos_t*)':SdBaseFile.cpp:299:8: error: request for member 'cluster' in '* pos', which is of non-class type 'fpos_t {aka long long int}' sketch\SdBaseFile.cpp: In member function 'void SdBaseFile::setpos(fpos_t*)': SdBaseFile.cpp:1496:23: error: request for member 'position' in '* pos', which is of non-class type 'fpos_t {aka long long int}' SdBaseFile.cpp:1497:22: error: request for member 'cluster' in '* pos', which is of non-class type 'fpos_t {aka long long int}' In file included from sketch\Marlin.h:23:0, from sketch\SdFatUtil.cpp:20: sketch\pins.h:2956:0: warning: "X_MAX_PIN" redefined #define X_MAX_PIN -1 sketch\pins.h:1363:0: note: this is the location of the previous definition #define X_MAX_PIN 24 sketch\pins.h:2957:0: warning: "Y_MAX_PIN" redefined #define Y_MAX_PIN -1 sketch\pins.h:1369:0: note: this is the location of the previous definition #define Y_MAX_PIN 28 Se encontraron varias bibliotecas para "LiquidCrystal.h" Este informe podría contener más información con "Mostrar salida detallada durante la compilación" opción habilitada en Archivo -> Preferencias. curCluster_ = pos->cluster; ^~~~~~~ curPosition_ = pos->position; ^~~~~~~~ pos->cluster = curCluster_; ^~~~~~~ SdBaseFile.cpp:298:8: error: request for member 'position' in '* pos', which is of non-class type 'fpos_t {aka long long int}' pos->position = curPosition_; ^~~~~~~~
exit status using typedef-name ‘fpos_t’ after ‘struct’
c:\program files (x86)\arduino\hardware\tools\avr\avr\include\stdio.h:950:33: note: 'fpos_t' has a previous declaration here extension typedef long long fpos_t; ^~~~~~ from sketch\cardreader.h:8, from sketch\Marlin_main.cpp:44:SdBaseFile.h:38:8: error: using typedef-name 'fpos_t' after 'struct' struct fpos_t { ^~~~~~ In file included from sketch\Marlin.h:10:0, from sketch\Marlin_main.cpp:30:c:\program files (x86)\arduino\hardware\tools\avr\avr\include\stdio.h:950:33: note: 'fpos_t' has a previous declaration here extension typedef long long fpos_t; ^~~~~~ sketch\Marlin_main.cpp: In function 'void set_bed_level_equation_lsq(double*)': LCD_MESSAGEPGM(MACHINE_NAME" "MSG_OFF"."); ^In file included from sketch\Marlin.h:23:0, from sketch\SdBaseFile.cpp:21:sketch\pins.h:2956:0: warning: "X_MAX_PIN" redefined from sketch\Sd2Card.cpp:20: from sketch\MarlinSerial.cpp:23:sketch\pins.h:2956:0: warning: "X_MAX_PIN" redefined from sketch\Marlin_main.cpp:30: sketch\pins.h:2956:0: warning: "X_MAX_PIN" redefined from sketch\thermistortables.h:4, from sketch\Configuration.h:792, from f:\Users\Carlos\Documents\Arduino\I3 ProW GT2560A+ with 3dtouch (1)\Marlin\Marlin.ino:33:sketch\pins.h:2956:0: warning: "X_MAX_PIN" redefined #define X_MAX_PIN -1 sketch\pins.h:1363:0: note: this is the location of the previous definition

Bueno , este error nos impide actualizar el firmarware Marlin de nuestra impresora, pero en las siguientes líneas veremos que lograr que compile el sw Marlin para nuestra impresora en particular puede ser un juego de niños

Para solucionar el problema de compilación, anterior sólo tiene que abrir ide Arduino con el firmware y hacer una búsqueda global y reemplazar.

Esto se hace haciendo Ctrl-F y selecciona la casilla de búsqueda de todas las pestañas. A continuación, buscar y reemplazar fpos_t por filepos_t. Volver a compilar y estará todo listo.

Se trata de un cambio en las nuevas versiones del software de Arduino IDE que está haciendo esto. Las versiones más recientes del firmware del Marlin tienen que la estructura filepos_t se llama así ,lo que no tendrá ningún efecto negativo en el firmware

sí que la raíz del problema con las nuevas versiones de Arduino es que ya definen un objeto denominado fpos_t en uno de los archivos globales instaladas con Arduino llamado stdio.h. Destacar en el el fichero stdio.h ha sido un problema con muchos usuarios en línea de cambiar al nuevo Arduino y la compilación de los firmwares más antiguas basadas Marlin. Es por ello que l as nuevas versiones de Marlin han pasado a utilizar filepos_t para el nombre de estructura en su lugar. Si se realiza ese cambio a sus versiones de firmware publicadas, a continuación nadie más tendría los problemas que tenía con cargar el firmware original pero bueno sabiéndolo podemos poner el remedio.

Si la solución anterior no le fue suficiente alguien informó recientemente el mismo problema con Marlin y así ha solucionado el problema

  • Herramientas > Tablero > Administrador de placas... > Arduino AVR Boards(haga clic en él) > seleccione 1.6.11 en el menú "Seleccionar versión" > Instalar
  • Una vez completada la instalación, haga clic en el botón "Cerrar"


El problema es causado por la nueva versión del compilador incluida con Arduino AVR Boards 1.6.12 y más tarde, es más exigente con el código malo que alguien escribió. Tendrá sin necesidad de actualizar a cualquier versión de Arduino AVR Boards por encima de 1.6.11 hasta que alguien solucione el problema en el código Marlin.
¿Está utilizando la última versión del firmware real de Marlin o es alguna versión anterior o una versión modificada no estándar?


Volver a la Portada de Logo Paperblog