STM32F HAL库太大

STM32F HAL库太大,stm32,stm32-hal,Stm32,Stm32 Hal,我的微控制器项目的闪存用完了。我如何减少HAL库的大小,或者以其他方式使它在我的项目中所占的比例降低?只有一种方法——停止使用HAL库,在寄存器级别执行它。如果HAL的大小很重要,请使用small micro,这是唯一的方法。是否尝试将编译器标志设置为-Os?尝试: 使用编译器的-ffunction节和-fdata节,链接器的-gc节消除未使用的代码和数据(“垃圾收集”) 使用链接器和编译器的-O2-flto进行链接器时间优化(LTO) 如果您准备在便携性和易用性方面妥协,您可以使用ST提供的

我的微控制器项目的闪存用完了。我如何减少HAL库的大小,或者以其他方式使它在我的项目中所占的比例降低?

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

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

尝试:

  • 使用编译器的
    -ffunction节
    -fdata节
    ,链接器的
    -gc节
    消除未使用的代码和数据(“垃圾收集”)
  • 使用链接器和编译器的
    -O2-flto
    进行链接器时间优化(LTO)

如果您准备在便携性和易用性方面妥协,您可以使用ST提供的低级别(LL)驱动程序。作为一个额外的好处,您的性能也可能会提高

来自ST论坛的帖子:

低层(LL)驱动程序旨在提供一个快速、轻量级、面向专家的层,该层比HAL更接近硬件。与HAL相反,LL API不适用于优化访问不是关键功能的外围设备,或需要大量软件配置和/或复杂上层堆栈(如USB)的外围设备

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

  • HAL提供高级和面向特性的API,具有很高的可移植性级别。它们向最终用户隐藏了MCU和外围设备的复杂性
  • LL在寄存器级别提供低级API,优化效果更好,但可移植性较差。他们需要对MCU和外围设备规格有深入的了解
  • LL驱动程序功能:

    • 一组函数,用于根据需要初始化外围设备的主要功能 在数据结构中指定的参数

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

    • 执行外围设备反初始化(外围设备)的功能 寄存器恢复为其默认值)

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

    • 完全独立于HAL,因为LL驱动程序可以在 独立模式(无HAL驱动程序)或混合模式(有HAL驱动程序) (司机)

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


    除了所有这些出色的响应之外,我想补充一点,
    HAL
    可以在
    stm32f3xx\u HAL\u 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
    

    从多维数据集中limport项目时的标准选项。大多数IDEs.PS上的标准选项我会非常小心地建议新手用户LTO@P__J__1.我既不使用HAL也不使用llapi。我看到的一些项目没有启用垃圾收集,我得出的结论是默认情况下没有启用垃圾收集。2.在我看来,如果某个程序(非深奥但深奥的程序不是新手编写的)在启用LTO后崩溃,那么它的格式就不正确,即使没有LTO,它也会在一到二十次更改后崩溃。什么垃圾收集。它只是没有链接死代码和数据。@P_uj_u_uu来自gcc文档:值得注意的是,虽然您应该验证,但是集成在STM32CubeIDE中的MX配置工具创建样板项目会自动注释出相关行。