質問: null || ((u32)p < (u32)sram_base_addr || (u32)p > ((u32)sram_base_addr + (u32)0x800000))) { printf("malloc error\n\r"); task_reset(); } os_exit_critical(); return (void *)p; } 現在のメモリセクションマップはこのようになっています。 address section 0x00000400 , presetprg,pintprg 0x00000800 , p,c,c$dsec,c$bsec,d 0x00600000 , bheapmem 0x00670000 , bjurnel 0x00ff4000 , bprogerase 0x00ff4000 , b,r 0x00ffbe00 , s これを、次のように変えたいと思っています。 address section 0x00000400 , presetprg,pintprg 0x00000800 , p,c,c$dsec,c$bsec,d 0x00600000 , bheapmem 0x0066f000 , r 0x00670000 , bjurnel 0x00ff4000 , bprogerase 0x00ff4000 , b 0x00ffbe00 , s 実際にこのようなメモリセクションに変更することは可能なのか、また、実際に変更した場合にbheapmem領域に問題が起きないかとか他に調べなければならないことなど、ご教示頂きますよう、どうぞよろしくお願い致します。
回答: no.2です。 プログラムやヘッダ中に、bjurnelの先頭アドレスを定義している箇所はありませんか? それらを変更せず、bjurnelのセクション番地だけを変更するのが暴走の原因(r領域を破壊する)なのでは? >r(初期化セクション)は外部メモリ空間のメモリとかに配置するのは問題があるということでしょうか? 一般的に、外部ramには未初期化領域(b)を配置します。 何故なら、外部ramはバックアップ(ボタン電池で常時給電する)が可能なので、値を保持しておきたい変数は外部ramに配置します。 よって”未初期化領域”と呼ぶのです。 未初期化領域をcpu内部ramに配置しても、cpuへの電源供給断で消去されてしまいますよね。 よって未初期化領域・初期化領域の両方をcpu内部ramに配置すると、その違いは初期値を与えるか否かだけになってしまいます。(ちなみに、初期化領域に与える初期値が入っているセクションがc$dsecです) 外部ramを使用する、またバックアップするかどうかはシステムの目的次第です。 以上より、通常は初期化領域(r)をcpu内部ram、未初期化領域(b)を外部ramに配置するのが正しいと言えます。 しかし、お使いの外部ramがバックアップされていなければ意味がないので、バックアップされていない場合は、どちらでも良いということになります。 また、外部sramがプログラム中でどのように使われているかが不明なので、安易に外部ramにセクションを配置して良いのかどうかまではわかりません。 余談ですが、hewの場合、グローバル変数の宣言方法によって割り当てられる領域が変化します。 int a ; ←未初期化領域(b)へ割り当てられる int b = 0 ; ←初期化領域(r)へ割り当てられる 例えば、未初期化領域の容量が極端に小さい場合、変数に(無意味な)初期値を与えて、初期化領域に配置転換するという手法もあります。 極端な話、全ての変数に初期値を与えれば未初期化領域は不要、ということにもなります。