Портирование Newlib на пользовательскую настройку ARM

StackOverflow https://stackoverflow.com/questions/4665034

  •  10-10-2019
  •  | 
  •  

Вопрос

Это мой первый пост, и он охватывает то, что я пытался работать и выключаться уже около года.

По сути, это сводится к следующему: у меня есть копия 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, у меня был значительный успех, поэтому вы находитесь на правильном пути.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top