Портирование newlib на пользовательские настройки ARM - PullRequest
2 голосов
/ 12 января 2011

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

По сути, это сводится к следующему: у меня есть копияnewlib, которую я пытаюсь заставить работать над LPC2388 (ARM7TDMI от NXP).Это на linux box с использованием arm-elf-gcc

У меня есть вопрос, что я смотрел много уроков, посвященных портированию newlib, и все они рассказывают о заглушках (например, exit, open, read / write, sbrk), и у меня есть довольно хорошее представление о том, как реализовать все эти функции.Но где я должен их поместить?

У меня есть дистрибутив newlib из sources.redhat.com/pub/newlib/newlib-1.18.0.tar.gz и после того, как я покопался, я нашел"syscalls.c" (в newlib-1.18.0 / newlib / libc / sys / arm), который содержит все заглушки, которые мне нужно обновить, но все они заполнены довольно законченным кодом (который делает НЕ , кажется, работает без crt0.S, который сам по себе не работает с моим чипом.

Должен ли я просто уничтожить эти функции и переписать их?Или я должен написать их где-нибудь еще.Должен ли я создать совершенно новую папку в newlib / libc / sys с именем моей «архитектуры» и изменить цель на соответствующую?

Мне также любопытно, есть ли соответствующий этикет для распространения чего-то подобного послевыпустив его как проект с открытым исходным кодом.В настоящее время у меня есть скрипт, который загружает binutils, arm-elf-gcc, newlib и gdb и компилирует их.Если я изменяю файлы, которые находятся в каталоге newlib, я должен передать патч, который автоматически применяется моим сценарием?Или я должен добавить измененный newlib в репозиторий?

Спасибо, что удосужились прочитать!Ниже приведено более подробное описание того, что я делаю.


Для тех, кто хочет / нуждается в дополнительной информации о моей настройке:

Я строю консоль ARM для видеоигр на основесвободно в проекте Uzebox (http://belogic.com/uzebox/).

Я делал все возможное, используя разные ресурсы, пытаясь понять это.Вы можете прочитать о начале моих приключений здесь (форумы sparkfun, никто не отвечает, как я сам в этом разбираюсь): forum.sparkfun.com/viewtopic.php?f=11&t=22072

Я следовалвсе это, прочитав вопросы Stackoverflow о портировании newlib и увидев несколько различных руководств (например, wiki.osdev.org/Porting_Newlib), но они также страдают от того, что рассказывают мне о реализации заглушек, не упоминая где, кто, что, когдаили как!

Ответы [ 2 ]

7 голосов
/ 12 января 2011

Но куда мне их положить?

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

Возможно, вам потребуется создать собственную целевую crt0.s, собрать и связать ее для вашей цели.

Хорошее руководство от Quantum Leaps от Miro Samek по запуску разработки GNU / ARM доступно здесь . Примеры основаны на части Atmel AT91, поэтому вам нужно немного узнать о вашем устройстве NXP, чтобы адаптировать код запуска.

Готовый слой переноса Newlib для LPC2xxx был доступен здесь , но ссылки на файлы, похоже, не работают. Тот же слой переноса используется в проекте Мартина Томаса WinARM . Это порт Windows GNU ARM GCC, но примеры, включенные в него, предназначены для конкретных целей, а не для конкретных хостов.

Вам нужно всего лишь изменить слой переноса на Newlib, и, поскольку он является целевым и приложением, вам не нужно (на самом деле, вероятно, не следует) отправлять свой код в проект.

2 голосов
/ 12 января 2011

Когда я использовал newlib, это именно то, что я сделал, взорвал crt0.s, syscalls.c и libcfunc.c. Мое личное предпочтение заключалось в том, чтобы связать замену crt0.s и syscalls.c (свернуло несколько функций из libcfunc в замену syscalls.c) на основе встроенного приложения.

Я никогда не был заинтересован в том, чтобы перенести какую-либо из этих работ обратно в дистрибутив, поэтому не могу вам там помочь.

Вы находитесь на правильном пути, хотя crt0.S и syscalls.c - это то место, где вы хотите работать, чтобы настроить свою цель. Лично я интересовался библиотекой C (и printf), и в первую очередь мне нужно было бы убрать все функции, чтобы они возвращали 0 или 1 или что бы то ни было, чтобы заставить функцию просто работать и не мешать ссылкам, периодически создавая файл Функции / O работают на связанных данных в ROM / RAM. По сути, без замены или изменения каких-либо других файлов в newlib у меня было достаточно успеха, поэтому вы на правильном пути.

...