1. 程式人生 > >【微控制器】[stm8] - 使用庫函式時,減少ROM佔用的方法

【微控制器】[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