我写一个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个字节!)堆栈上的结构迫使编译器保留在内存里面太多堆栈空间。我建议看看到连接映射文件,也许你可以“重新安排”的内存分区。按摩写着“连续字节”,所以也许仍然有足够的空间速效,但它是零散的。

再见

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top