У меня есть проект, в котором я пытаюсь создать прошивку для микроконтроллера и пытаюсь лучше контролировать используемые флаги оптимизации. Я бы хотел вместо использования флага -O указывать разные флаги оптимизации по отдельности. К сожалению, похоже, что с флагом -O происходит некое волшебство c, которое я не могу воспроизвести с отдельными флагами оптимизации, и я не понимаю, почему.
Вот что я пытаюсь, а что не работает :
Я знаю, что могу скомпилировать проект с -O1. Поэтому я использовал флаги -Q и --help для вывода флагов, которые активны, когда я активирую флаг -O1. Я использую эту информацию для указания различных флагов вручную в процессе сборки, и компиляция работает нормально, но на этапе компоновки происходит сбой, потому что раздел .bss больше не помещается в мою оперативную память (у меня доступно только 384 кБайт).
Когда я увеличиваю размер ОЗУ в своем скрипте компоновщика, связывание работает нормально, но конец секции .bss размещается на 416 кБайт, а двоичное изображение на 75% больше, чем при непосредственном использовании -O1.
Когда я сравниваю флаги и параметры, о которых сообщает g cc, нет никакой разницы между двумя сборками, но тот, у которого нет -O1, все еще намного больше.
Согласно документации G CC ( G CC Вручную ) флаг -O активирует только заданные c флаги оптимизации, поэтому должна быть возможность сделать это и вручную (или нет?)
Здесь мои команды g cc:
G CC вызов с одиночными флагами оптимизации
gcc -std=c99 -msoft-float -fno-inline -fdata-sections -ffunction-sections -Wall -Wextra\
-faggressive-loop-optimizations -fauto-inc-dec -fbranch-count-reg -fcombine-stack-adjustments\
-fcompare-elim -fcprop-registers -fdce -fdefer-pop -fdelayed-branch -fdelete-null-pointer-checks\
-fdse -fearly-inlining -ffast-math -fforward-propagate -ffp-contract=fast -ffp-int-builtin-inexact\
-ffunction-cse -fgcse-lm -fguess-branch-probability -fhandle-exceptions -fif-conversion -fif-conversion2\
-finline-atomics -finline-functions-called-once -fipa-profile -fipa-pure-const -fipa-reference\
-fira-algorithm=CB -fira-hoist-pressure -fira-share-save-slots -fira-share-spill-slots -fivopts\
-fjump-tables -flifetime-dse -flifetime-dse=2 -fmath-errno -fmove-loop-invariants -fomit-frame-pointer\
-fpeephole -fplt -fprefetch-loop-arrays -fprintf-return-value -frename-registers -freorder-blocks
-frtti -fsched-critical-path-heuristic -fsched-dep-count-heuristic -fsched-group-heuristic\
-fsched-interblock -fsched-last-insn-heuristic -fsched-rank-heuristic -fsched-spec -fsched-spec-insn-heuristic\
-fsched-stalled-insns-dep -fschedule-fusion -fshort-enums -fshrink-wrap -fshrink-wrap-separate\
-fsigned-zeros -fsplit-ivs-in-unroller -fsplit-wide-types -fssa-backprop -fssa-phiopt -fstack-reuse=all\
-fstdarg-opt -fstrict-volatile-bitfields -fno-threadsafe-statics -ftrapping-math -ftree-bit-ccp\
-ftree-builtin-call-dce -ftree-ccp -ftree-ch -ftree-coalesce-vars -ftree-copy-prop -ftree-cselim\
-ftree-dce -ftree-dominator-opts -ftree-dse -ftree-forwprop -ftree-fre -ftree-loop-if-convert -ftree-loop-im\
-ftree-loop-ivcanon -ftree-loop-optimize -ftree-parallelize-loops=1 -ftree-phiprop -ftree-pta\
-ftree-reassoc -ftree-scev-cprop -ftree-sink -ftree-slsr -ftree-sra -ftree-ter -fvar-tracking -fvar-tracking-assignments\
-fweb -fmerge-constants -fno-associative-math -fno-cx-limited-range -fno-exceptions -fno-finite-math-only\
-fno-reciprocal-math -fno-unsafe-math-optimizations -fexcess-precision=standard -qbsp=leon2 -DCPU_FREQ=CPU_FREQ_125MHz\
-fno-builtin-strtok -c -o timer.o timer.c
G CC с -O1
gcc -O1 -std=c99 -msoft-float -qbsp=leon2 -DCPU_FREQ=CPU_FREQ_125MHz -fno-builtin-strtok -c -o timer.o timer.c
При необходимости я мог бы также предоставить вывод g cc, чтобы увидеть, какие флаги активны в любом случае. единственное различие, которое я обнаружил, заключалось в том, что -fexcess-precision установлен на «default» с -O1. Я испробовал обе возможности (быструю и стандартную), но это не имеет никакого значения.
Кто-нибудь знает, что magi c дополнительно активируется опция -O, которую я пропустил?
BR Thomas