当前位置: 首页 > 知识库问答 >
问题:

嵌入式GCC优化魔法

百里泓
2023-03-14

我有一个项目,我尝试为微控制器构建固件,并尝试更好地控制使用的优化标志。我想要,而不是使用-O

以下是我尝试的和不起作用的:

我知道我可以用-O1编译项目。所以我使用了-Q--help标志来输出当我激活-O1标志时激活的标志。我使用这些信息在我的构建过程中手动指定不同的标志,编译工作正常,但是在链接阶段失败了,因为. bss部分不再适合我的内存了(我只有384kByte可用)。

当我在链接器脚本中增加RAM大小时,链接可以正常工作,但最终会失败。bss部分被放置在416kbyte,二值图像比直接使用-O1时大75%。

当我比较gcc报告的标志和参数时,这两个版本之间没有区别,但是没有-O1的版本仍然要大得多。

根据GCC文档(GCC手册),-O标志是否仅激活特定的优化标志,因此也可以手动执行(或不执行?)

以下是我的gcc命令:

具有单一优化标志的GCC调用

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

GCC与-O1

gcc -O1 -std=c99 -msoft-float -qbsp=leon2 -DCPU_FREQ=CPU_FREQ_125MHz -fno-builtin-strtok -c -o timer.o timer.c

如果需要,我也可以提供gcc的输出,看看在这两种情况下哪些标志是活动的。我发现的唯一区别是,-foverce-精度被设置为-O1的默认值。我尝试了两种可能性(快速和标准),但这没有任何区别。

有人知道-O选项另外激活了我忽略的什么魔法吗?


共有1个答案

常波
2023-03-14

根据GCC手册

Most optimizations are only enabled if an -O level is set on the command line.
Otherwise they are disabled, even if individual optimization flags are specified.

因此,仅指定优化标志是不够的。例如,在这里,您可以看到,只有同时启用了-O-fweb时,才会启用某些分析:

class pass_web : public rtl_opt_pass
{
  ...
  virtual bool gate (function *) { return (optimize > 0 && flag_web); }

即使指定-O1并选择性地从更高的优化级别启用优化,也不会可靠地工作,因为某些传递显式地依赖于-O值。例如,在这里您可以看到CSE优化的部分在-O1处被禁用:

else if (tem == 1 || optimize > 1)
  cse_cfg_altered |= cleanup_cfg (0);
 类似资料:
  • 存在与循环有关的问题。为什么?也许是虫子? 我使用的是最新的4.8.0,经过测试的x64、x86以及其他版本。都是同样的行为。

  • 我试图找出关键的优化选项。首先,用 -Q-v列出了启用的标志(-faggressive loop optimizations-falign labels-fasynchronous unwind tables等)。然后,如果将这些标志直接提供给gcc而不是-O3,那么如果禁用了优化,则生成的程序的性能将降低。 gcc文件指出 并不是所有的优化都由一个标志直接控制 会是这个问题还是我错过了其他的?

  • 我正在使用GCC4.4.2构建一些大型项目。因为我想构建它以供发布,所以我使用了GCC优化标志,但不幸的是,它在某种程度上弄乱了我的代码,最终的二进制文件没有按照预期工作,当使用标志(或没有优化)构建时,一切都很好。我之前的项目也有类似的问题,当时是标志在优化级别上造成了问题,我通过搜索本文档中提到的所有标志,就优化级别而言,设法发现它是由该特定标志引起的: http://gcc.gnu.org/

  • 我正在尝试创建一个小的PDF文件,嵌入一个优化的PNG图像显示为3页PDF的页眉和页脚(相同的图像必须在PDF中显示6倍) 我优化的PNG映像只有2.3KB。看起来很锋利。 我还尝试制作一个测试页面,并使用wkhtml2pdf,但它做了同样的事情。添加低质量标志没有任何区别。 PDF规范建议支持PNG? 从略读PDF规范,它看起来像是支持PNG图像。

  • 我有时会在pom中看到以下声明。xml。。。 如您所见,sping-boo-starter-web被声明为tomcat-embed-jasper。 是不是sping-boo-starter-web已经有一个嵌入式tomcat了?为什么一些开发人员仍然声明tomcat-embed-jasper以及boot-starter-web?还是有什么原因?

  • 问题内容: 我有一个脚本,它通过自定义ORM生成数以万计的插入Postgres数据库中。可以想象,它非常慢。这用于开发目的,以便创建伪数据。我可以在Postgres级别上进行简单的优化以使其更快吗?它是唯一按顺序运行的脚本,不需要线程安全。 也许我可以关闭所有锁定,安全检查,触发器等?只是寻找一种快速而肮脏的解决方案,可以大大加快这一过程。 谢谢。 问题答案: 如果您在生产环境中不需要这种功能,建