我正在为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;
的行,则错误就会消失。
这个错误是什么意思?完成后我是否需要丢弃结构?
答案 0 :(得分:1)
你的记忆已经耗尽了......看起来很棒。
尝试将其作为全局变量移出,看看是否能让它变得更好。
答案 1 :(得分:1)
该消息表示您的本地变量testStruct
无法分配在RAM(或应该是二进制数据的SEGMENT的DSEG)中,因为您的内存管理器找不到29个连续字节来分配它。
这很奇怪,因为你的结构应该是8个字节长..但顺便说一下它与丢弃结构没什么关系,这似乎是一个内存管理问题..我不太了解8051规格,但它应该是非常有限的正确?
编辑:看看8051规格它似乎只有128字节的RAM。这可能会导致问题,因为声明为本地的变量在内部RAM中分配,而如果可能(使用芯片的地址/数据总线),您应该尝试将其分配到外部RAM芯片上,但我是不确定,因为这种微控制器不应该被用来做这些事情。答案 2 :(得分:1)
只是猜测:8051只有128或256字节的“内部RAM”。没有那么多......它可以使用它的一部分作为堆栈和部分寄存器。也许堆栈上的“大”(8字节!!!)结构会强制编译器在内部存储器中保留过多的堆栈空间。我建议看看链接器映射文件,也许你可以“重新排列”内存分区。按摩说“连续字节”,所以也许还有足够的可用空间,但它是碎片化的。
再见