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)
왜 -O0을 사용하나요? 왜 안돼? -g3을 사용하여 바이너리에 디버그 정보를 추가하는 이유는 무엇입니까? 나중에 그들을 벗겨 줄까요? 왜 "#include 네임 스페이스 std를 사용하여 추가합니까?" 물건? –
auselen
-O3 일 수 있지만 최적화를 선호하지 않습니다. BTW, 최적화 수준을 -O3으로 변경했는데 축소가 거의 보이지 않았습니다. 디버그 정보는 최종 바이너리에서 제거됩니다. 그것은 ELF에 있지만 16 진수/빈에는 없습니다. – Raj
oops ... iostream을 제거했으며 코드 크기가 이제는 관리 할 수 있습니다. NULL 정의를 위해 iostream이 필요했습니다. 예상 되나요? 즉 stdlibC++에서 소스를 무조건적으로 가져 오는 iostream을 포함합니까? – Raj