在使用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