lpcxpresso с Cortex-M3: что такое libc.a (lib_a-impure.o), почему он использует 1 КБ ОЗУ?

Я надеюсь, что это не относится к конкретной области. Я хотел бы знать, почему libc.a использует 1K из 8K RAM, которые у меня есть на чипе.

Я не знаю, каким образом я использую libc, кроме как для вызова конструкторов моих глобальных объектов в array_init. Я думаю, что он участвует в создании копии по умолчанию, насколько я знаю. Я использую распределение пула, так что никаких вещей, связанных с кучей (я использую размещение новых, но это не должно заставить libc использовать ram, насколько я знаю). Если я полностью опускаю библиотеку и использую размещение нового как хак для создания всех моих глобальных объектов в основном, моя программа работает нормально, это еще один намек на то, что 1 Кбайт памяти, используемой libc, бесполезен. Может кто-нибудь указать мне на дальнейшее чтение или объяснить, как я могу сохранить array_init и конструкцию копирования по умолчанию для типов POD, но избавиться от накладных расходов ОЗУ?

Вот неправильная запись в файле .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(){}

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

3

Решение

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

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

0

Другие решения

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

0

По вопросам рекламы [email protected]