2012-10-11 2 views
1

cortex-M4 장치 용 베어 메탈 C++ 응용 프로그램을 만들려고합니다. 내 툴체인은 ARM-GCC입니다Cortex-M4 용 불필요한 STDLIBC++ 루틴 방지

코드 크기가 사용 가능한 플래시 크기의 30 % 인 300kb만큼 증가한 것을 확인했습니다. TEXT, DATA 및 BSS 영역이 부풀어 오르는 표준 라이브러리의 전체 내용이 있습니다.

줄일 수 있습니까? 하여 Main.cpp 생성자 와 (주) 간단한 클래스를 포함 - Blinky.c 잠시 루프 에 포트 핀을 전환 할 C 루틴을 포함 - :

애플리케이션은 함께 오래된 블 링 프로그램 - 프로그램 로딩을 수행하고 main()에 제어를내는 장치 시작 파일

c 파일은 g ++를 사용하여 컴파일되며 cpp는 g ++를 사용하여 컴파일됩니다. 링커는 g ++를 통해 호출되어 stdlibC++에서 자동으로 링크됩니다 (stdlibC++에서 필요한 객체 fies 만 링크 될 것이라는 가정하에).

심지어 g ++에 컴파일 옵션으로 -fno-rtti 및 -fno-exceptions가 있지만 비용 절감 효과가 있습니다.

그건 그렇고, 생성 된 이진 작업 파일입니다.

는하여 Main.cpp

#include <iostream> 

using namespace std; 

extern "C" void Toggle_Pin(uint8_t Speed); 

void *__dso_handle = (void *)NULL; 
void __cxa_atexit(void (*Arg)(void *), void *Arg2, void *Arg3){} 
void __cxa_guard_acquire(void){} 
void __cxa_guard_release(void){} 
void __aeabi_atexit(void (*Arg)(void *), void *Arg2, void *Arg3){} 

class Computer 
{ 
    public: 
uint32_t aa; 
uint32_t bb; 

Computer(); 
}; 

Computer::Computer() 
    { 
    aa=0; 
    bb=0; 
    for(uint8_t i=0;i < 10; i++) 
    { 
    Toggle_Pin((uint8_t)100); 
    } 
    } 

Computer a; 

int main(void) 
    { 
    a.aa = 10; 
    Toggle_Pin(); 
    } 

그리고 이들에 g ++ 제공 내 컴파일 옵션입니다이다. 제공

-O0 -ffunction-sections -Wall -fno-rtti -fno-exceptions -mfloat-abi=softfp -Wa,-adhlns="[email protected]" -c -fmessage-length=0 -mfpu=fpv4-sp-d16 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d) [email protected]" -mcpu=cortex-m4 -mthumb -g3 -gdwarf-2 -o "[email protected]" "$<" 

링커 옵션은 g ++합니다 : 당신이 그것을 필요가 없습니다

#include <iostream> 
using namespace std; 

-T LinkerScript.ld" -nostartfiles -L"Path to libraries" -Wl,-Map,"Project.map" -mcpu=cortex-m4 -mthumb -g3 -gdwarf-2 -o "Project.elf" "@makefile.rsp" $(USER_OBJS) $(LIBS) 
+2

왜 -O0을 사용하나요? 왜 안돼? -g3을 사용하여 바이너리에 디버그 정보를 추가하는 이유는 무엇입니까? 나중에 그들을 벗겨 줄까요? 왜 "#include 네임 스페이스 std를 사용하여 추가합니까?" 물건? – auselen

+0

-O3 일 수 있지만 최적화를 선호하지 않습니다. BTW, 최적화 수준을 -O3으로 변경했는데 축소가 거의 보이지 않았습니다. 디버그 정보는 최종 바이너리에서 제거됩니다. 그것은 ELF에 있지만 16 진수/빈에는 없습니다. – Raj

+0

oops ... iostream을 제거했으며 코드 크기가 이제는 관리 할 수 ​​있습니다. NULL 정의를 위해 iostream이 필요했습니다. 예상 되나요? 즉 stdlibC++에서 소스를 무조건적으로 가져 오는 iostream을 포함합니까? – Raj

답변

2

제거 부분입니다. 나는 그것이 여분의 전역 객체/변수를 추가하고 몇몇 정의를 이진으로 남겨 둘지도 모른다는 것을 짐작한다.

또한 크기 -Os

-Os

최적화를 사용합니다. -O는 일반적으로 코드 크기를 늘리지 않는 모든 -O2 최적화를 가능하게합니다. 또한 코드 크기를 줄이기 위해 추가 최적화를 수행합니다.

+2

'iostream'은'cin','cout'과'cerr'을 추가합니다. 이것은 부엌 싱크대를 제외한 모든 것을 가져옵니다. –