8ビットAVRマイクロコントローラーのプログラミング私はこのコードに示されている振る舞いに出くわしました:
class classA
{
public:
classA(Display *d) : _d(d) { _d->println("classA()", 0); }
~classA() { _d->println("~classA()", 1); }
uint8_t array[200];
Display *_d;
};
void useClassA(classA *a)
{
a->array[3] = 5;
}
void SomeClass::start()
{
SYSTEM_DISPLAY_FREE_RAM();
debugMethod();
_ui->lcd().println("after debugMethod", 3);
SYSTEM_WAIT_DEBUG_BUTTON();
SYSTEM_DISPLAY_FREE_RAM();
}
void SomeClass::debugMethod()
{
_ui->lcd().println("entered debugMethod", 3);
SYSTEM_WAIT_DEBUG_BUTTON();
SYSTEM_DISPLAY_FREE_RAM();
_ui->lcd().println("before while", 3);
SYSTEM_WAIT_DEBUG_BUTTON();
volatile uint8_t i = 1;
while (i != 0)
{
classA cA(&_ui->lcd());
SYSTEM_DISPLAY_FREE_RAM();
cA.array[199] = i--;
useClassA(&cA);
}
_ui->lcd().println("after while", 3);
SYSTEM_WAIT_DEBUG_BUTTON();
SYSTEM_DISPLAY_FREE_RAM();
}
SYSTEM_DISPLAY_FREE_RAM()は、http://jeelabs.org/2011/05/22/atmega-memory-use/で説明されているように、使用可能なRAMを計算し ます。実行がSomeClass::start()に達すると、次の出力が得られました。
Free Ram: 2677
entered debugMethod
Free Ram: 2458
before while
classA()
Free Ram: 2458
~classA()
after while
Free Ram: 2458
after debugMethod
Free Ram: 2677
オブジェクトclassA
は、の内部で作成および破棄されますがwhile
、メモリはの開始時に割り当てられているようでありdebugMethod()
、メソッドが終了するまで残ります。私は、メモリがしばらくの間だけ割り当てられることを期待していたので、Free Ram: 2458
。
何が起こっているのかについての説明はありますか?
キーワードwhile
を使用せずに、の内部で割り当てを強制的に実行する方法はありますか?new
使用したコンパイラ:avr-gcc(WinAVR 20100110)4.3.3