【单片机】[stm8] - 使用库函数时,减少ROM占用的方法

在使用STM单片机的官方库函数编程时,单片机的ROM会额外的占用很多,我现在使用STM8S103时,使用了库函数,8K的ROM,写了几个自己的驱动和应用程序后,内存占用就到了 7800 bytes。但是还有些东西没有写完,需要继续添加。我使用以下两种方法,将其ROM减少到了 5866 bytes。

MCU:STM8S103K3
开发工具:IAR 2.20

注:
1) 查看ROM,RAM使用情况的方法:查看map文件,文件末尾。
2) map文件位置:demo\Debug\List
3) map的产生是需要在编译器中设置:
Project —> Options… —> Linker —> List —> Genarate linker mapfile

具体方法:

  1. 不使用库函数,直接使用寄存器编程。
    但是这样编程会比较麻烦,到不得已的时候在使用。可以参考原有的库函数,一步一步的改写程序。
  2. 就是注释掉库函数中的“assert_param()”函数。
    这个函数作用是检测函数参数的正确性,对程序的功能不会产生实质性的影响,所以这是一种比较好的减少ROM占用的方法。

我使用了第二种方法,下面是ROM使用前后的对照:

1.没有注释掉 “assert_param()” 之前ROM的使用情况:

#if 1
    /* Check the parameters */
    assert_param(IS_ADC1_CONVERSIONMODE_OK(ADC1_ConversionMode));
    assert_param(IS_ADC1_CHANNEL_OK(ADC1_Channel));
    assert_param(IS_ADC1_PRESSEL_OK(ADC1_PrescalerSelection));
    assert_param(IS_ADC1_EXTTRIG_OK(ADC1_ExtTrigger));
    assert_param(IS_FUNCTIONALSTATE_OK(((ADC1_ExtTriggerState))));
    assert_param(IS_ADC1_ALIGN_OK(ADC1_Align));
    assert_param(IS_ADC1_SCHMITTTRIG_OK(ADC1_SchmittTriggerChannel));
    assert_param(IS_FUNCTIONALSTATE_OK(ADC1_SchmittTriggerState));
#endif //

ROM使用:6251 bytes, 下面是map文件的内容

这里写图片描述

2.注释后的ROM使用情况:

#if 0
    /* Check the parameters */
    assert_param(IS_ADC1_CONVERSIONMODE_OK(ADC1_ConversionMode));
    assert_param(IS_ADC1_CHANNEL_OK(ADC1_Channel));
    assert_param(IS_ADC1_PRESSEL_OK(ADC1_PrescalerSelection));
    assert_param(IS_ADC1_EXTTRIG_OK(ADC1_ExtTrigger));
    assert_param(IS_FUNCTIONALSTATE_OK(((ADC1_ExtTriggerState))));
    assert_param(IS_ADC1_ALIGN_OK(ADC1_Align));
    assert_param(IS_ADC1_SCHMITTTRIG_OK(ADC1_SchmittTriggerChannel));
    assert_param(IS_FUNCTIONALSTATE_OK(ADC1_SchmittTriggerState));
#endif //

ROM使用情况:5866 bytes, 下面是map文件的内容
这里写图片描述

pillar peng
2016.4.27 16:37

猜你喜欢

转载自blog.csdn.net/z21109/article/details/51262044
今日推荐