Contact me: hankecnc@gmail.com

gcc 9.1.0 草图太大 #663

推推 grbl 3年前 (2023-01-22) 197次浏览

打开
ntd 打开了这个问题 2019 年 5 月 14 日 · 16条评论
打开

gcc 9.1.0 草图太大#663

ntd 打开了这个问题 2019 年 5 月 14 日 · 16条评论

注释

gcc 9.1.0 草图太大 #663

在 ArchLinux current 上编译定制的 GRBL 1.1f 时,我得到一个sketch too big错误(使用了 110% 的内存)。为了安全起见,我尝试构建一个普通的 grbl-master 图像,这是错误消息:

...
Sketch uses 35492 bytes (110%) of program storage space. Maximum is 32256 bytes.
Global variables use 1633 bytes (79%) of dynamic memory, leaving 415 bytes for local variables. Maximum is 2048 bytes.
Sketch too big; see http://www.arduino.cc/en/Guide/Troubleshooting#size for tips on reducing it.
Error compiling for board Arduino/Genuino Uno.

降级avr-gcc-9.1.0解决avr-gcc-8.3.0问题。建立相同的草图给出:

...
Sketch uses 29786 bytes (92%) of program storage space. Maximum is 32256 bytes.
Global variables use 1633 bytes (79%) of dynamic memory, leaving 415 bytes for local variables. Maximum is 2048 bytes.
Low memory available, stability problems may occur.
gcc 9.1.0 草图太大 #663

同样的问题在这里…

gcc 9.1.0 草图太大 #663

我在 GCC bugzilla 上报告了这个问题:https ://gcc.gnu.org/bugzilla/show_bug.cgi?id=91189

gcc 9.1.0 草图太大 #663

同样的问题在这里。固定降级到 avr-gcc-8.3.0

gcc 9.1.0 草图太大 #663

同样的问题,有更新吗?

gcc 9.1.0 草图太大 #663
齐格蒙特 评论了 2019 年 9 月 16 日  

gcc9同样的问题

gcc 9.1.0 草图太大 #663

找到了一个简单的解决方法。Arduino IDE 1.8.10 不存在这个问题,但是,在撰写本文时,它目前在 pacman 上不可用。最简单的解决方法是卸载系统上的所有 Arduino 软件,转到适用于 Linux 的 Arduino 下载页面,下载 1.8.10,解压缩,然后运行 ​​install.sh 脚本。

gcc 9.1.0 草图太大 #663
wmarkow 评论了 2019 年 12 月 6 日  

