lpcxpresso与Cortex-M3:什么是libc.a(lib_a-impure.o)为什么它使用1k的ram?

时间:2013-07-07 19:08:43

标签: c++ libc cortex-m3

我希望这不是针对特定领域的。我想知道为什么libc.a使用1K的8K内存芯片。

除了在array_init中调用我的全局对象的构造函数之外,我不知道我使用libc的任何方式。据我所知,我认为它涉及默认的拷贝构造。我使用池分配所以没有堆相关的东西(我确实使用了新的放置,但据我所知,这不应该导致libc使用ram)。如果我完全省略了库并使用placement new作为hack来构建我的所有全局对象,我的程序运行正常,这是另一个提示,libc使用的1k ram是无用的。任何人都可以指点我进一步阅读或解释如何保持array_init和POD类型的默认拷贝构造,但摆脱RAM开销?

以下是我项目的.map文件中的违规条目:

 *(vtable)
 *(.data*)
 .data._ZN3CDC4CoreI5MyCDCE11depInEmpty_E
                0x10000000        0x1 ./src/Main.o
                0x10000000                CDC::Core<MyCDC>::depInEmpty_
 *fill*         0x10000001        0x3 00
 .data.SystemFrequency
                0x10000004        0x4 ./kvasir/system_LPC17xx.o
                0x10000004                SystemFrequency
 .data.impure_data
                0x10000008      0x428 c:/nxp/lpcxpresso_5.2.4_2122/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libc.a(lib_a-impure.o)
 .data          0x10000430        0x4 c:/nxp/lpcxpresso_5.2.4_2122/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/4.6.2/armv7-m\crtbegin.o
                0x10000430                __dso_handle
                0x10000434                . = ALIGN (0x4)
                0x10000434                _edata = .

.jcr            0x10000434        0x0 load address 0x00003ee8
 .jcr           0x10000434        0x0 c:/nxp/lpcxpresso_5.2.4_2122/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/4.6.2/armv7-m\crtbegin.o

.bss            0x10000434     0x1600 load address 0x00003ee8
                0x10000434                _bss = .
 *(.bss*)
 .bss.inBuf     0x10000434       0x34 ./src/Main.o
                0x10000434                inBuf

更新

逐行完成我的代码之后我发现了一个修复,我在其中一个类中定义了一个空的析构函数

~MyClass(){}

评论说,删除了1K的ram。谁能告诉我为什么?

2 个答案:

答案 0 :(得分:0)

这不是您问题的直接解决方案,但可能是一个领先优势。 impure_data部分是图书馆重入支持的一部分。 http://web.archive.org/web/20090106124055/http://venus.billgatliff.com/node/3

我想知道如果该部分消失,你是否用-ffunction-sections -fdata-sections重建了这个库?这听起来像你从图书馆那里称之为珍贵,所以这可能是有效的。否则,你可能会被黑客攻击newlib或只是借用你真正想要的东西。

答案 1 :(得分:0)

在读入newLib代码后,在我看来,这是由于某些多线程内容被加载引起的。我通过不声明任何非默认析构函数来解决问题。我已经读过newLib nano将解决这个问题,但我还没有测试过,因为我的IDE不支持它开箱即用。