用于调用函数的代码存储区(C ARM-GCC)

时间:2016-11-08 01:34:07

标签: c gcc memory

我为32位ARM内核微控制器项目编写了一个C程序。该项目有一个LCD,所以我写了一个函数,用于将文本加载到LCD的内部RAM进行显示,功能是:

/*-------------------------------------------
* 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编译器

谢谢。

1 个答案:

答案 0 :(得分:0)

您正在调用函数,因此您正在创建堆栈帧。你有R0~R15,所以16个寄存器。如果你处于拇指模式,每个16位,那么你会得到32个字节加上返回地址和状态,所以我想这会给你40字节。我认为没有办法减少这一点。你可以内联这个功能。 40字节真的不是ARM上的任何东西。