2010-03-10 59 views
0

我正在为8051体系结构芯片和SDCC编译器编写一个C程序。为什么在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 - 错误 - 无法获取区域DSEG在内部RAM中29个连续字节”

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

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

+0

我已经在你的其他问题,光在这里 – 2010-03-10 20:37:37

回答

1

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

这很奇怪,因为你的结构应该是8个字节长..但顺便说一句,这与丢弃结构无关,这似乎是一个内存管理问题..我不知道8051规格如此之好,但它应该是相当有限的权利?

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

+0

重新标记这个我改变了我的结构的声明 外部数据FilterStructure testStruct; 它似乎已经解决了这个问题。 – PICyourBrain 2010-03-11 15:45:36

1

你已经用完了内存....看起来很像它。

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

1

只是猜测:8051只有128或256字节的“内部RAM”。并非如此......它可以将其中的一部分用作堆栈,并将其作为寄存器的一部分。也许你在堆栈上的“大”(8字节!!!)结构迫使编译器在内部存储器中保留太多的堆栈空间。我建议查看链接器映射文件,也许你可以“重新排列”内存分区。按摩说“连续的字节”,所以也许仍然有足够的空间可用,但它是分散的。

再见

相关问题