Newlib оптимизирован для размера кода - PullRequest
2 голосов
/ 02 марта 2012

В моем встроенном приложении, которое очень чувствительно к памяти, я заметил, что некоторые функции newlib занимают много места в стеке. Просматривая исходный код newlib, в частности, memmem.c в этом случае, я заметил два определения, PREFER_SIZE_OVER_SPEED и __OPTIMIZE_SIZE__, которые могут значительно сократить использование памяти. Насколько я понимаю, они должны быть определены при компиляции newlib для использования библиотек "оптимизированных по размеру". Так как я использую микроконтроллер cortex-M3, есть ли какие-нибудь инструменты ARM, которые используют newlib «оптимизирован по размеру» или предоставляют опцию для его использования, или я должен попытаться собрать его сам. Более того, при сборке newlib я должен также собрать GCC или просто собрать библиотеку и использовать ее с моей текущей цепочкой инструментов. В настоящее время я использую CoIDE с прилагаемым набором инструментов.

Ответы [ 2 ]

1 голос
/ 03 марта 2012

Вам нужно только собрать библиотеку, а не компилятор.

Однако я ожидаю, что любая оптимизация размера будет относиться к размеру кода, а не к размеру стека.Размер стека будет уменьшен только в том случае, если будет уменьшен размер или число автоматических переменных, и, как правило, это определяется требуемыми функциональными возможностями, а не оптимизацией алгоритма.

Хотя верно, что часто высокоуровневые операции, связанные с перемещением больших объемов данных, можно ускорить, используя больше памяти, я бы сказал, что такие возможности минимальны на уровне стандартной библиотеки C, поэтому«Предпочитать размер над скоростью» - это все о размере кода, а не об использовании памяти данных.

0 голосов
/ 04 марта 2012

Вы используете memmem, который не является стандартной функцией. Это расширение GNU в glibc. Код, который вы фактически запускаете, находится в str-two-way.h. Я не изучал его, но он говорит, что это поиск сублинейных строк, как Бойер-Мур, и указывает на статью в Википедии о Бойер-Мур. Конечно, это будет иметь некоторые затраты памяти.

Поскольку это даже не стандартная функция, нет смысла использовать реализацию newlib, если она вам не нравится. Просто используйте свою собственную функцию поиска подстроки. Если вы знаете, что квадратичное время достаточно, просто используйте 5-строчный цикл из memmem.c в своем собственном коде. Возможно, вы захотите проверить, что memcmp правильно работает с не выровненными нагрузками (если ваша архитектура поддерживает их). Если это не так, ручной вложенный цикл может быть быстрее, чем вызов memcmp.

...