c编译器,重叠内存错误

c compiler, overlap memory error

下面是我使用的部分 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 是程序在抱怨)。这 可能 意味着你只是 运行 出 space,但也可能意味着你的项目正在使用的链接器指令文件有一些问题。

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

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

要解决此问题,您需要:

  • 让你的代码更小
  • 增加 space 可用于 .text
  • 的数量

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

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

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