在嵌入式系统(Cortex-M4)上,我编写了使用GCC arm-none-eabi-g++
编译的C++。编译器版本10.2.1 20201103
。
我的代码有点复杂,复制粘贴在这里,所以这里有一个例子:
我有一个抽象硬件外设的类。
class A
{
public:
void init(void)
{
// initializes hardware peripheral
}
// other public functions here
private:
int x,y;
// other private variables here
};
我想在RTOS任务中使用这个类。
在a.cpp
文件中,我有一个自由函数myDriver_init
,它与extern "C"
关键字相链接。
自由函数myDriver_init
创建一个RTOS任务,并给它一个回调函数以运行。
extern "C" myDriver_init(void)
{
static A a;
create_RTOS_task(&myDriver_state_machine, &a, priority, stack_size);
}
void myDriver_state_machine(void * param)
{
A * a_ptr = static_cast<A*>(param);
a_ptr->init();
while(true)
{
//user code here...
}
}
在main.c
中,我像这样调用C链接函数
int main(void)
{
myDriver_init();
...
RTOS_Task_run();
}
问题是当对象a
在函数myDriver_init
内时,为什么我得到的二进制文件几乎是两倍大小?
如果我把它移到外面,并把它作为一个全局变量,二进制文件的大小会明显变小。
static A a;
extern "C" myDriver_init(void)
{
create_RTOS_task(&myDriver_state_machine, NULL, priority, stack_size);
}
void myDriver_state_machine(void * param)
{
a.init();
while(true)
{
//user code here...
}
}
为什么会发生这种情况?
在这两种情况下,我使用的优化都是-O2
。
我以为函数中的静态变量/对象都放在堆中。这里有什么不同吗?
我在大二进制文件的Map文件中看到了一些std::bad_exception
。尽管有-fno-rtti
和-fno-exceptions
标志。
1条答案
按热度按时间g6ll5ycj1#
当你在函数中创建静态对象时,编译器似乎会在最终的二进制文件中生成更多的代码,就像我在问题中的例子一样。
这段代码与异常有关,在我的例子中,这不是一个理想的结果。
将链接器标志从
至
解决了问题。