Uso del marco de software de Atmel

http://www.atmel.com/tools/avrsoftwareframework.aspx?tab=overview

En mi empresa hay un proyecto, en función de esta librería. Sin embargo, se usa copiando y pegando algunos archivos .c y .h en el proyecto y agregando sus nombres al archivo MAKE.

Espero que la forma correcta de usar una biblioteca de terceros sea

  • obtener la biblioteca estática ya compilada más encabezados públicos
  • u obtenga un proyecto autónomo para construir lo anterior y luego los proyectos de usuario para que dependan de la biblioteca construida, y no de sus fuentes.

Sin embargo, no he tenido éxito en aislar una solución. La descarga, que he vinculado en la parte superior de la pregunta, tiene un tamaño de 1,25 GB y consta de varias fuentes y archivos MAKE.

Mi objetivo es SAM4S y la placa es totalmente personalizada.

EDITAR:

Para aclarar, estas son mis razones para pensar que mis dos puntos anteriores son la forma más limpia de integrar una biblioteca estática de terceros.

  • Control de versiones: obtenga las nuevas versiones de la biblioteca de forma limpia.
  • Separación: lógicamente, la biblioteca no forma parte del proyecto principal, por ejemplo, no debe depender del proyecto externo (de lo contrario, el código spagetti).
  • Solo lectura: nunca caiga en la tentación de modificar el código de terceros. Si lo hace, 1. introduce errores, porque generalmente carece de la comprensión de los autores de la biblioteca y 2. impide la actualización a versiones más nuevas de la biblioteca.
No sé la licencia de mi cabeza, pero en general, copiar y pegar fuentes es una forma perfectamente razonable de integrar una biblioteca.

Respuestas (2)

Creo que la pregunta es por qué se proporciona una biblioteca de terceros como código fuente en lugar de un archivo de objeto precompilado para ser tratado como una caja negra.

Considere las opciones del compilador que afectan cómo se construye el código que realiza llamadas a las funciones de la biblioteca y maneja los retornos de las funciones de la biblioteca. ¿Existen opciones del compilador que afecten, por ejemplo:

  • Convenciones de paso de argumentos (son argumentos pasados ​​en la pila o en registros o una combinación)
  • Endianess (algunos núcleos ARM se pueden configurar como big o little endian... no estoy seguro sobre el SAM4S)

Si no se utilizan las mismas opciones en ambos lados de la interfaz, el programa fallará.

Considere también que el código fuente de Atmel se usa en varias plataformas, que incluyen no solo una variedad de microcontroladores con núcleos ARM, sino también su línea de productos AVR. ¿Cuántas versiones diferentes de bibliotecas estáticas precompiladas tendrían que existir para cubrir las combinaciones de opciones del compilador y objetivos del microcontrolador? La cantidad de archivos de objetos necesarios para cubrir todas estas permutaciones sería simplemente inmanejable.

Debo admitir que no tengo claro cómo es "más limpio" verificar un archivo de objeto precompilado de un sistema de control de versiones que verificar archivos fuente. Si lo que le preocupa es extraer solo un archivo de objeto precompilado en lugar de extraer varios archivos de origen, considere organizar los archivos de manera que los archivos de origen de la biblioteca estén ubicados en un subdirectorio bien nombrado propio. Esto no reduce la cantidad de archivos, pero puede ayudar con el aspecto de limpieza/organización.

Aquí hay un ejemplo de una posible razón:

El código necesita establecer un par de pines de hardware asignados por el desarrollador. Si la biblioteca se proporciona como código fuente, el desarrollador puede #definir los pines de hardware y luego el código dentro de la biblioteca podría ser

PUERTO_CONSTANTE.SALIDA = (1 << PIN0_CONSTANTE) | (1 << PIN1_CONSTANTE) ;

Las referencias son constantes y la línea podría compilarse en una instrucción de procesador.

Si la biblioteca se proporciona como archivos de objetos, dentro de la biblioteca, el código debería ser algo como

puerto_variable.OUT = (1 << pin0_variable) | (1 << pin1_variable) ;

Las referencias se obtienen de las variables y la línea debería ser unas pocas instrucciones del procesador dentro de la biblioteca.