IAR: создание библиотеки |
Добавил(а) microsin |
Прекомпилированные библиотеки, которые созданы из модулей кода, полезно использовать в больших проектах для ускорения процесса компиляции. В библиотеки целесообразно поместить код, который не меняется в настоящий момент (когда идет работа над чем-то другим). В составе IAR есть обстоятельная документация "IAR Runtime Environment and Library User Guide" [1], однако это руководство довольно большое и сложное для изучения. Здесь представлены простые инструкции - как в проекте использовать заранее скомпилированный код в виде библиотек (prebuild library), чтобы помногу раз не перекомпилировать одни и те же файлы и экономить время разработки. [Как создать библиотеку в IAR] 1. Создайте проект, куда добавьте модули исходного кода, которые должны быть помещены в библиотеку (меню Project -> Create New Project... -> C -> main -> OK -> укажите имя файла проекта и выберите папку, куда он будет сохранен). Удалите из проекта модуль main.c, который был создан автоматически, и добавьте в проект все модули кода, которые должны быть помещены библиотеку. Настройки нового проекта для библиотеки будут во многом копировать настройки других Ваших проектов - нужно выбрать тип процессора, уровень оптимизации, прописать пути поиска заголовков и проч. Как вариант, можно создать пустой проект, и потом его настроить на создание библиотеки. Процесс по шагам, На примере кода STM32_USB_Host_Library из STM32Cube_FW_F4_V1.24.0: 1. Создайте пустой проект через меню Project -> Create New Project... -> Empty Project -> OK. IAR запросит ввести имя файла для проекта (файл с расширением *.ewp). Укажите короткое, но понятное имя, отрающее назначение будущей библиотеки. Например, для библиотеки хоста USB STM32 (STM32_USB_Host_Library) я указал имя USBhost, и сохранил этот файл в корневом каталоге библиотеки. 2. Откройте опции проекта. В разделе General Options -> Output выберите радиокнопку Library. Как вариант, можно указать папку, куда будет сохранен выходной файл компилируемой библиотеки. Я обычно указываю этот путь относительно каталога проекта $PROJ_DIR$, см. скриншот: 3. Выберите тип процессора, для которого компилируете библиотеку, для чего перейдите в раздел General Options -> Target. Переключите радиокнопку "Processor variant" на Device, и с помощью кнопки выберите тип микроконтроллера (ST -> STM32F4 -> STM32F429 ->STM32F429ZI). Закройте окно опций проекта кнопкой OK. 4. Добавите в проект все необходимые файлы библиотеки. 5. Теперь нужно настроить пути поиска заголовочных файлов для препроцессора. Для этого попробуйте скомпилировать проект. Конечно, компилятор может не найти некоторые необходимые заголовочные файлы, и в консоли сборки Build покажет соответствующие сообщения, например: Changed settings forces a full rebuild... Building configuration: USBhost - Debug Updating build tree... 0 file(s) deleted. Updating build tree... Снова откройте опции проекта, и в разделе C/C++ Compiler -> Preprocessor, в область ввода "Additional include directories: (one per line)" добавьте строки путей поиска заголовочных файлов, например: $PROJ_DIR$\..\..\..\Middlewares\ST\STM32_USB_Host_Library\Core\Inc $PROJ_DIR$\..\..\..\Middlewares\ST\STM32_USB_Host_Library\Class\MSC\Inc $PROJ_DIR$\..\..\..\Inc $PROJ_DIR$\..\..\..\Drivers\CMSIS\Device\ST\STM32F4xx\Include $PROJ_DIR$\..\..\..\Drivers\CMSIS\Include $PROJ_DIR$\..\..\..\Drivers\STM32F4xx_HAL_Driver\Inc $PROJ_DIR$\..\..\..\Drivers\BSP $PROJ_DIR$\..\..\..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS $PROJ_DIR$\..\..\..\Middlewares\Third_Party\FreeRTOS\Source\include $PROJ_DIR$\..\..\..\Middlewares\Third_Party\FreeRTOS\Source\portable\IAR\ARM_CM4F Каждое добавление пути проверяйте компиляцией (F7), и продолжайте добавлять пути поиска, пока компилятор не перестанет выдавать сообщения об ошибке поиска заголовочных файлов. 6. На определенном этапе компиляции могут возникнуть другие ошибки, связанные с отсутствием в проекте некоторых символов, например определений типа процессора. Например: usbh_msc_scsi.c Fatal Error[Pe035]: #error directive: "Please select first the target STM32F4xx device used in your application (in stm32f4xx.h file)" D:\asm\radiopager\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h 191 Error while running C/C++ Compiler Снова откройте опции проекта, и снова перейдите в раздел C/C++ Compiler -> Preprocessor. В область ввода "Define symbols: (one per line)" добавьте недостающие символы. Снова скомпилируйте проект. В случае появления ошибок поиска заголовочных файлов повторите шаг 5. 7. В результате проект скомпилируется без ошибок, например: Building configuration: USBhost - Debug Updating build tree... В выходном каталоге появится библиотечный файл имяпроекта.a (в нашем примере USBhost.a). Теперь этот двоичный файл библиотеки можно использовать в другом проекте вместо файлов исходного кода - удалите из проекта модули исходного кода, и добавьте в проект файл скомпилированной библиотеки. [Дополнительные настройки] 8. Можно настроить для библиотеки дополнительный уровень оптимизации кода, для чего перейдите в раздел опций C/C++ Compiler -> Optimizations. Радиокнопка Level вместе с выпадающим списком Balanced/Size/Speed/ и галочками тонкой настройки позволяют указать необходимую опимизацию, выполняемую компилятором. Как обычно, когда разрабоатываемое приложение еще отлаживается, полезно выбрать уровень оптимизации None, тогда будут полностью доступны все символы библиотеки и отладка по её исходному коду. Если же разработка близка к завершению, обычно выбирают уровень оптимизации High -> Speed (оптимизация по скорости) или High -> Size (оптимизация по размеру). Примечание: качественно написанный код должен одинаково хорошо работать как с включенной, так и с выключенной оптиммизацией. Переключение уровня оптимизации в общем случае хорошее средство выявления багов и узких мест в коде. Обычная ситуация - проект с отключенной оптимизацией работает, а со включенной оптимизацией не работает. Тогда разделение проекта на отдельно компилируемые библиотеки дает способ определить, какая часть кода критична к оптимизации, а какая нет. 9. Можно настроить две конфигурации проекта библиотеки - одну для отладки (Debug), другую для релиза (Release). По умолчанию при создании пустого проекта автоматически создаются эти две конфигурации Debug и Release (диалог конфигураций открывается через Project -> Edit Configurations...): Одна из конфигураций Debug у нас уже настроена. Теперь для настройки конфигураци и Release нужно её выбрать, и настроить в ней все необходимые опции, повторив шаги 2, 3, 5, 6. Это довольно утомительный процесс, даже с учетом того, что можно копировать опции через буфер обмена. Но есть способ поступить проще - удалить конфигурацию Release и создать её заново на основе конфигурации Debug, при этом все опции скопируются автоматически. Останется выбрать только уровень оптимизации. Для этого откройте диалог Project -> Edit Configurations..., удалите конфигурацию Release (кнопкой Remove, при этом текущей должна быть конфигурация Debug). После этого нажмите кнопку New... введите имя конфигурации (например Release) и создайте её на основе конфигурации Debug, нажав кнопку OK: В созданной конфигурации придется заново повторить ввод выходной директории (раздел General Options -> Output, поле ввода Executables/libraries), и настроить оптимизацию (C/C++ Compiler -> Optimizations) и отключить вывод отладочной информации (C/C++ Compiler -> Output, снять галочку "Generate debug information"). 2. Откройте свойства проекта, перейдите в раздел General Options, выберите закладку Output. Переставьте радиокнопку Output file в положение Library. 3. Скомпилируйте проект. По умолчанию выходной файл библиотеки создастся в папке Debug\Exe, и файл получит имя проекта и расширение *.a. Это и есть прекомпилированный файл библиотеки. Теперь его нужно добавить в тот проект. [Как добавить библиотеку в проект вместо модулей исходного кода] 1. Удалите из проекта все файлы модулей, которые были перенесены библиотеку. Проще всего, когда эти модули в проекте содержатся в отдельной папке. Тогда достаточно просто отключить от процесса компиляции в проекте папку с этими модулями, не удаляя их из проекта (впоследствии всегда можно их подключить обратно). Щелкните в дереве проекта правой кнопкой на папке, которую хотите отключить от компиляции, выберите Options... и поставьте галочку Exclude from build. Теперь эти модули компилироваться не будут. Код из этих модулей будет браться из библиотеки. 2. В проекте, куда хотите добавить библиотеку, зайдите в свойства проекта через меню Project -> Options, перейдите в раздел Linker -> закладка Library, и в поле Additional libraries добавьте полный путь до файла библиотеки. Не стесняйтесь использовать макросы IAR типа $PROJ_DIR$, чтобы удалить привязку к абсолютным путям. Например, путь до файла библиотеки может быть наподобие следующего: $PROJ_DIR$\..\..\precompiled-IAR-libs\efsl-lib\Debug\Exe\efsllibprj.a 3. Перекомпилируйте проект с добавленной библиотекой. Он должен скомпилироваться без ошибок. [Ссылки] 1. IAR Runtime Environment and Library User Guide site:supp.iar.com. |