以下是我正在使用的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
您能告诉我这些错误的原因以及如何解决这些错误。
答案 0 :(得分:2)
这与您的代码不正确无关。
这些是链接器错误(它甚至告诉你ld.exe
是程序抱怨)关于输出部分重叠。这个可能意味着你的空间不足,但也可能意味着你的项目正在使用的链接器指令文件存在一些问题。
答案 1 :(得分:0)
当你添加这一行时,它会导致编译代码的大小对于你加载代码的内存区域来说太大了。
您可以从链接器错误消息的第一行看到.text
(代码)已加载到0x500
,并且.data
(非零静态变量)已加载在0xa00
。但是,.text部分太长,太大而无法放在0x500
和0xa00
之间的空格中。
要解决此问题,您需要:
.text
要执行第一个,您可以使用-Os
或类似的编译器选项来编译最小代码大小;或者手动将代码重写为更小。
对于第二个,您确实需要了解要加载代码的硬件。代码是0x500
且数据是0xa00
是硬件要求吗?如果没有,那么您可以将代码和/或数据加载到不同的地址。
这些地址是在链接描述文件中配置的(这可能是硬编码到makefile中,也可能是某个地方的实际文件)。希望硬件设备附带文档,说明它有多少内存以及允许加载代码的位置。