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