@cramsted,您的解决方法会有所帮助,因为 Arduino 及其 IDE在版本7中最多支持avr-gcc(请查看此文件http://downloads.arduino.cc/packages/package_index.json以供参考)。但是我知道有人想要用最新版本的gcc编译它。

这里qmk/qmk_firmware#6719他们有同样的问题。

gcc 9.1.0 草图太大 #663
wmarkow 评论了 2019 年 12 月 6 日  

我能够重现这个问题@ntd描述的。我在Eclipse 中使用 Sloeber为Arduino UNO板(Atmega 328P 处理器)进行编译(但稍加修改以使用 avr-gcc-8.3.0 和 avr-gcc-9.1.0 )。事实上,文本大小从29790字节增加到35496字节。

请查看随附的grbl_disassembly.zip文件它包含:

  • 使用 gcc 8.3.0 构建的 grbl_gcc_8.3.0_build.log
  • 使用 gcc 9.1.0 构建的 grbl_gcc_9.1.0_build.log
  • grbl_gcc-8.3.0_text_section_info.txt 只有文本部分信息(每个函数有多大),通过执​​行 avr-objdump.exe -x grbl.elf |生成 grep -iE “.text”
  • grbl_gcc-9.1.0_text_section_info.txt 只有一个文本部分信息(每个函数有多大)。您可以使用例如Kdiff3软件将其与 grbl_gcc-8.3.0_text_section_info.txt 进行比较。你会看到gcc-9.1.0的一些功能比gcc-8.3.0更大
  • grbl_gcc_8.3.0_disassembly.txt 代码的完整反汇编。它包含汇编程序 + C 代码混合。通过执行avr-objdump.exe -S grbl.elf 生成
  • grbl_gcc-9.1.0-disassembly.txt 代码的完整反汇编。它包含汇编程序 + C 代码混合。

您可以轻松地比较grbl_gcc_8.3.0_disassembly.txtgrbl_gcc-9.1.0-disassembly.txt以查看其编译方式。
例如printFloat看起来很有趣。
使用gcc-8.3.0我们有(转换为longuint32_t?):

uint32_t a = (long)n;
     7ce:	0e 94 de 36 	call	0x6dbc	; 0x6dbc <__fixsfsi>

但是对于gcc-9.1.0我们有:

uint32_t a = (long)n;
     932:	6e 87       	std	Y+14, r22	; 0x0e
     934:	7f 87       	std	Y+15, r23	; 0x0f
     936:	88 8b       	std	Y+16, r24	; 0x10
     938:	99 8b       	std	Y+17, r25	; 0x11
     93a:	6e 85       	ldd	r22, Y+14	; 0x0e
     93c:	7f 85       	ldd	r23, Y+15	; 0x0f
     93e:	88 89       	ldd	r24, Y+16	; 0x10
     940:	99 89       	ldd	r25, Y+17	; 0x11
     942:	0e 94 eb 41 	call	0x83d6	; 0x83d6 <__fixsfsi>
     946:	6e 87       	std	Y+14, r22	; 0x0e
     948:	7f 87       	std	Y+15, r23	; 0x0f
     94a:	88 8b       	std	Y+16, r24	; 0x10
     94c:	99 8b       	std	Y+17, r25	; 0x11

使用gcc-9.1.0编译时看起来很复杂。
总的来说,我注意到gcc-9.1.0使用了很多上面的操作(它在一些寄存器上使用lddstd以及Y寄存器)特别是围绕和与数学操作相关的调用操作(_mulsf3,__floatsisf,__gesf2? ).

来自GCC项目的人可能对此了解更多。也许这与通话约定有关?也许有一些开关/配置参数需要传递给gcc-9.1.0编译器,但在gcc-8.3.0中不需要?

gcc 9.1.0 草图太大 #663
wmarkow 评论了 2019 年 12 月 8 日  

我之前的评论中的四个stdldd指令,在调用指令之前似乎“什么都不做”。根据AVR Instruction Set Manual,首先将r22 – r25寄存器存储在内存中的某个位置,然后再恢复回来。中间没有其他指令,所以看起来这八个操作是不必要的;他们使最终图像更大。

gcc 9.1.0 草图太大 #663
作者
新台币 评论了 2019 年 12 月 8 日  

@wmarkow您应该尝试将您的评论提交给gcc 错误:我认为 GRBL 人员对此无能为力。

gcc 9.1.0 草图太大 #663

@ntd我去做。目前我正在等待我的 gcc bugzilla 帐户(它需要由管理员手动创建)。

gcc 9.1.0 草图太大 #663

我刚刚发现与生成开销操作相关的类似问题已报告为https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90706

gcc 9.1.0 草图太大 #663
哈维 评论了 2020 年 2 月 24 日  

我在旧的 ubuntu 上做了这个十六进制。希望它能帮助别人。#441
grbl-v1.1h.20190825.hex.txt

arduino-cli core install arduino:avr
arduino-cli upload -v -i grbl.hex  -b arduino:avr:nano -p /dev/ttyUSB3
#arduino-cli upload -v -i grbl.hex  -b arduino:avr:nano:cpu=atmega328old -p /dev/ttyUSB3
gcc 9.1.0 草图太大 #663

我在使用 GCC AVR 9.2.0 时遇到过同样的问题

我已经能够通过使用toolbox创建 Fedora 30 容器的命令在 Fedora 31 上编译它。如果您想执行相同的操作(在您的 grbl 目录中执行),请使用以下命令:

toolbox create --release f30
toolbox enter --release f30
sudo dnf install avr-gcc-7.4.0-5.fc30 avr-libc make
make -j

在容器中用GCC 7.4.0编译的结果:

avr-size --format=berkeley build/main.elf
   text	   data	    bss	    dec	    hex	filename
  29586	      0	   1633	  31219	   79f3	build/main.el
gcc 9.1.0 草图太大 #663

我发现的另一个解决方法是使用使用 gcc 5.4.0 的 ubuntu 20.04:

docker run --user ${UID}:${GID} --rm -it -v ${PWD}:/mount rubberduck/avr make grbl.hex
gcc 9.1.0 草图太大 #663

avr-gcc 错误编译

avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -l /usr/lib/libisl.so.21 main.c -o main.out
/usr/share/avr/lib/gcc/avr/8.3.0/cc1: error while loading shared libraries: libisl.so.21: cannot open shared object file: No such file or directory
make: *** [Makefile:9: main.out] Error 1

id 没有找到 libisl.so

喜欢 (0)