Я пытаюсь создать голое приложение на языке c ++ для устройства cortex-M4. Мой инструментарий ARM-GCC
Я заметил, что размер кода увеличился на 300 КБ, что составляет 30% от доступного размера флэш-памяти. Существует целая куча вещей из стандартных библиотек, которые связаны между собой в областях TEXT, DATA и BSS.
Можно ли это уменьшить?
Приложение — почтенная мигающая программа с:
— Blinky.c, содержащий подпрограмму C для переключения порта порта в цикле while
— Main.cpp, содержащий main () и простой класс с конструктором
— Файл запуска устройства, который выполняет загрузку программы и передает управление main ()
Файл c скомпилирован с использованием gcc, а cpp скомпилирован с использованием g ++. Линкер вызывается через g ++ для автоматической ссылки в stdlibc ++ (при условии, что в stdlibc ++ будут связаны только необходимые объекты).
У меня даже есть параметры -fno-rtti и -fno-exception в качестве параметров компиляции для g ++, но экономия — жалкая вещь.
Кстати, сгенерированный двоичный файл работает.
Это 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) $@" -mcpu=cortex-m4 -mthumb -g3 -gdwarf-2 -o "$@" "$<"
Опции компоновщика, предоставляемые g ++:
-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)
Удалить часть с
#include <iostream>
using namespace std;
тебе это не нужно Я предполагаю, что он добавляет дополнительные глобальные объекты / переменные и может оставить некоторые определения в двоичном виде.
Также используйте -Операционные системы
-Операционные системы
Оптимизировать по размеру. -Os включает все оптимизации -O2, которые обычно не увеличивают размер кода. Он также выполняет дальнейшую оптимизацию, предназначенную для уменьшения размера кода.
Других решений пока нет …