avr-gcc重新编译的ledramp示例出现分段错误



我在Ubuntu上安装了simavr。我安装了以下软件包:avrdude binutils avr gcc avr avr libc gdb avr libelf dev libglut3 dev gtkwave构建至关重要。

我试着运行ledramp示例(simarv文件夹中的一个示例),效果很好。但是,当我将board_ledramp文件夹复制到board_ledramp2文件夹时board_ledramp2文件夹,我重新编译并执行它,我得到了分段错误。

我的命令是:

    make clean
    make
   ./obj-i686-linux-gnu/ledramp.elf

make命令后的控制台日志为:

 AVR-CC atmega48_ledramp.c
  1869      32      11    1912     778 atmega48_ledramp.axf
CC ../parts/button.c
CC ledramp.c
LD obj-i686-linux-gnu/ledramp.elf
ledramp done

错误消息为:

Loaded 1850 .text
Loaded 32 .data
firmware atmega48_ledramp.axf f=8000000 mmcu=atmega48
Starting atmega48 - flashend 0fff ramend 02ff e2end 00ff
atmega48 init
Segmentation fault

我尝试使用"file"命令来比较原始的elf文件和我的elf文件,输出相同:

./obj-i686-linux-gnu/ledramp.elf: ELF 32-bit LSB executable, Intel
80386, version 1 (SYSV), dynamically linked (uses shared libs), for
GNU/Linux 2.6.15, not stripped

有人能解释出了什么问题吗?

谢谢!

从这行的外观来看:

/obj-i686-linux-gnu/ledramp.elf:elf 32位LSB可执行文件,Intel

看起来您无意中编译了在主机PC上运行的程序,而不是AVR。

@XTL在这里有一个很好的提示,使用gdb运行ledram.elf,看看它在哪里崩溃。尽管我试图让这些例子做好"剪切粘贴"调整的准备,但我并没有尝试所有的东西。

另一种选择是"使V=1",看看编译原始led渐变和新led渐变时有什么不同。。。最初的一个是由"顶级makefile"构建的,它可能会有细微的不同(比如,可能使用gcc与clang?)。

一个有用的部分是获得在执行make V=1时得到的输出,并告诉我们您使用的编译器版本。。。

最新更新