在使用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
具体方法:
- 不使用库函数,直接使用寄存器编程。
但是这样编程会比较麻烦,到不得已的时候在使用。可以参考原有的库函数,一步一步的改写程序。 - 就是注释掉库函数中的“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