Портирование Newlib на пользовательскую настройку ARM
Вопрос
Это мой первый пост, и он охватывает то, что я пытался работать и выключаться уже около года.
По сути, это сводится к следующему: у меня есть копия Newlib, которую я пытаюсь работать над LPC2388 (ARM7TDMI от NXP). Это на ящике Linux с использованием Arm-elf-gcc
Вопрос, который у меня есть, заключается в том, что я смотрел на многие учебники, рассказывающие о портировании Newlib, и все они говорят о заглушках (например, выход, Open, Read/Write, SBRK), и у меня есть довольно хорошее представление о Как реализовать все эти функции. Но куда я должен их поместить?
У меня есть распределение Newlib из источников.redhat.com/pub/newlib/newlib-1.18.0.tar.gz и после того, как я нашел "я обнаружил" syscalls.c "(в Newlib-18.0/newlib/libc/sys/sys/sys/sys/sys/sys/sys/ ARM), который содержит все заглушки, которые я должен обновить, но все они заполнены довольно законченным кодом (который делает НЕТ Кажется, работают без CRT0.S, который сам не работает с моим чипом).
Должен ли я просто уничтожить эти функции сам и переписывать их? Или я должен написать их где -нибудь еще. Должен ли я сделать совершенно новую папку в Newlib/libc/sys с именем моей «архитектуры» и изменить цель, чтобы соответствовать?
Мне также любопытно, есть ли правильный этикет для распределения чего -то подобного после того, как выпустил его как проект с открытым исходным кодом. В настоящее время у меня есть сценарий, который загружает бинутилы, Arm-Elf-GCC, Newlib и GDB, и компилирует их. Если я изменяю файлы, которые находятся в каталоге Newlib, должен ли я передать патч, который мой скрипт автоматически применяет? Или я должен добавить модифицированный Newlib в репозиторий?
Спасибо, что потрудились читать! Следуйте этому более подробное разбивка того, что я делаю.
Для тех, кто хочет/нуждается в дополнительной информации о моей настройке:
Я строю видеоигрную консоль, основанную на консоли, основанной на проекте Uzebox ( http://belogic.com/uzebox/ ).
Я делал всевозможные вещи, вытаскивая из множества различных ресурсов, когда я пытаюсь понять это. Вы можете прочитать о начале моих приключений здесь (форумы Sparkfun, никто не отвечает, так как я разбираюсь в себе): Forum.sparkfun.com/viewtopic.php?f=11&t=22072
Я следил за всем этим, прочитав вопросы stackoverflow о портировании Newlib и увидел несколько различных учебных пособий (например, wiki.osdev.org/porting_newlib), но они также страдают от того, чтобы говорить мне о том, где, где, кто, что, что, что, что, что, что, что, что, что, что, что, что, что, что, что, что, что, что, что, что, что, что, что, что, что, что, что, что, что, что, что, что, что, что, что, что Когда, или как!
Решение
Но куда мне их поместить?
Вы можете поместить их туда, где вам нравится, если они существуют в последней ссылке. Вы можете включить их в саму библиотеку LIBC, или вы можете сохранить это общее, и иметь SYSCALLS в качестве отдельного целевого файла или библиотеки конкретного объекта или библиотеки.
Возможно, вам понадобится создать свою собственную целевую конкретную CRT0.S, собрать и связать его для вашей цели.
Хороший учебник Миро Сайк о квантовых скачках по разработке GNU/ARM доступен и работает здесь. Анкет Примеры основаны на части Atmel AT91, поэтому вам нужно немного узнать о своем устройстве NXP, чтобы адаптировать код запуска.
Готовный слой порта Newlib для LPC2XXX был доступный здесь, но ссылки на файлы, по -видимому, нарушены. Тот же слой порта используется в Мартине Томасе ' Winarm проект. Это порт Windows of GNU ARM GCC, но примеры, включенные в него, являются целевыми специфичными, а не специфичными для хоста.
Вам нужно только изменить портирующий слой на Newlib, и, поскольку он является целью а также Приложение конкретно, вам не нужно (на самом деле, вероятно, не должно) отправлять свой код в проект.
Другие советы
Когда я использовал Newlib, это именно то, что я сделал, взорвал CRT0.S, syscalls.c и libcfunc.c. Мое личное предпочтение было связать в замене для CRT0.S и Syscalls.c (внедрило несколько функций в libcfunc в замену syscalls.c) на основе встроенного приложения.
Я никогда не интересовался тем, чтобы перенести какую -либо эту работу обратно в дистрибуцию, поэтому не могу вам там помочь.
Вы находитесь на правильном пути, хотя CRT0.S и Syscalls.c - это то, где вы хотите работать, чтобы настроить свою цель. Лично я интересовался библиотекой C (и Printf) и в первую очередь стерилизовал все функции, чтобы вернуть 0 или 1 или что -то еще, чтобы заставить функцию просто работать и не помешать связыванию, периодически делая файл. /O Функции работают в связи с данными в ПЗУ/ОЗУ. По сути, без замены и не изменяя любые другие файлы в Newlib, у меня был значительный успех, поэтому вы находитесь на правильном пути.