MpLab链接错误:无法分配部分(C30编译器)

时间:2013-03-13 17:13:28

标签: c compiler-errors linker-errors pic mplab

我已将两段代码放在一起(最初在This Question Here中描述)。

我现在刚从MpLab(Microchip MPLAB C30)中遇到此错误

 Link Error: Could not allocate section .nbss, size = 20004 bytes, attributes = bss near 

最奇怪的是,我在编译器手册(Microchip出版物DS51284F)中查找了该消息,甚至是该消息的子字符串,但一无所获。

我甚至找了单词分配,发现它只有三到四次,从不带错误信息。

在将这两段代码组合在一起之前,我有一个定义为0x8000的段,我用于内存的“大块”,我们将用它来移动来自 Thing-X 到 Thing-Y

我将我在0x8000定义的数据区缩小到1个单独的字节,我仍然收到此错误。

我没有在Microchip的编译器手册DS51284F中看到此消息。有没有人以前解决过这个问题?

链接器是否有不同的手册?

有没有办法可以获取内存映射来查看我的内存区域?

1 个答案:

答案 0 :(得分:3)

错误表明在未初始化的变量(近bss或短nbss)的近数据空间中没有足够的内存。

您可以使用这些建议来减少数据内存使用量: 1)使用编译器优化,-O3或-Os。

2)在Compiler build options下选择Large Data Model: - 默认-msmall-data - 大(> 8KB) - 纵向数据 - 小(<= 8KB)-msmall-数据 默认数据模型很小。

3)在远程空间中声明一些变量。这将释放近ram空间的空间。

4)减少函数参数的大小或数量,例如,而不是通过值传递结构,而是将指针传递给相同的参数。

5)将某些局部变量的存储类更改为静态或使其成为全局变量。

6)尽可能重用局部变量和参数。

7)使用不大于它们所需要的类型,例如,for循环超过100个对象的计数器变量只需要与char一样大。

8)将一些初始化的数据/数组放入代码空间。 -mconst-在码