Библиотека 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
как для компоновщика, так и для компилятора.
Если вы готовы пойти на компромисс в отношении портативности и простоты использования, вы можете использовать драйверы низкого уровня (LL), предоставляемые ST. Как дополнительная выгода ваша производительность может также увеличиться.
Пост с форумов ST:
Драйверы Low Layer (LL) разработаны, чтобы предложить быстрый легкий ориентированный на экспертов уровень, который ближе к аппаратному обеспечению, чем HAL. В отличие от HAL, LL API не предоставляются для периферийных устройств, где оптимизированный доступ не является ключевой функцией, или для тех, которые требуют тяжелой конфигурации программного обеспечения и / или сложного стека верхнего уровня (такого как USB).
Драйверы HAL и LL дополняют друг друга и охватывают широкий спектр требований приложений:
- HAL предлагает высокоуровневые и функционально-ориентированные API с высоким уровнем переносимости. Они скрывают MCU и периферийную сложность для конечного пользователя.
- LL предлагает низкоуровневые API на уровне регистров с лучшей оптимизацией, но меньшей мобильностью. Они требуют глубокого знания спецификаций MCU и периферийных устройств
Особенность драйверов LL:
Набор функций для инициализации основных функций периферийных устройств в соответствии с параметрами, указанными в структурах данных
Набор функций, используемых для заполнения структур данных инициализации значениями сброса каждого поля
Функции для выполнения периферийной деинициализации (периферийные регистры возвращаются к значениям по умолчанию)
Набор встроенных функций для прямого и атомарного доступа к реестру
Полная независимость от HAL, поскольку драйверы LL могут использоваться как в автономном режиме (без драйверов HAL), так и в смешанном режиме (с драйверами HAL)
Драйверы нижнего уровня предоставляют аппаратные услуги на основе доступных функций периферийных устройств STM32. Эти сервисы точно отражают аппаратные возможности и обеспечивают однократные операции, которые должны вызываться в соответствии с моделью программирования, описанной в справочном руководстве по линиям микроконтроллера. В результате службы LL не осуществляют никакой обработки и не требуют каких-либо дополнительных ресурсов памяти для сохранения своих состояний, счетчиков или указателей данных: все операции выполняются путем изменения содержимого соответствующих периферийных регистров.
Есть только один способ - прекратить использование библиотеки HAL и сделать это на уровне регистров. Если размер HAL важен, вы используете маленький микро, и это единственный способ сделать это.