リンカー スクリプト ファイルで、2 つのシンボルを定義しました。
define symbol _region_RAM_start__ = 0xC0000000;
define symbol _region_RAM_end__ = 0xC00fffff;
そして、以下に示すようにそれらをエクスポートしました
export symbol _region_RAM_start__;
export symbol _region_RAM_end__;
アプリケーションコードから、これらのシンボルにアクセスしようとします
extern const unsigned int _region_RAM_start__;
extern const unsigned int _region_RAM_end__;
....
int GetRAMSize()
{
int size = 0;
unsigned int address_1 = _region_RAM_start__;
unsigned int address_2 = _region_RAM_end__;
size = address_2 - address_1 + 1U;
return size;
}
ここで、戻り値が 0x00100000 になると予想していましたが、返されるのは 0 だけです。そのため、デバッガーに目を向けると、値がそれぞれ 0xC0000000 と 0xC00fffff であることに気付き_region_RAM_start__
まし_region_RAM_end__
たがaddress_1
、address_2
値は 0 です。
コンパイラの最適化は「なし」に設定されています。これはしばらくの間私を悩ませてきました。ここで私が見逃している非常に明白なものはありますか(「そもそもこれを行うべきではない」以外)?
解決策 答えてくれた nm に感謝
unsigned int address_1 = (unsigned int) (&_region_RAM_start__);
それ以外の場合address_1
、address_2
両方ともガベージ値を含みます (つまり、アドレス 0xC0000000 と 0xC00fffff でそれぞれ利用可能な値ですが、このコードの観点からはガベージです)。