Небольшая библиотека для встраиваемых систем [закрыта]

Я ищу небольшую libc для встроенного использования с freertos на микроконтроллере ARM7. Я посмотрел на newlib, но он слишком сложен для моих нужд. Newlib вызывает malloc() в ряде функций (например, printf()), что не очень хорошо для небольших встроенных систем реального времени.

Кто-нибудь знает небольшую переносимую реализацию libc с открытым исходным кодом, которая подойдет для моего приложения?


person GT.    schedule 07.02.2011    source источник
comment
Какую ОС/ядро вы используете? Это ключ к определению вашего выбора.   -  person R.. GitHub STOP HELPING ICE    schedule 07.02.2011
comment
Я использую freertos — freertos.org   -  person GT.    schedule 09.02.2011


Ответы (8)


PDCLib может соответствовать вашим потребностям. Однако он еще не завершен [ссылка не работает], и вероятно, нуждается в гораздо большем количестве реальных испытаний. Его автор использует DevSolar здесь, на SO.

обновление 01.11.2012: С 14 августа 2012 г. разработку взял на себя Оуэн Шеперд с новая домашняя страница и репозиторий Bitbucket [неработающая ссылка, используйте эту].

обновление 31 октября 2015 г. Специализированный веб-сайт кажется мертвым, но код все еще можно найти на битбакете. Последняя фиксация в этом репозитории произошла 24.11.2014.

обновление 2016-07-12: резервная копия веб-сайта создана, и DevSolar снова начала фиксацию 1 марта 2016 г.

person Christoph    schedule 07.02.2011
comment
Страница указывает на pdclib.e43.eu для текущей разработки. Он полон неработающих ссылок и, похоже, ничего не говорит о возможных требованиях/поддержке ОС/аппаратного обеспечения. - person XTL; 01.11.2012
comment
@XTL: существуют оверлеи платформы для posix и win32, и один одной из целей проекта было сделать его легко переносимым (см. вскрытие, написанное первоначальным автором: он разработал его как услугу сообществу любителей ОС); не знаю как это работает на практике... - person Christoph; 01.11.2012

Я использую newlib на своем Cortex_M3 с 32 КБ ОЗУ, и для устранения malloc() вы можете использовать siprintf() или sniprintf().

Pro: больше никаких звонков на malloc().

Минусы: он не поддерживает форматирование float и double и таким образом не очень переносим.

person Turbo J    schedule 10.02.2011

Если вы используете newlib и не реализуете системный вызов sbrk, то любая используемая вами функция, требующая malloc, будет генерировать ошибку компоновщика, что предотвратит непреднамеренное использование вызова, требующего динамической памяти. Поэтому я бы посоветовал вам сделать это, а затем просто избегать тех функций, которые вызывают ошибку компоновщика. Вы можете изменить или переопределить любые библиотечные функции, которые не хотите использовать.

person Clifford    schedule 12.02.2011

printf() не годится для небольших встроенных систем реального времени!

На самом деле он хуже, чем malloc во многих отношениях. Переменные списки аргументов, очень сложное форматирование, поддержка чисел с плавающей запятой, когда они вам не нужны, и т.д. и т.п. время выполнения.

printf(), возможно, подходит для любителей и новичков, которые все еще изучают C. Но если вы профессиональный программист, вам действительно следует написать свои собственные процедуры последовательного монитора / ЖК-дисплея. Вы значительно улучшите производительность программы и потребление флэш-памяти.

