题
我写一个C程序用于8051架构芯片和SDCC编译器。
我有一个名为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;
错误消失。
这个错误是什么意思?我是否需要丢弃的结构时,我用它做什么?
解决方案
在消息意味着本地变量testStruct
不能在RAM(或DSEG应该是你的二进制数据段)被分配,因为你的内存管理器找不到连续的29个字节分配它。
这是奇怪的,因为你的结构应该是8个字节长..但BTW它无关丢弃的结构,这似乎是一个内存管理问题。我不知道8051种规格这么好,但它应该是相当有限正确?
编辑:看着8051种规格似乎它只是有128个字节的RAM。这可能会导致问题,因为变量声明为局部的,在内部RAM分配,而你应该尝试,如果有可能(使用该芯片的地址/数据总线),其分配给外部RAM芯片上,但我不知道,因为这种微控制器不应该被用来做这些事情。
其他提示
您已经通过它的外观耗尽内存...。
尝试移动它作为一个全局变量,看看是否这使得它更好。
只是一个猜测:8051仅具有128或256个字节的“内部RAM”的。与其说......它可以使用它的一部分,堆栈和一部分寄存器。也许你的“大”(8个字节!)堆栈上的结构迫使编译器保留在内存里面太多堆栈空间。我建议看看到连接映射文件,也许你可以“重新安排”的内存分区。按摩写着“连续字节”,所以也许仍然有足够的空间速效,但它是零散的。
再见
不隶属于 StackOverflow