0

我正在为 8051 架构芯片和 SDCC 编译器编写 C 程序。

我有一个名为 FilterStructure 的结构;

我的代码看起来像这样......

#define NAME_SIZE 8

typedef struct {
char Name[NAME_SIZE];
} FilterStructure;

void ReadFilterName(U8 WheelID, U8 Filter, FilterStructure* NameStructure);

int main (void)
{
    FilterStructure testStruct;
    ReadFilterName('A', 3, &testFilter);     
    ...
    ...
    return 0;
}

void ReadFilterName(U8 WheelID, U8 Filter, FilterStructure* NameStructure)
{    
    int StartOfName = 0;
    int i = 0;
    ///... do some stuff...
    for(i = 0; i < 8; i++)
    {
        NameStructure->Name[i] = FLASH_ByteRead(StartOfName + i);
    }
    return;
}

出于某种原因,我收到链接错误“?ASlink-Error-Could not get 29 Continuous bytes in internal RAM for area DSEG”

如果我注释掉表明FilterStructure testStruct;错误消失的行。

这个错误是什么意思?完成后是否需要丢弃结构?

4

3 回答 3

1

你的内存已经用完了....看起来。

尝试将其作为全局变量移出,看看是否会使它变得更好。

于 2010-03-10T20:35:21.697 回答
1

该消息意味着您的局部变量testStruct无法在 RAM(或应该是二进制数据段的 DSEG)中分配,因为您的内存管理器找不到 29 个连续字节来分配它。

这很奇怪,因为您的结构应该是 8 个字节长.. 但顺便说一句,这与丢弃结构无关,这似乎是一个内存管理问题.. 我不太了解 8051 规范,但它应该非常有限,对吧?

编辑:查看 8051 规格,它似乎只有 128 字节的 RAM。这可能会导致问题,因为声明为本地的变量是在内部 RAM 中分配的,而如果可能的话,您应该尝试在外部 RAM 芯片上分配它(使用芯片的地址/数据总线),但我是不确定,因为这种微控制器不应该用来做这些事情。

于 2010-03-10T20:35:40.457 回答
1

只是猜测:8051 只有 128 或 256 字节的“内部 RAM”。没那么多……它可以将一部分用作堆栈,一部分用作寄存器。也许您在堆栈上的“大”(8 字节!!!)结构会迫使编译器在内部存储器中保留过多的堆栈空间。我建议查看链接器映射文件,也许您可​​以“重新排列”内存分区。按摩说“连续字节”,所以也许还有足够的空间可用,但它是碎片化的。

再见

于 2010-03-10T20:50:59.797 回答