2016-11-08 2 views
0

32 비트 ARM 코어 마이크로 컨트롤러 프로젝트 용 C 프로그램을 작성했습니다. 이 프로젝트는 내가 표시를위한 LCD의 내부 RAM에 적재 텍스트 함수를 작성했습니다 그래서 LCD를 가지고, 기능은 다음과 같습니다함수 호출에 사용 된 코드 메모리 (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에는 어느 정도의 RAM이 있습니까? –

+0

글쎄, 16KB RAM을 가지고 있지만 RAM이 아닌 프로그램 메모리에 대해 이야기하고 있습니다. 그것은 256KB의 메모리를 가지고 있지만 거의 다 사용하고 있습니다. – eepty

+0

'-Os' 모드로 컴파일을 시도 했습니까? –

답변

0

스택 프레임을 만들 수 있도록 함수를 호출하고 있습니다. 당신은 R0 ~ R15를 가지고 있으므로 16 개의 레지스터가 있습니다. 당신이 엄지 모드에 있다면, 각각 16 비트로, 32 바이트에 반환 주소와 상태를 제공합니다. 그래서 나는 당신에게 40 바이트를 줄 것이라고 말할 것입니다. 나는 이것을 줄이는 방법을 찾지 못합니다. 함수를 인라인 할 수 있습니다. ARM에서는 40 바이트가 실제로 아무 것도 아닙니다.

+0

내 ARM은 256KB 코드 메모리를 가지고 있지만,이 프로젝트는 많은 기능을 가지고 있으며, 사용자 인터페이스에 대해 여러 가지 화면이 있습니다. 모두 256KB를 모두 사용했습니다. 이 기능은 수백 번 호출 될 수 있습니다. 이전에 메모리를 다 써 버렸을 때,이 함수에서 매개 변수의 수를 줄이면 총 코드 크기가 약 20KB 줄어들 수 있다는 것을 알게되었습니다. RAM에 대해 이야기하지 않고 프로그램 메모리에 대해 이야기하고 있음을 상기하십시오. – eepty

+0

@eepty 스택에 모든 레지스터를 "PUSH"해야하기 때문에 프로그램 코드 메모리와 동일한 메모리를 사용합니다. 어셈블리를 위험에 빠뜨리는 경우 코드를 인라인 할 수 있으며 레지스터의 하위 집합을 사용하고 있다는 것을 알고 있으면 몇 가지 변수 만 푸시 할 수 있습니다. 나머지는 쓰레기라는 것을 알고 있기 때문에 반환 주소와 3 개의 레지스터 만 스택에 밀어 넣었지만 위험한 경로입니다. 또한 코드 관리가 어려워집니다. –

관련 문제