¿Cómo utilizar Keil para empaquetar programas C en bibliotecas lib?
1. Crear lib
Crear lib es muy simple, solo necesita crear un destino, luego agregar todo el código que necesita empaquetarse y luego seleccionar "Crear biblioteca". en la opción "Destino", y luego compilar, porque es una biblioteca, por lo que no necesita vincular ni compilar, ¡su biblioteca está creada! Después de la compilación, se crea su biblioteca. Por supuesto, para comodidad de los demás, proporcione compatibilidad con archivos de encabezado.
2. Usar lib
Usar lib es más simple, simplemente agregue los archivos lib y de encabezado al proyecto y luego llámelos directamente. La biblioteca lib se vinculará con otros objetos compilados en el proyecto para formar el archivo objeto final.
3. Notas
En primer lugar, no encapsule los controladores de inicio e interrupción en LIB, porque estos programas causarán problemas en el momento del enlace. La razón es un poco complicada, pero creo que se debe a los diferentes mecanismos de vinculación para las rutinas de interrupción.
En segundo lugar, el archivo Lib debe dividirse en más detalles. Dos funciones que no tienen relación de llamada no deben colocarse en el mismo archivo C, porque LIB51 está vinculado a un módulo y a un módulo vinculado. corresponde a un archivo .C, si el enlazador introduce un módulo porque quiere usar una de sus funciones fA, entonces se introducirá otra función en el módulo A, y otra función si el enlazador introduce el módulo porque quiere usar su función. fA A, luego se introducirá otra función en el módulo A, y si no usa esa otra función, se activará la clásica advertencia UNCALLED FUNC de Keil, que se indica claramente en la documentación de Keil, así que la pegaré aquí. :
Durante el desarrollo, es una práctica común escribir pero no llamar
funciones adicionales. Aunque el compilador permite esto sin errores,
Linker/Locator no maneja este código de forma arbitraria. Si bien el compilador permite esto sin errores, el
enlazador/localizador no maneja este código al azar porque admite la sobrescritura de datos
y emitirá un mensaje de advertencia.
Las funciones de interrupción nunca se llaman, sino que las llama el hardware.
El enlazador trata las rutinas no llamadas como rutinas de interrupción potenciales. Esto
significa que a la función se le asignará el espacio de datos no sobrescribible de sus variables
locales. Esto agotará rápidamente toda la memoria de datos disponible (dependiendo del modelo de memoria utilizado).
Si la memoria se agota inesperadamente, asegúrese de revisar el vinculador para detectar advertencias relacionadas con rutinas no utilizadas o no utilizadas
. Puede incluir una lista de referencias cruzadas en un archivo de mapa del vinculador (.M51) utilizando la directiva IXREF
del vinculador.
En otras palabras, el modo de aplicación de memoria de Keil es para direcciones específicas, lo que significa que debes decidir qué direcciones se pueden reutilizar en función de la relación de llamada. Para este tipo de función que nadie llama, Keil la considerará un controlador de interrupciones y no puede determinar la relación de llamada. Por lo tanto, el espacio de este tipo de función que nadie llama no se puede compartir con otros programas. esta función utiliza cuánta RAM tienes, cuánta menos RAM tienes. ¿Qué pasa si hay más llamadas involuntarias? ---- Tonterías, claro que es un desbordamiento de memoria.
Por lo tanto, las funciones de lib se pueden hacer muy grandes y completas, pero los módulos internos deben dividirse en muchos detalles y ser precisos. Solo de esta manera podrá usarlo con tanta libertad como puede usar CRT. Windows.
Resumen personal
1. No puede haber una función principal en el proyecto que genera lib, solo puede haber un archivo .c y un archivo .c solo puede tener una función.
2. Debe crear un archivo .h en el proyecto lib y debe usar extern para declarar variables y funciones globales.
3. El proyecto que llama al archivo lib debe contener el archivo lib .h, lo que significa que el proyecto lib y el proyecto que llama contienen el mismo archivo .h (parece un poco absurdo)
4.Lib Los archivos deben dividirse con más cuidado y dos funciones que no tienen una relación de llamada no deben colocarse en el mismo archivo C. Las funciones sin relaciones de llamada se colocan mejor en archivos .c separados. Esto es para evitar alarmas cuando la aplicación llama a la biblioteca lib en keil. Debido a que LIB51 está vinculado por módulo, un módulo corresponde a un archivo C. Si el vinculador importa el módulo A porque quiere usar una de sus funciones fA, entonces también se importará otra función en el módulo A, y si no usa la otra función, entonces se activará la clásica advertencia UNCALLED FUNC de Keil. Haga clic derecho en el grupo y agregue. Tenga en cuenta que *.lib está seleccionado como tipo de archivo.