2016-11-08 63 views
0

我已經爲32位ARM內核微控制器項目編寫了一個C程序。該項目有一個LCD,所以我寫了加載文本的功能,以顯示在LCD的內部RAM,功能:用於調用函數的代碼存儲器(C ARM-GCC)

/*------------------------------------------- 
* Name  : LCD_Show_String 
* Description : Load a line of text to LCD's RAM 
* Argument(s) : row - load to which row in LCD. 
*    *str - The text 
*    *font_table - the font table to be used 
*    *font_descriptor - information of the font table 
*    align - Align ALIGN_LEFT, ALIGN_CENTER or ALIGN_RIGHT 
*    print_now - 0: Do not print the text on LCD now 
*       1: Print the text on LCD immediately 
*    mode - PIXEL_ON, PIXEL_OFF or PIXEL_XOR (method to print each pixel) 
* 
* Return value: Total width of the string printed. 
* -----------------------------------------------*/ 
UINT16_T LCD_Show_String(UINT8_T row, const UINT8_T *str, const UINT8_T *font_table, \ 
       const UINT16_T *font_descriptor, LCD_Align_t align, 
       UINT8_T print_now, LcdPixelMode mode) 

當我調用該函數:

LCD_Show_String(7, "TEST", small_font_bitmap, 
         small_font_des, ALIGN_CENTER, 0, PIXEL_ON); 

我發現每個當我調用這個函數時,它使用了40個字節的代碼存儲器。另外如果我增加了函數中的參數個數,所需的內存會更多。例如最初我在這個函數中有13個參數,每次我調用這個函數時,它使用了大約100個字節。

我想問問這是正常的嗎?爲什麼它用盡了這麼多的內存?我可以減少使用的內存嗎?

編譯器是ARM​​ GCC編譯器

謝謝。

+0

你的MCU有多少內存? –

+0

它有16KB的RAM,但我說的是程序存儲器,而不是RAM。它有256KB的內存,但我幾乎用完了它。 – eepty

+0

是否嘗試在'-Os'模式下編譯? –

回答

0

你正在調用一個函數,所以你正在創建一個堆棧幀。你有R0〜R15,所以有16個寄存器。如果你處於拇指模式,每個16位,這給你32個字節加上返回地址和狀態,所以我會說這會給你40字節。我看不到減少這種情況的方法。你可以內聯該功能。 40字節實際上不是ARM上的任何內容。

+0

我的ARM有256KB的代碼存儲器,但是由於這個項目有很多功能,並且它爲用戶界面提供了很多不同的屏幕,所以我用完了所有的256KB。這個功能可能被稱爲幾百次。以前,當我使用內存時,我發現如果我減少此函數中的參數數量,它可以將總代碼大小減少大約20KB。請注意,我不是在談論內存,我正在談論程序內存。 – eepty

+0

@eepty它在內存中的佔用程序代碼內存相同,因爲您需要將每個寄存器「壓入」堆棧。如果你想冒險彙編,你可以只是內聯代碼,或者如果你知道你使用的是寄存器的一個子集,你可以只推動幾個變量。因爲我知道其餘的都是垃圾,所以我只推送了返回地址和3個寄存器,但這是一條冒險的道路。它也使你的代碼難以管理。 –