STM32 简单两步给ST的库瘦身

2019-12-13 18:29发布

本帖最后由 Etual 于 2012-6-29 10:08 编辑

使用了ST的库,感觉体积有点大,点亮个 LED 使用了  2.5K flash 了。

一个简单的瘦身办法,也就是,将不使用的函数剔除,不连接进去最终的烧写文件,有用的函数连接进去,没用的函数不要。

只需要2步

设置项目属性
1,在 Linker 页的 Misc contrrols 那里添加  --remove
作用是将不使用的输入段(input sections)移除。

--remove 这个参数是Keil 默认已经开启的,所以加不加都一样 , Etual  2012-6-29 修改

2,单加上面那个是没有效果的,因为一个文件作为一个输入段的话就没效果了。
所以下面的操作是将每个函数作为一个输入段,这就可以优化了。方法是
在 C/C++ 页勾选 “One ELF Section per Function”  就可以了
优化我一般选 -02

重新编译,原来 2.5K 的程序,现在变成 1.2K 了 ......

今天摸索出来的办法,不知道有没有人发过
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
95条回答
wye11083
1楼-- · 2019-12-17 21:55
dadatou 发表于 2012-6-28 15:42
我有一个项目,优先必须是0,优化我一般选 -02  程序会崩溃。

你的程序应该是内存问题。仔细检查每一个内存申请和释放。
冰雪王爵
2楼-- · 2019-12-17 22:52
本帖最后由 kebaojun305 于 2012-9-16 11:17 编辑

还可以再优化   库里占空间的是参数检测  把参数检测的宏定义屏蔽  就基本上和你使用寄存器操作一样的大小了。  同样适用  STM8S的库  ,比如如下的一个库函数中的参数检测
  1. /* Check the parameters */
  2.   assert_param(IS_ADC_ALL_PERIPH(ADCx));
  3.   assert_param(IS_ADC_MODE(ADC_InitStruct->ADC_Mode));
  4.   assert_param(IS_FUNCTIONAL_STATE(ADC_InitStruct->ADC_ScanConvMode));
  5.   assert_param(IS_FUNCTIONAL_STATE(ADC_InitStruct->ADC_ContinuousConvMode));
  6.   assert_param(IS_ADC_EXT_TRIG(ADC_InitStruct->ADC_ExternalTrigConv));   
  7.   assert_param(IS_ADC_DATA_ALIGN(ADC_InitStruct->ADC_DataAlign));
  8.   assert_param(IS_ADC_REGULAR_LENGTH(ADC_InitStruct->ADC_NbrOfChannel));
复制代码在库的配置头文件(XX_conf.h)中可以屏蔽到这个检测(第3行  实际上注释已经写的很清楚了。
  1. /* Uncomment the line below to expanse the "assert_param" macro in the
  2.    Standard Peripheral Library drivers code */
  3. /* #define USE_FULL_ASSERT    1 */

  4. /* Exported macro ------------------------------------------------------------*/
  5. #ifdef  USE_FULL_ASSERT

  6. /**
  7.   * @brief  The assert_param macro is used for function's parameters check.
  8.   * @param  expr: If expr is false, it calls assert_failed function
  9.   *   which reports the name of the source file and the source
  10.   *   line number of the call that failed.
  11.   *   If expr is true, it returns no value.
  12.   * @retval None
  13.   */
  14.   #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
  15. /* Exported functions ------------------------------------------------------- */
  16.   void assert_failed(uint8_t* file, uint32_t line);
  17. #else
  18.   #define assert_param(expr) ((void)0)
  19. #endif /* USE_FULL_ASSERT */
复制代码
kebaojun305
3楼-- · 2019-12-17 23:59
 精彩回答 2  元偷偷看……
iamfiavarst
4楼-- · 2019-12-18 04:24
直接使用寄存器,肯定更节省……
enterpriseZ
5楼-- · 2019-12-18 06:11
学习了,确实有用!
laixiaoshuai90
6楼-- · 2019-12-18 09:47
确实少了1半啊!

一周热门 更多>