por partes para niños divisor divisiones dividir dividendo decimales con como cifras calculadora c gcc makefile arm

partes - Cuál es la causa de no poder dividir números en GCC



divisiones (5)

Estoy teniendo una situación muy extraña. Cada vez que intento compilar mi proyecto de brazo (LPC2378, codesourcery arm-none-eabi-gcc-4.5.1) me queda el mismo error al enlazar

/media/data/Projects/arm/uart/main.c:39: undefined reference to `__aeabi_uidiv'' /media/data/Projects/arm/uart/main.c:40: undefined reference to `__aeabi_uidiv''

El código ofensivo se ve así:

U0DLL = ((((PLLCFG & 0x7FFF) + 1) * F_OSC) / ((((PLLCFG & (0xFF << 16)) >> 16) + 1) * ((CCLKCFG & 0xFF) + 1) * 8 * BAUD * 1)) % 256; U0DLM = ((((PLLCFG & 0x7FFF) + 1) * F_OSC) / ((((PLLCFG & (0xFF << 16)) >> 16) + 1) * ((CCLKCFG & 0xFF) + 1) * 8 * BAUD * 1)) / 256;

He buscado y qué puede causar esto, AFAICT, no usa las opciones lgcc & lc para LD. Lo resolví y aún así el error permanece.

El proyecto completo se puede encontrar en mi repositorio github .

Si alguien pudiera ayudar sería muy recibido. Aclamaciones.


Normalmente evito las divisiones, cuando tengo que usar una, a veces pego este problema. La fuente (ensambladora) de esas funciones de división está en las fuentes de gcc, no es demasiado difícil extraer ese código y simplemente vincularlo cuando gcc no coopera. Una vez que tenga una versión con las macros eliminadas, etc., una fuente limpia, puede llevar eso en su bolsillo trasero. Buscando en Google, en un momento encontré que la sugerencia era usar el no Linux eabi, pero como has descubierto, eso no siempre funciona, a veces, pero no siempre.


La familia de CPU ARM no tiene una instrucción de división entera nativa. Entonces, la división necesita ser implementada por una función de biblioteca. GCC lo sabe y crea una referencia a (en su caso) __aeabi_uidiv (para la división unsigned int ).

Tendrá que enlazar con una biblioteca de soporte de tiempo de ejecución adecuada que contenga esta función.


Suena como un problema de cadena de herramientas: tal vez tu gcc está diseñado para ARM EABI pero tus bibliotecas (libgcc?) Fueron creadas para ABI tradicional.


libgcc.a este problema y lo resolví pasando la ubicación correcta de libgcc.a en el libgcc.a Makefile . Puede que tenga que agregar:

"-L*path_to_libgcc.a* -lgcc"

a LDFLAGS


Compruebe si su libgcc.a reside en el directorio codesourcery donde debería estar. Tuve el mismo problema con TI starterware, que arregló la ruta a libgcc.a en uno de los archivos make.