なぜCプログラム原因リンクエラーで構造を使用しません
質問
私は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誤りでしエリアDSEGための内部RAMに29人の連続したバイトを取得できません」私はFilterStructure testStruct;
エラーが消えるという行をコメントアウトします。
このエラーは何を意味するのでしょうか?私はそれを行っていたとき、私は構造を破棄する必要がありますか?
解決
メッセージは、29個の連続するバイトを見つけることができなかったメモリ・マネージャがそれを割り当てるので、ローカル変数testStruct
は、(バイナリのデータセグメントであるべきか、DSEG)RAMに確保することができなかったことを意味する。
これはあなたの構造体は、8バイト長でなければなりませんので、奇妙である..しかし、ところで、それは構造を捨てるとは何の関係もいない、これは、メモリ管理の問題だ..私はとてもよく8051の仕様を知らないが、それはかなり制限されるべきです右?
EDIT:8051のスペックを見て、それはそれだけでRAMの128バイトを持っているようです。あなたはそれが(チップのアドレス/データバスを使用して)ことが可能です場合は、外部RAMチップ上で、それを割り当てるようにしてくださいながら、ローカルとして宣言された変数は、内部RAMに割り当てられているので、これは問題を引き起こす可能性がありますが、私はよマイクロコントローラのこの種は、これらのことを行うために使用すべきではないので、わからない。
他のヒント
あなたはそれのルックスで....メモリが不足してきます。
それはそれは良くなりますかどうかを確認し、グローバル変数としてそれを移動してみます。
ただの推測:8051は、「内蔵RAM」の唯一の128または256バイトです。そんなに...それは、レジスタのスタックおよび一部としての部分を使用することができません。たぶん、あなたの「大」(8バイト!!!)スタック上の構造は、内部メモリ内部であまりにも多くのスタック領域を確保するために、コンパイラを強制します。私は、リンカマップファイルに外観を持つように勧め、多分あなたはメモリパーティションを「再配置」することができます。マッサージは、「連続バイト」と言うので、おそらくそこに十分なスペースが空くはまだですが、それは断片化されます。
さようなら