【发布时间】:2012-08-25 06:02:14
【问题描述】:
对 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() 计算可用 RAM,如中所述 http://jeelabs.org/2011/05/22/atmega-memory-use/。 当执行到达 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
【问题讨论】:
-
你编译优化了吗?可能是编译器将堆栈分配移动到 debugMethod() 的开头作为优化。
-
@Antti:是的,我使用
-O1编译。我将使用-O0进行测试。 -
@Antti:
-O0也会发生同样的行为,所以不是因为优化。
标签: c++ memory embedded avr-gcc