Должен ли STM32 HAL быть включен в качестве предварительно скомпилированной библиотеки - PullRequest
0 голосов
/ 04 июля 2019

У меня есть проект Keil STM32 для STM32L0.Мне иногда (чаще, чем я хочу) приходится менять пути включения или глобальные определения.Это вызовет полную перекомпиляцию для всего кода, потому что он должен «проверить» измененное поведение из-за этих изменений.Проблема в том, что я не обязательно изменил соответствующие параметры для HAL, и поэтому не нужно (насколько я понимаю), что эти файлы полностью перекомпилированы.Эта перекомпиляция занимает довольно много времени, потому что я включил все драйверы HAL для моего STM32L0.

Было бы неплохо создать отдельный проект, который компилирует HAL как единую библиотеку и включал ее вмой главный проект?(Это, конечно, будет сделано для каждого микроконтроллера отдельно, так как они имеют разные HAL).

пс.вопрос не обязательно полезен только для этого конкретного примера, но пример дает некоторую область вопроса.

pps.для людей, которые не знакомы с STM32 HAL.Это стандартизированный интерфейс, с которым программа взаимодействует с базовым оборудованием.Он поставляется в файлах .c и .h вместо предварительно скомпилированной формы STD / STL.

update

Вот пример определения, чтонеобходимо управлять в моем примере проекта:

STM32L072xx,USE_B_BOARD,USE_HAL_DRIVER, REGION_EU868,DEBUG,TRACE

Только STM32L072xx и DEBUG полезны для настройки библиотеки HAL и, следовательно, не должнымне не нужно перекомпилировать HAL при изменении TRACE с определенного на неопределенное.Поэтому мне кажется, что HAL может управляться отдельно.


edit

Поскольку голосование при закрытии уже подано: я прочитал не спрашивайте раздел , и мой вопрос призван конструктивно дополнить знания о построении программ STM32 и найти передовой опыт о том, как более эффективно использовать библиотеки HAL.Я не нашел никаких вопросов по SO о построении HAL как статической библиотеки, и поэтому этот вопрос, по крайней мере, квалифицируется как уникальный.Этот вопрос также призван дать исчерпывающий ответ, в котором подробно рассматриваются плюсы и минусы построения HAL в качестве отдельной статической библиотеки.

Ответы [ 2 ]

3 голосов
/ 04 июля 2019

Ответ здесь ... это зависит.Как уже указывалось в комментариях, это зависит от того, как вы планируете управлять своими проектами.Чтобы ответить на ваш вопрос непредвзято:

Вариант № 1 - наличие источников HAL непосредственно в вашем проекте означает перестройку HAL каждый раз, когда что-либо в его (и лежащих в основе) заголовках изменяется, что вы уже заметили.Недостатком этого является более длительное время сборки.Перевернутая сторона - вы уверены, что то, что вы создаете, это то, что вы получаете.

Вариант № 2 - с HAL в качестве предварительно скомпилированной статической библиотеки.Потенциал - короткое время сборки, недостаток - вы больше не можете быть абсолютно уверены, что библиотека HAL, которую вы включили, действительно работает так, как вы этого хотите.В частности, вам нужно каким-то образом убедиться, что все #define точно такие же, как при сборке библиотеки.Это включает определения для всего проекта (DEBUG, STM32L072xx и т. Д.), А также что-либо в конфигурационных файлах HAL (stm32l0xx_hal_conf.h).

Видение того, как вы являетесь пользователем Keil - возможно, это простовопрос включения многоядерной сборки?См. Эту ссылку: http://www.keil.com/support/man/docs/armcc/armcc_chr1359124201769.htm. Библиотека HAL не настолько велика, что время сборки должно вызывать беспокойство, когда дело доходит до перестройки ее исходных файлов.

Если бы я хотел высказать свое мнение и опыт - личноЯ бы не стал этого делать, так как это может привести к снижению надежности или побочным эффектам, которые будет очень трудно диагностировать и только ухудшатся, если вы добавите больше исходных файлов и больше библиотек, подобных этой.Не говоря уже о добавлении большего количества людей для работы над проектом и объяснении им, как им «нужно помнить, чтобы перестраивать библиотеку X при изменении заданного набора файлов заголовков или определений проекта».

Фактически, мыМы столкнулись с той же дилеммой для кодовой базы, над которой я работаю - она ​​охватывает в общей сложности более 10 тыс. исходных и заголовочных файлов, некоторые из которых зависят от конфигурации, а многие являются общими.Он очень модульный, что позволяет нам быстро создавать что-то новое (как аппаратное, так и программное), просто конфигурируя существующий код, в основном через набор заголовочных файлов.Однако, поскольку эта конфигурация выполняется с помощью заголовков, изменение в них обычно означает перестройку большой части проекта.Хотя время сборки иногда раздражает, мы отказались от создания статических библиотек по причинам, указанным выше.Лично для меня лучше расставить приоритеты в надежности, как в «Я знаю, что я строю».

Если бы мне нужно было дать какие-то общие советы, которые помогут избежать перестройки, когда ваш проект становится большим:

  • Избегайте глобальных заголовков, содержащих всю конфигурацию.Обычно заманчиво собрать всю конфигурацию в одном месте, создать красивые комментарии и разделы для каждого программного модуля в одном файле.Так проще управлять (пока этот файл не станет слишком большим), но поскольку этот файл настолько распространен, это означает, что любое изменение, внесенное в него, приведет к полной перестройке.Разделите такие файлы на отдельные заголовки, соответствующие каждому модулю в вашем проекте.

  • Включайте заголовочные файлы только там, где они вам нужны.Иногда я вижу подход, при котором создаются заголовочные файлы, которые только «связывают» другие заголовочные файлы, и такой заголовочный файл позже включается.В этом случае внесение изменений в любой из этих «меньших» заголовков приведет к необходимости перекомпиляции всех исходных файлов, включая файл большего размера.Если такого файла не существует, то нужно будет перекомпилировать только источники, явно включающие этот маленький заголовок.Очевидно, что здесь нужно провести черту - включая слишком «низкоуровневые» заголовки, возможно, и не самая лучшая идея, например, их не следует включать в файлы внутренней библиотеки, которые могут измениться в любое время.

  • Приоритетное включение заголовков в исходных файлах над файлами заголовков.Если у вас есть пара собственных файлов *.c (*.cpp) и *.h - скажем, temp_logger.c/.h, и вам нужен АЦП - тогда, если вам действительно не нужно какое-то определение АЦП в заголовке (что, скорее всего, не будет), затем включите файл заголовка ADC в файл temp_logger.c.В дальнейшем все файлы, использующие функции temp_logger, не нужно будет перекомпилировать в случае повторного построения HAL.

0 голосов
/ 06 июля 2019

Мое мнение - да, встроить HAL в библиотеку. Преимущество более быстрого времени сборки перевешивает риск устаревания библиотеки. После некоторого момента в начале проекта для меня непривычно что-то менять, что могло бы повлиять на HAL. Но более быстрое время сборки окупается много раз.

Я создаю многопроектное рабочее пространство с одним проектом для библиотеки HAL, другим проектом для загрузчика и третьим проектом для приложения. Когда я занимаюсь разработкой, я перестраиваю только проект приложения. Когда я делаю сборку релиза, я выбираю Project-> Batch Build и перестраиваю все три проекта. Таким образом, в сборках выпуска всегда используется весь последний код и настройки сборки.

Кроме того, в диалоговом окне «Параметры для целевого объекта» на вкладке «Вывод» при снятии флажка «Обзор информации» значительно сокращается время сборки.

...