реклама на сайте
подробности

 
 
> Почему функция sscanf требует около 50кБ памяти?, Eclipse SDK. gcc
aabmail
сообщение Mar 20 2014, 08:26
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 210
Регистрация: 4-06-08
Из: Москва
Пользователь №: 38 056



Здравствуйте, уважаемые форумчане!

Возникла проблема с linking gcc в среде Xilinx SDK (Eclipse).

Почему из-за функции sscanf сегмент .text увеличивается в размере на 50 кБайт (а может и больше)? Не потому ли, что вместе с sscanf в .text попадает целиком вся библиотека ввода/вывода.
Как сделать так, чтобы прилинковывалась не вся библиотека, а только те функции, которые вывываются из программы.

Или я что-то в корне не понимаю. Заранее благодарен за любые комментарии.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aabmail
сообщение Mar 21 2014, 07:25
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 210
Регистрация: 4-06-08
Из: Москва
Пользователь №: 38 056



Цитата(Сергей Борщ @ Mar 20 2014, 13:33) *
Создайте .map (ключ для gcc -Wl.-Map=имя_файла). Рассмотрите его внимательно. В для каждой притянутой из библиотеки функции написано, какая функция ее вызвала. Не знаю про Xilinx, но обычно gcc-реализация (s)scanf тянет за собой менеджер памяти и кучу прочих вещей. Как раз где-то на 50К.


Я сгенерировал map-файл, но сильно закапываться в него не стал. Как я понял, в .text попадает целиком не вся библиотека ввода/вывода, а только нужные функции. Верно?

Цитата(scifi @ Mar 21 2014, 06:18) *
Кстати, как-то раз взял из тырнета чей-то sprintf() - получилось около 4К байт кода и никаких malloc(). С тех пор повсеместно использую. Есть ли что-то подобное для sscanf? Поиск в гугле навскидку результата не дал.


Для microBlaze специально сделан так называемый xil_printf, который не поддерживает плавающую точку. Он отъедает около 3-х килобайт.
Однако для sscanf такой халявы нет.

Мне в общем-то не нужен парсинг строк с вещественными числами с фиксированной точкой, а также с тестовыми подстроками.
Нет ли у кого? Не хотелось бы самому это писать.

Цитата(megajohn @ Mar 21 2014, 06:24) *
да я вообще полагал, что sprintf sscanf должны работать только на стеке. И вроде так и есть в IAR. Или нет ?


В GNU GCC не на стеке.

Цитата(Сергей Борщ @ Mar 21 2014, 06:55) *
В ИАРе может и так. А в комплекте gcc в качестве стандартной библиотеки идет newlib, которая изначально заточена под большие компы, многопоточность и буферизованный вывод. Только недавно в нех появилась возможность собирать "нано"-версию. Возможно это чем-то поможет автору ветки. Я код newlib внимательно не изучал, видел лишь имена функций, которые подтягивает sscanf и ssprintf. Вроде как printf использует динамическую память при первом вызове для создания структур потокового ввода-вывода и их буферов.


В Xilinx SDK newlib, к сожалению, не поставляется.

Всем большое спасибо за ответы.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 21 2014, 08:07
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(aabmail @ Mar 21 2014, 09:25) *
Я сгенерировал map-файл, но сильно закапываться в него не стал.
там самыми первыми строками должно идти что-то вроде
Код
Archive member included because of file (symbol)

/opt/arm-gcc/linaro/20130313/bin/../lib/gcc/arm-none-eabi/4.7.3/armv7-m/libgcc.a(_arm_addsubdf3.o)
                              ./release/obj/floatp10.o (__aeabi_dadd)
/opt/arm-gcc/linaro/20130313/bin/../lib/gcc/arm-none-eabi/4.7.3/armv7-m/libgcc.a(_arm_muldivdf3.o)
                              ./release/obj/floatp10.o (__aeabi_dmul)
