c编译器,重叠内存错误

时间:2015-03-25 13:44:34

标签: c memory-management

以下是我正在使用的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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

当你添加这一行时,它会导致编译代码的大小对于你加载代码的内存区域来说太大了。

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

要解决此问题,您需要:

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

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

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

这些地址是在链接描述文件中配置的(这可能是硬编码到makefile中,也可能是某个地方的实际文件)。希望硬件设备附带文档,说明它有多少内存以及允许加载代码的位置。