下面是我正在使用的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部分太长,太大,无法放入0x500
和0xa00
之间的空间。
要解决此问题,您需要:
- 缩小代码
- 增加
.text
的可用空间
要做第一个,您可以使用-Os
或类似的编译器选项来编译最小代码大小;或者手动将代码重写得更小。
对于第二个,你真的需要了解你正在加载代码的硬件。代码在0x500
,数据在0xa00
,这是硬件要求吗?如果没有,那么您可以将代码和/或数据加载到不同的地址。
这些地址在链接器脚本中配置(可能硬编码到makefile中,也可能是某个实际文件)。希望硬件设备附带的文档能解释它有多少内存,以及您可以将代码加载到哪里。