/opt/arm-gcc/linaro/20130313/bin/../lib/gcc/arm-none-eabi/4.7.3/armv7-m/libgcc.a(_arm_cmpdf2.o)
                              ./release/obj/floatp10.o (__aeabi_dcmpeq)

Цитата(aabmail @ Mar 21 2014, 09:25) *
Как я понял, в .text попадает целиком не вся библиотека ввода/вывода, а только нужные функции. Верно?
Для библиотеки - да. Из нее тянется только то, что нужно. Кому нужно - см. начало .map.
Из исходников по умолчанию линкуется все. Чтобы этого не происходило, надо компилировать с ключами -ffunction-sections, -fdata-sections и линковать с ключем -Wl,--gc-sections. Тогда компилятор поместит каждую функцию и каждую переменную в свою секцию, а линкер выкинет те секции, на которые нет ссылок. Без этого все функции попадают в один глобальный сегмент .text, а данные - в .data и .bss. С этими ключами - функции попадают в .text.<имя_функции>, данные - аналогично и линкер может легко отделить мух от котлет.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 17 2015, 18:37
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(Сергей Борщ @ Mar 21 2014, 11:07) *
Из исходников по умолчанию линкуется все. Чтобы этого не происходило, надо компилировать с ключами -ffunction-sections, -fdata-sections и линковать с ключем -Wl,--gc-sections. Тогда компилятор поместит каждую функцию и каждую переменную в свою секцию, а линкер выкинет те секции, на которые нет ссылок. Без этого все функции попадают в один глобальный сегмент .text, а данные - в .data и .bss. С этими ключами - функции попадают в .text.<имя_функции>, данные - аналогично и линкер может легко отделить мух от котлет.

Приветствую.
Делаю проект в Xilinx SDK для MicroBlaze. Написал прстенький драйвер на базе класса c++, создаю объект, вызаваю пару функций. После компиляции выдаёт ошибку, что нехватает ещё 190 кБ памяти. Наткнулся на данную тему и вышеописанные ключи очень даже помогли. С ними размер кода уменьшился до 62 кБ, но если отказаться от использования классов и использовать только функции в стиле си, то размер программы (код примерно одинаков в обоих случаях) ужимается до 30 кБ. Возможно ли задать компилятору ещё какие-то дополнительные опции для уменьшения размера прошивки?
Спасибо.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- aabmail   Почему функция sscanf требует около 50кБ памяти?   Mar 20 2014, 08:26
- - Сергей Борщ   Цитата(aabmail @ Mar 20 2014, 10:26) Или ...   Mar 20 2014, 10:33
|- - Krys   Цитата(Сергей Борщ @ Mar 20 2014, 16:33) ...   Dec 18 2014, 09:29
- - DASM   Да она и сама по себе в полном виде на почти столь...   Mar 21 2014, 00:49
- - scifi   Кстати, как-то раз взял из тырнета чей-то sprintf(...   Mar 21 2014, 03:18
|- - megajohn   Цитата(scifi @ Mar 21 2014, 07:18) Кстати...   Mar 21 2014, 03:24
|- - Сергей Борщ   Цитата(megajohn @ Mar 21 2014, 05:24) И в...   Mar 21 2014, 03:55
|- - aabmail   Цитата(Сергей Борщ @ Mar 21 2014, 11:07) ...   Mar 21 2014, 09:56
||- - scifi   Цитата(aabmail @ Mar 21 2014, 13:56) С эт...   Mar 21 2014, 10:42
- - aabmail   Цитата(scifi @ Mar 21 2014, 13:42) А вы н...   Mar 21 2014, 12:34
- - scifi   Я и раньше натыкался на Nuttx. Там в комплекте идё...   Mar 21 2014, 15:28
- - Сергей Борщ   Я не использую этот плугин, поэтому конкретное мес...   Dec 18 2014, 10:30
- - Krys   Там галочки можно поставить только в General: В...   Dec 18 2014, 10:57


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 15:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.01429 секунд с 7
ELECTRONIX ©2004-2016