在嵌入式系统(Cortex-M4(上,我编写了用GCCarm-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
文件中,我有一个与extern "C"
关键字链接的免费函数myDriver_init
空闲函数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
。
我认为函数中的静态变量/对象是放在堆中的。这里有什么不同?
我在大二进制文件的映射文件中看到一些std::bad_exception
。尽管具有CCD_ 12和CCD_。
当你在函数内部创建静态对象时,编译器似乎会以某种方式将更多的代码生成到最终的二进制文件中,就像我在问题中的例子一样
这段代码与异常有关,在我的情况下,这不是一个理想的结果。
更改中的链接器标志
-specs=nosys.specs
至
-specs=nano.specs
解决了问题。