c - MpLab 链接错误 : Could Not Allocate Section (C30 Compiler)

标签 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)中查找该消息,甚至是该消息的子字符串,但一无所获。

我什至只查找了单词 allocate,只找到了三四次,而且从未出现错误消息。

在将这两段代码放在一起之前,我在 0x8000 处定义了一个段,用于存储我们将用于从 Thing-X 交给 Thing-Y

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

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

链接器有不同的手册吗?

有没有一种方法可以获得内存映射以查看我的内存区域在哪里?

最佳答案

该错误表示 near 数据空间中没有足够的内存用于未初始化的变量(near bss 或简称 nbss)。

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

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

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

4) 减少函数参数的大小或数量,例如,与其按值传递结构,不如传递指向相同结构的指针。

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

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

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

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

关于c - MpLab 链接错误 : Could Not Allocate Section (C30 Compiler),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15391996/

相关文章:

javascript - 将 C 程序代码转换为 Javascript,产生不同的结果?

c - Ruby-FFI 在包装以大写字母开头的函数时生成常量?

java - 不同 Java 库中的重复类导致编译错误

c - 头文件中声明的外部变量的链接器出错

c++ - 带有 VS 2017 的 QT 5.9 - 使用 QWebEngineView 获取未解析的符号

将十六进制数据从 C 转换为值

c - 无符号字符的 v8 Node 缓冲区

java - 1. java ')'预期错误+ 2.不含 'else'的 'if'

C# 变量和常量在溢出期间的行为不同。

c - 尝试一起编译多个 CUDA 文件时出现链接错误 LNK2005