Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linker 为什么在C程序中使用结构会导致链接错误_Linker_8051_Sdcc - Fatal编程技术网

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

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

我正在为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;
}
#定义名称#大小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;它似乎已经解决了这个问题。