0

私は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;エラーがなくなるという行をコメントアウトすると。

このエラーはどういう意味ですか?使い終わったら構造を破棄する必要がありますか?

4

3 に答える 3

1

あなたはメモリを使い果たしました....それの外見によって。

グローバル変数として移動してみて、それが改善されるかどうかを確認してください。

于 2010-03-10T20:35:21.697 に答える
1

このメッセージはtestStruct、メモリマネージャが29個の連続したバイトを見つけられなかったため、ローカル変数をRAM(またはバイナリのDATA SEGMENTであるDSEG)に割り当てることができなかったことを意味します。

構造体の長さは8バイトである必要があるため、これは奇妙です。しかし、構造体の破棄とは関係ありません。これはメモリ管理の問題のようです。8051の仕様はよくわかりませんが、かなり制限されているはずです。

編集:8051の仕様を見ると、128バイトのRAMしか搭載されていないようです。これは、ローカルとして宣言された変数が内部RAMに割り当てられるため、問題を引き起こす可能性がありますが、可能であれば(チップのアドレス/データバスを使用して)外部RAMチップに割り当てる必要がありますが、私はこの種のマイクロコントローラーはこれらのことを行うために使用されるべきではないので、わかりません。

于 2010-03-10T20:35:40.457 に答える
1

推測ですが、8051には128バイトまたは256バイトの「内部RAM」しかありません。それほど多くはありません...その一部をスタックとして使用し、一部をレジスターとして使用できます。おそらく、スタック上の「大きな」(8バイト!!!)構造により、コンパイラは内部メモリ内にあまりにも多くのスタックスペースを予約する必要があります。リンカマップファイルを調べることをお勧めします。メモリパーティションを「再配置」できるかもしれません。マッサージは「連続バイト」と言っているので、おそらくまだ十分なスペースがありますが、断片化されています。

さよなら

于 2010-03-10T20:50:59.797 に答える