为什么在C程序中使用结构会导致链接错误

时间:2010-03-10 20:32:07

标签: linker 8051 sdcc

我正在为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-无法在区域DSEG的内部RAM中获得29个连续字节”

如果我注释掉FilterStructure testStruct;的行,则错误就会消失。

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

3 个答案:

答案 0 :(得分:1)

你的记忆已经耗尽了......看起来很棒。

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

答案 1 :(得分:1)

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

这很奇怪,因为你的结构应该是8个字节长..但顺便说一下它与丢弃结构没什么关系,这似乎是一个内存管理问题..我不太了解8051规格,但它应该是非常有限的正确?

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

答案 2 :(得分:1)

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

再见