【單片機】[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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章