c编译器,重叠内存错误



下面是我正在使用的C代码的一部分:

pushbutton_ISR()
{
    int press;
    int key_pressed;
    press = *(KEYS_ptr + 3);                // read the pushbutton Edge Det Register interrupt register
    *(KEYS_ptr + 3) = 0;                    // Clear the Edge Det registers. 
    if (press & 0x1) {                      // KEY1
        key_pressed = KEY1;
        //sum = sum + *NEW_NUMBER; 
        }
    else if (press & 0x2)   {               // KEY2
        key_pressed = KEY2;
        *GREEN_LEDS = *NEW_NUMBER;
         sum = sum + *NEW_NUMBER;
        *RED_LEDS = sum;
        }
    else                                    // i.e. (press & 0x8), which is KEY3
        sum = *(NEW_NUMBER);                // Read the SW slider switch values; store in pattern
    return;
}

编译器编译得很好,代码似乎运行得很好(在Altera板上)。但是,当我将第一个if语句更改为:时

if (press & 0x1) {                      // KEY1
    //key_pressed = KEY1;
    sum = sum + *NEW_NUMBER; 
}

编译器给出以下错误消息:

.../nios2-elf/bin/ld.exe: section .data loaded at [00000a00,00000e0f] overlaps section .text loaded at [00000500,00000a0f]
.../nios2-elf/bin/ld.exe: section .ctors loaded at [00000a10,00000a13] overlaps section .data loaded at [00000a00,00000e0f]
.../nios2-elf/bin/ld.exe: Z:/Projects/Altera/3215_W15_LabB/Part2/from_handout.elf: section .data vma 0xa00 overlaps previous sections
.../nios2-elf/bin/ld.exe: Z:/Projects/Altera/3215_W15_LabB/Part2/from_handout.elf: section .ctors vma 0xa10 overlaps previous sections
.../nios2-elf/bin/ld.exe: Z:/Projects/Altera/3215_W15_LabB/Part2/from_handout.elf: section .rodata vma 0xa14 overlaps previous sections
.../nios2-elf/bin/ld.exe: Z:/Projects/Altera/3215_W15_LabB/Part2/from_handout.elf: section .sdata vma 0xe10 overlaps previous sections
.../nios2-elf/bin/ld.exe: Z:/Projects/Altera/3215_W15_LabB/Part2/from_handout.elf: section .sbss vma 0xe18 overlaps previous sections

你能告诉我这些错误的原因以及如何解决吗。

这与您的代码不正确无关。

这些是关于输出部分重叠的链接器错误(它甚至告诉ld.exe是抱怨的程序)。这可能意味着空间不足,但也可能意味着项目使用的链接器指令文件存在一些问题。

当您添加此行时,会导致编译代码的大小对于您正在加载代码的内存区域来说太大。

从链接器错误消息的第一行可以看到,.text(代码)在0x500处加载,.data(非零静态变量)在0xa00处加载。但是,.text部分太长,太大,无法放入0x5000xa00之间的空间。

要解决此问题,您需要:

  • 缩小代码
  • 增加.text的可用空间

要做第一个,您可以使用-Os或类似的编译器选项来编译最小代码大小;或者手动将代码重写得更小。

对于第二个,你真的需要了解你正在加载代码的硬件。代码在0x500,数据在0xa00,这是硬件要求吗?如果没有,那么您可以将代码和/或数据加载到不同的地址。

这些地址在链接器脚本中配置(可能硬编码到makefile中,也可能是某个实际文件)。希望硬件设备附带的文档能解释它有多少内存,以及您可以将代码加载到哪里。

最新更新