2013-07-07 4 views
2

Надеюсь, это не относится к домену. Я хотел бы знать, почему libc.a использует 1K 8K бара, который у меня есть на чипе.lpcxpresso с Cortex-M3: что такое libc.a (lib_a-impure.o), почему он использует 1k RAM?

Мне неизвестно, каким образом я использую libc, кроме того, что он вызывает конструкторы моих глобальных объектов в array_init. Насколько я знаю, он также участвует в построении копии по умолчанию. Я использую распределение пула, поэтому нет связанных с кучей вещей (я использую новое место размещения, но это не должно приводить к тому, что libc использует барабан, насколько я знаю). Если я полностью исключаю библиотеку и использую новое место в качестве взлома для создания всех моих глобальных объектов в моей программе, то это еще один намек на то, что 1k оперативной памяти, используемой libc, бесполезен. Может ли кто-нибудь указать мне на дальнейшее чтение или объяснить, как я могу сохранить 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 

Update

после прохождения через мой код построчно Я нашел исправить, у меня был пустой деструктор определенный в одном из моих классов

~MyClass(){} 

комментируя это, удалил 1K бара. Может ли кто-нибудь сказать мне, почему?

ответ

0

После прочтения бит в коде newLib мне кажется, что это вызвано загрузкой некоторого материала для многопоточности. Я решил проблему, не объявляя каких-либо деструкторов без дефолта. Я прочитал, что newLib nano решит эту проблему, но я не тестировал, потому что моя IDE еще не поддерживает ее.

0

Это некое прямое решение вашей проблемы, но, возможно, руководство. Раздел impure_data является частью поддержки реентерации библиотеки. http://web.archive.org/web/20090106124055/http://venus.billgatliff.com/node/3

Интересно, восстановите ли вы библиотеку с помощью -ffunction-sections -fdata-sections, если этот раздел исчезнет? Похоже, вы называете драгоценное немного из библиотеки, чтобы это могло быть эффективным. В противном случае вы можете столкнуться с взломом newlib или просто заимствовать те части, которые вы действительно хотите.

+0

Я бы предпочел не касаться LIB, потому что у меня мало знаний о его тонкостях. Но все равно спасибо. – odinthenerd