Linker 为什么在C程序中使用结构会导致链接错误
我正在为8051体系结构芯片和SDCC编译器编写一个C程序 我有一个叫做FilterStructure的结构 我的代码看起来像这样Linker 为什么在C程序中使用结构会导致链接错误,linker,8051,sdcc,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) { Filte
#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;
}
#定义名称#大小8
类型定义结构{
字符名称[名称大小];
}过滤结构;
无效的ReadFilterName(U8 WheelID、U8 Filter、FilterStructure*名称结构);
内部主(空)
{
过滤器结构测试结构;
ReadFilterName('A',3,&testFilter);
...
...
返回0;
}
void ReadFilterName(U8 WheelID、U8过滤器、过滤器结构*名称结构)
{
int StartOfName=0;
int i=0;
///…做些事情。。。
对于(i=0;i<8;i++)
{
名称结构->名称[i]=FLASH_ByteRead(StartOfName+i);
}
返回;
}
由于某种原因,我得到了一个链接错误“?ASlink error无法在区域DSEG的内部RAM中获得29个连续字节”
如果我注释掉写着FilterStructure testStruct的行代码>错误消失
这个错误意味着什么?当我处理完该结构后,是否需要丢弃它?从外观上看,您的内存已用完
尝试将其作为全局变量移出,看看这是否会使它变得更好。从外观上看,您的内存已用完
尝试将其作为全局变量移出,看看这是否会使其更好。该消息意味着无法在RAM中分配局部变量testStruct
,因为内存管理器无法找到29个连续字节来分配它
这很奇怪,因为您的结构应该是8字节长。。但是顺便说一句,这与丢弃结构无关,这似乎是一个内存管理问题。。我不太清楚8051的规格,但它应该是非常有限的,对吗
编辑:看看8051规格,它似乎只有128字节的RAM。这可能会导致问题,因为声明为本地变量的变量在内部RAM中分配,而如果可能的话,您应该尝试在外部RAM芯片上分配它(使用芯片的地址/数据总线),但是我不确定,因为这种微控制器不应该用来做这些事情。这个消息意味着你的局部变量testStruct
不能在RAM(或者应该是二进制数据段的DSEG)中分配,因为你的内存管理器找不到29个连续字节来分配它
这很奇怪,因为您的结构应该是8字节长。。但是顺便说一句,这与丢弃结构无关,这似乎是一个内存管理问题。。我不太清楚8051的规格,但它应该是非常有限的,对吗
编辑:看看8051规格,它似乎只有128字节的RAM。这可能会导致问题,因为声明为本地变量的变量在内部RAM中分配,而如果可能的话,您应该尝试在外部RAM芯片上分配它(使用芯片的地址/数据总线),但我不确定,因为这种微控制器不应该用来做这些事情。只是猜测:8051只有128或256字节的“内部RAM”。没有那么多。。。它可以将它的一部分用作堆栈,另一部分用作寄存器。可能堆栈上的“大”(8字节!!!)结构迫使编译器在内部内存中保留太多堆栈空间。我建议查看链接器映射文件,也许您可以“重新安排”内存分区。消息称为“连续字节”,因此可能仍然有足够的可用空间,但它是碎片化的
再见猜测一下:8051只有128或256字节的“内部RAM”。没有那么多。。。它可以将它的一部分用作堆栈,另一部分用作寄存器。可能堆栈上的“大”(8字节!!!)结构迫使编译器在内部内存中保留太多堆栈空间。我建议查看链接器映射文件,也许您可以“重新安排”内存分区。消息称为“连续字节”,因此可能仍然有足够的可用空间,但它是碎片化的
再见我根据你的其他问题重新标记了这个,我根据你的其他问题重新标记了这个,我将我的结构声明更改为扩展数据过滤器结构测试结构;它似乎已经解决了这个问题,我将我的结构声明更改为扩展数据过滤器结构testStruct;它似乎已经解决了这个问题。