person Lundin    schedule 07.02.2011
comment
Хотя технически это не ответ, мне понравилось. - person Prof. Falken; 07.02.2011
comment
Это является ответом. Для небольшой встроенной системы реального времени вам вообще не следует использовать библиотеки stdio и stdlib! Например, MISRA-C полностью запрещает stdio. - person Lundin; 07.02.2011
comment
Это зависит от... Я бы никогда не вызывал printf() из контекста реального времени, но я не вижу больших проблем с использованием printf() в задачах, не критичных ко времени. Вызова malloc() следует избегать, насколько это возможно, потому что для создания задачи требуется malloc() для кадра стека для каждой задачи, а фрагментация кучи может быстро привести к ситуациям OOM. Обычно freertos настраивают с помощью malloc(), но без функциональной функции free(), потому что частое выделение/освобождение памяти в системах с очень небольшим объемом памяти считается слишком рискованным. - person GT.; 07.02.2011
comment
@Lundin: Какую библиотеку, совместимую с MISRA-C, вы рекомендуете? - person GT.; 07.02.2011
comment
Простите за прямоту, но единственные причины, которые я могу придумать для использования printf(), это либо лень, либо отсутствие знаний. Зачем использовать функцию, требующую x КБ флэш-памяти и y*1000 инструкций, для чего-то с такой же функциональностью с ‹100 байтами и ‹30 инструкциями? - person Lundin; 07.02.2011
comment
Что касается malloc(), я полностью согласен со всем высказанным. Помимо проблем с фрагментацией и утечками памяти, вам также потребуется выделить кучу в оперативной памяти (вероятно, несколько килобайт), а в таких системах у вас редко бывает достаточно данных для чтения/записи, чтобы оправдать это. - person Lundin; 07.02.2011
comment
@GT Я всегда пишу свои собственные библиотеки. Но тогда у меня не так много вариантов, так как я работаю только с системами, критически важными для безопасности. Если вы ищете соответствие MISRA, также неплохо было бы написать библиотеки самостоятельно, так как будет намного проще выполнять статический анализ вашего собственного кода, чем какой-либо сторонней библиотеки. - person Lundin; 07.02.2011
comment
@Lundin: Если printf() решит проблему, я не вижу проблем с ее использованием. Чтобы следовать вашей логике, вы не должны писать код на c, так как сборка потребует меньше флэш-памяти и будет выполняться быстрее. Черт возьми, почему вы вообще используете микроконтроллер, чистый ASIC был бы еще эффективнее и требовал бы еще меньше флэш-памяти ;-) - person GT.; 07.02.2011
comment
@GT И, следуя вашей логике, вы должны отправлять ПК вместе с каждым продуктом. - person Lundin; 07.02.2011
comment
@Lundin: LOL, я думаю, ты прав :-) И я понимаю твою аргументацию относительно статического анализа. Спасибо! - person GT.; 07.02.2011
comment
Нет ничего плохого в использовании printf во встроенных системах. Что-то не так с printf реализациями, которые вызывают malloc и делают всевозможные бесполезные вещи. Простая реализация printf без плавающей запятой (или которая игнорирует проблемы точности при печати с плавающей запятой) и без спецификаторов аргументов POSIX i18n %n$ может быть реализована примерно в 2 КБ кода и позволяет вызывающему приложению быть намного меньше и проще, чем если бы оно имело дублировать printf-подобную функциональность повсюду. - person R.. GitHub STOP HELPING ICE; 07.02.2011
comment
Как правило, я видел два типа встраиваемых систем: с памятью, измеряемой в килобайтах, где нужно быть осторожным, чтобы не втянуть ненужные возможности или даже позволить компилятору инициализировать вещи неэффективными способами, и те, где у вас есть десятки мегабайт оперативной памяти в любом случае, и сохранение возможности делать расширенный вывод (по крайней мере, за пределами критического пути), даже наличие дополнительной оболочки входа в систему и т. д. разумно и удобно. - person Chris Stratton; 07.02.2011
comment
Нет ничего плохого в printf... /-- ...может быть реализован примерно в 2k кода. Вы явно не работали с небольшими микроконтроллерными приложениями. 2к это огромно. И если вы даже не можете самостоятельно написать простой монитор последовательного порта RS-232 для замены функции printf(), вам вообще не следует программировать встроенные системы. - person Lundin; 08.02.2011
comment
@Lundin: Как сказал Крис, существует большое количество встроенных систем, и часто такие условия, как реальное время (операции с ограниченным временем) и отсутствие ошибок, важнее, чем чрезвычайно маленький объем памяти. Я был бы намного счастливее со встроенным устройством, которое использует 1 МБ памяти, но всегда работает, потому что я знаю, где происходит распределение, чем устройство, которое обычно использует 128 КБ и имеет 256 КБ физической памяти, но не имеет строгих ограничений на использование и не выполняет свою работу, когда происходит сбой выделения. - person R.. GitHub STOP HELPING ICE; 10.02.2011
comment
@R Вы хотите реального времени и безопасности и поэтому используете stdio.h? Вы шутите, верно? - person Lundin; 10.02.2011
comment
Однако они не совсем исключают друг друга. - person XTL; 01.11.2012
comment
2К это огромное зависит. Я написал две RTOS размером около 2K. Количество функций, которые я реализовал в этом 2K, было сделано для нескольких замечательных приложений (одним из них была робототехника). Если printf избавит меня от необходимости заново изобретать велосипед, угадайте, что? Я использую это. Время-деньги, тик, тик, тик, тик. И да, я работал с МАЛЕНЬКИМИ системами, которые были в сборе. - person Lloyd Sargent; 04.05.2013
comment
Кстати, если вы опустите поддержку расширенных символов или определите wchar_t как char, чтобы модификатор l можно было игнорировать, опустить плавающую точку и ничего не настраивать для повышения производительности, держу пари, вы можете получить printf намного меньше, чем 2k. Может даже меньше 0,5к. - person R.. GitHub STOP HELPING ICE; 23.06.2013

У меня были похожие потребности, и я обнаружил, что klibc вполне подходит. Единственным недостатком (для коммерческого использования) является то, что дистрибутив включает в себя несколько файлов с лицензией GPL, хотя большинство из них имеют лицензию BSD. Я взломал его минимальную версию здесь.

Это еще более ограничено, чем PDCLib, и подходит, если вам нужно всего несколько основных функций, таких как printf и strtok. Компилируется всего в 4 КБ со всеми включенными функциями.

person jpa    schedule 09.09.2011

Вы можете изучить встроенную библиотеку Artistry, которая обещает быть минимальной и хорошо протестированной. Он включает в себя printf() без malloc. Отказ от ответственности: я не использовал его, но он хорошо структурирован и активно развивается.

person SethML    schedule 03.09.2019

Вы можете проверить LGPL µClibc, который должен быть близок к glibc, но гораздо больше подходит для встраиваемых систем.

У него также есть страница со ссылками на другие библиотеки C с открытым исходным кодом, включая newlib и eCos, который может больше подходить для сред, отличных от Linux.

person paxdiablo    schedule 07.02.2011
comment
Поддерживает ли uClibc что-либо еще, кроме Linux? - person GT.; 07.02.2011
comment
Неа. Смотрите мой комментарий к исходному вопросу. - person R.. GitHub STOP HELPING ICE; 07.02.2011

Посмотрите uClibc и EGLIBC, возможно.

person unwind    schedule 07.02.2011
comment
OP, по-видимому, не использует Linux, поэтому эти варианты на основе Linux не будут очень полезны. - person R.. GitHub STOP HELPING ICE; 07.02.2011