Библиотека STM32F HAL слишком большая

Я только что исчерпал вспышку на моем проекте микроконтроллера. Как я могу уменьшить размер библиотеки HAL или иным образом сделать так, чтобы она занимала меньше огромного процента моего проекта?

5 ответов

В дополнение ко всем этим замечательным ответам я хотел бы добавить, что HAL можно настроить в stm32f3xx_hal_conf.h отключить неиспользуемые модули.

/**
  * @brief This is the list of modules to be used in the HAL driver 
  */
#define HAL_MODULE_ENABLED
#define HAL_ADC_MODULE_ENABLED
#define HAL_CAN_MODULE_ENABLED
/* #define HAL_CAN_LEGACY_MODULE_ENABLED */
#define HAL_CEC_MODULE_ENABLED
#define HAL_COMP_MODULE_ENABLED
#define HAL_CORTEX_MODULE_ENABLED
#define HAL_CRC_MODULE_ENABLED
#define HAL_DAC_MODULE_ENABLED
#define HAL_DMA_MODULE_ENABLED
#define HAL_FLASH_MODULE_ENABLED
#define HAL_GPIO_MODULE_ENABLED
#define HAL_HRTIM_MODULE_ENABLED
#define HAL_I2C_MODULE_ENABLED
#define HAL_I2S_MODULE_ENABLED
#define HAL_IRDA_MODULE_ENABLED
#define HAL_IWDG_MODULE_ENABLED
#define HAL_OPAMP_MODULE_ENABLED
#define HAL_PCD_MODULE_ENABLED
#define HAL_PWR_MODULE_ENABLED
#define HAL_RCC_MODULE_ENABLED
#define HAL_RTC_MODULE_ENABLED
#define HAL_SDADC_MODULE_ENABLED
#define HAL_SMARTCARD_MODULE_ENABLED
#define HAL_SMBUS_MODULE_ENABLED
#define HAL_SPI_MODULE_ENABLED
#define HAL_TIM_MODULE_ENABLED
#define HAL_TSC_MODULE_ENABLED
#define HAL_UART_MODULE_ENABLED
#define HAL_USART_MODULE_ENABLED
#define HAL_WWDG_MODULE_ENABLED

Пробовать:

  • устранить неиспользуемый код и данные ("сбор мусора"), используя -ffunction-sections а также -fdata-sections для компилятора, --gc-sections для компоновщика.
  • использовать оптимизацию по времени компоновщика (LTO), используя -O2 -flto как для компоновщика, так и для компилятора.

Вы пытались установить флаг компилятора в -Os?

Если вы готовы пойти на компромисс в отношении портативности и простоты использования, вы можете использовать драйверы низкого уровня (LL), предоставляемые ST. Как дополнительная выгода ваша производительность может также увеличиться.

Пост с форумов ST:

Драйверы Low Layer (LL) разработаны, чтобы предложить быстрый легкий ориентированный на экспертов уровень, который ближе к аппаратному обеспечению, чем HAL. В отличие от HAL, LL API не предоставляются для периферийных устройств, где оптимизированный доступ не является ключевой функцией, или для тех, которые требуют тяжелой конфигурации программного обеспечения и / или сложного стека верхнего уровня (такого как USB).

Драйверы HAL и LL дополняют друг друга и охватывают широкий спектр требований приложений:

  1. HAL предлагает высокоуровневые и функционально-ориентированные API с высоким уровнем переносимости. Они скрывают MCU и периферийную сложность для конечного пользователя.
  2. LL предлагает низкоуровневые API на уровне регистров с лучшей оптимизацией, но меньшей мобильностью. Они требуют глубокого знания спецификаций MCU и периферийных устройств

Особенность драйверов LL:

  • Набор функций для инициализации основных функций периферийных устройств в соответствии с параметрами, указанными в структурах данных

  • Набор функций, используемых для заполнения структур данных инициализации значениями сброса каждого поля

  • Функции для выполнения периферийной деинициализации (периферийные регистры возвращаются к значениям по умолчанию)

  • Набор встроенных функций для прямого и атомарного доступа к реестру

  • Полная независимость от HAL, поскольку драйверы LL могут использоваться как в автономном режиме (без драйверов HAL), так и в смешанном режиме (с драйверами HAL)

Драйверы нижнего уровня предоставляют аппаратные услуги на основе доступных функций периферийных устройств STM32. Эти сервисы точно отражают аппаратные возможности и обеспечивают однократные операции, которые должны вызываться в соответствии с моделью программирования, описанной в справочном руководстве по линиям микроконтроллера. В результате службы LL не осуществляют никакой обработки и не требуют каких-либо дополнительных ресурсов памяти для сохранения своих состояний, счетчиков или указателей данных: все операции выполняются путем изменения содержимого соответствующих периферийных регистров.

Ссылка на сайт

Есть только один способ - прекратить использование библиотеки HAL и сделать это на уровне регистров. Если размер HAL важен, вы используете маленький микро, и это единственный способ сделать это.

Другие вопросы по тегам