2

我的微控制器项目的闪存用完了。如何减少 HAL 库的大小或以其他方式减少我项目的大部分内容?

4

5 回答 5

4

尝试:

  • -ffunction-sections使用和-fdata-sections用于编译器,--gc-sections用于链接器,消除未使用的代码和数据(“垃圾收集”) 。
  • -O2 -flto对链接器和编译器都使用链接器时优化 (LTO) 。
于 2019-02-09T14:59:28.880 回答
3

除了所有这些出色的响应之外,我想补充一点,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
于 2019-02-11T21:55:16.853 回答
3

如果您准备好在便携性和易用性上妥协,您可以使用 ST 提供的 Low Level(LL) 驱动程序。作为一个额外的好处,你的表现也可能会提高。

ST论坛的帖子:

低层 (LL) 驱动程序旨在提供比 HAL 更接近硬件的快速轻量级面向专家的层。与 HAL 不同,LL API 不提供给优化访问不是关键特性的外设,或者需要大量软件配置和/或复杂上层堆栈(如 USB)的外设。

HAL 和 LL 驱动程序是互补的,涵盖了广泛的应用要求:

  1. HAL 提供高级和面向功能的 API,具有高可移植性。它们向最终用户隐藏了 MCU 和外围设备的复杂性。
  2. LL 提供寄存器级别的低级 API,具有更好的优化但可移植性较差。他们需要深入了解 MCU 和外设规范

LL 驱动程序具有:

  • 根据数据结构中指定的参数初始化外设主要特征的一组函数

  • 一组函数,用于用每个字段的重置值填充初始化数据结构

  • 执行外设去初始化的函数(外设寄存器恢复到默认值)

  • 一组用于直接和原子寄存器访问的内联函数

  • 完全独立于 HAL,因为 LL 驱动程序可以在独立模式(没有 HAL 驱动程序)或混合模式(有 HAL 驱动程序)下使用

低层驱动程序根据 STM32 外设的可用特性提供硬件服务。这些服务准确地反映了硬件功能,并提供了必须按照微控制器系列参考手册中描述的编程模型调用的一次性操作。因此,LL 服务不执行任何处理,也不需要任何额外的内存资源来保存它们的状态、计数器或数据指针:所有操作都是通过更改相关的外围寄存器内容来执行的。

关联

于 2019-02-09T17:12:39.487 回答
3

只有一种方法 - 停止使用 HAL 库并在寄存器级别进行。如果 HAL 的大小很重要,则使用 small micro,这是唯一的方法。

于 2019-02-09T11:29:28.323 回答
2

您是否尝试将编译器标志设置为-Os

于 2019-02-09T14:46:30.737 回答