tabla sistema numeros escribir como codigo binario aprender alfabeto abecedario c embedded cross-compiling microcontroller

sistema - ¿Qué partes de la base de código están haciendo binarios grandes?



como escribir en codigo binario (3)

GNU binutils tiene herramientas para ayudarlo a determinar el tamaño de cada símbolo o simplemente cada archivo de objeto.

Eche un vistazo al size por ejemplo: https://manpages.debian.org/jessie/binutils/size.1.en.html

También vale la pena intentar nm , ya que puede mostrar el tamaño de cada símbolo en el código del objeto: https://manpages.debian.org/jessie/binutils/nm.1.en.html

Inspeccionar cuidadosamente la salida de size y nm le dará la intuición de lo que ocupa mucho espacio y lo que no.

Sepa que printf , sprintf y muchas de las funciones de biblioteca más complejas a menudo pueden ocupar unos cuantos kB de ROM extra.

El soporte de punto flotante usando soft-floats también aumentará el código en comparación con el uso de hard-float, es decir, el uso de la emulación de software frente a las instrucciones de hardware para manejar el punto flotante.

A veces el compilador agregará una cantidad asombrosa de hinchazón :)

Construí algo de código para un simulador y ahora estoy tratando de usar la cadena de herramientas gratuita de TI para compilar de forma cruzada a un objetivo con 64kb de nvram. El compilador afirma que mi código está a unos 34kb más allá de la ROM:

(...) msp430-elf/bin/ld: region `ROM'' overflowed by 33716 bytes

Otra línea dice que no puede encajar el campo .text en su espacio asignado. No puedo creer que mis adiciones sean 34kb en total, y mucho menos que los binarios se desborden en esta cantidad.

  • Los archivos .o que mi código ha agregado al proyecto son una pequeña fracción (200kb de los 1.9MB) del total del proyecto, y para empezar he sacado una gran cantidad de componentes que estaban en el proyecto.
  • Ya estoy pasando el compilador las banderas -Os -s .
  • El nuevo código tiene aproximadamente 100 caracteres de cadenas literales.
  • Mi código usa muchas funciones math.h (de hecho, es la única parte que hace aritmética de punto flotante), hace una llamada a strtod y hace una llamada a sprintf

¿Existen herramientas o métodos para desglosar lo que está causando que los binarios sean tan grandes?


También está AMAP, una pequeña y fácil interfaz gráfica de usuario para ver los archivos .map: http://www.sikorskiy.net/prj/amap/

Hubiera sido bueno tener una herramienta similar a kdirstat que le permita comparar visualmente los tamaños de los símbolos.

Aunque no es una respuesta directa a la pregunta, terminé usando la implementación CORDIC de Voidware para evitar usar las funciones grandes en <math.h> : https://github.com/enthdegree/cordic_wrapped


Una vez también tuve problemas de memoria con un pequeño controlador MSP430. La cadena de herramientas de TI está vinculando bibliotecas grandes a su binario si es posible que existan valores negativos o se use un punto flotante. En mi caso, fue alrededor del 10% - 20% del uso total de memoria.

El software gratuito Code Composer Studio de TI proporciona una visualización de memoria muy potente (Ver -> Asignación de memoria)

Lo que me ayudó mucho fue cambiar el modelo de inicialización en la configuración del enlazador y otras opciones de optimización. Actualmente no estoy trabajando con un controlador MSP430, así que no puedo decirle más detalles.