Библиотека STM32F HAL слишком большая - PullRequest
0 голосов
/ 09 февраля 2019

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

Ответы [ 5 ]

0 голосов
/ 12 февраля 2019

В дополнение ко всем этим замечательным ответам я хотел бы добавить, что 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
0 голосов
/ 09 февраля 2019

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

Сообщение от форумов ST:

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

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

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

Функция драйверов LL:

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

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

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

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

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

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

Link

0 голосов
/ 09 февраля 2019

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

0 голосов
/ 09 февраля 2019

Попробуйте:

  • удалить неиспользуемый код и данные («сборщик мусора»), используя -ffunction-sections и -fdata-sections для компилятора, --gc-sections для компоновщика.
  • useоптимизация времени компоновщика (LTO) с использованием -O2 -flto как для компоновщика, так и для компилятора.
0 голосов
/ 09 февраля 2019

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

...