Перейти к содержанию
    

программирование at91sam9xeek

есть плата at91sam9xeek, на ней установлен линукс, взятый с linux4sam, своя операционка - ubuntu 10.10 i386, задача для начала простая - написать hello world для платы. собственно привет мир написан, на убунте установлен arm-linux-gnueabi, еще собарил кросс компиляторы по известным схемам из нета. дальше, привет мир компилируется командой arm-linux-gnueabi-gcc, переписываю его на плату, запускаю из под рута, и тут он говорит что illegal instruction, это в одном случае, если при gcc указать ключ static, если без ключа, то segmentation fault. ежели компилировать кросс компилятором который собирал сам по известным схемам, то и компилить не хочет, сначала ему не хватало файла crti.o, потом crtbegin.o, после засовывания этих файлов в директорию с сишником он стал писать что cant find -lgcc, что это такое гугл не помог. я не работал с at91sam9, но я не верю что нельзя написать программу и не запустить на плате под линуксом, поэтому буду рад любым замечаниям что делаю не так, и рекомендациям по нахождению правильного пути.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на убунте установлен arm-linux-gnueabi

А этот arm-linux-gnueabi - тот же, которым собраны ядро и рутфс на плате? Когда осваивал linux from scratch, нагугливал, что если glibc у кросскомпилятора и у системы-цели разной сборки (даже если версия одна и та же), то как раз чаще всего и будет незапускаемый код. Поэтому я бы посоветовал найти набор кросстулз на linux4sam. А если Вы хотите делать свою сборку кросстулз, то и рутфс и ядро придется пересобирать. Это, правда, не относится к пересборке gcc и binutils, только к пересборке glibc.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

arm-linux-gnueabi это пакет установленный в убунте, уже после того как линукс был загружен в плату. на плате ангстром, который демонстративный на linux4sam. а перекомпилировывать ядро и фс наверно долгий процесс.... не хотелось так глубоко заседать, надеялся что лихим кавалерийским наскоком все поедет

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня получилось запустить плату, собрав из исходников и glibc, и gcc, и ядро, и мир. Долго это было и сложно. Сейчас гляжу в сторону emdebian, у них вроде есть и тулчейны, и собранные пакеты под армы. Но еще не пробовал - придет плата, запущу - отпишусь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ссылка с описанием была весьмя старой и уже мертва, прикладываю хтмл-файл, ориентируясь на который, я собирал LFS.

_______toolchain_____ARM__________Linux____AT91RM9200.htm

К слову, собирать glibc (не uclibc, а полновесный glibc) лучше с поддержкой потоков nptl, а не linuxthreads, т.к. последние были на заре линукса и сейчас активно выпиливаются.

ИМХО, LFS хорош для ознакомления с системой, узнать, что и откуда у нее растет. Но параллельно посоветовал бы подготовить инструментарий, позволяющий работать. В этом смысле хорош Emdebian. Вроде были и еще проекты, предоставляющие не просто тулчейн с компиленным ядром и небольшим рутом, но полноценные дистры. Пока не интересовался этим.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня рабочей является такая конфигурация (подсмотрено в слакваре):

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

После загрузки ядро запускает процесс инит с инитрамфс. Инит, отработав, меняет рут на примонтированную микросд карту, запуская инит там. Инит на микросд запускает всех демонов и стартует шелл, привязанный к DBGU порту (/dev/ttyS0). Ну а из демонов - syslogd, sshd, mdev (вместо неповоротливого и прожорливого udev, входит в комплект бизибокса).

Инит от инитрамфс.

#!/bin/sh
echo in initramfs
echo

# mount system fs
mount /proc
mount /sys
mount /tmp
mount /dev/pts
mount /dev
# get new devices
echo /bin/mdev > /proc/sys/kernel/hotplug
usleep 100000
mdev -s
# find SD/MMC card
# support work wuth mmcblk and mmcblk0p1 only
if [ -r /dev/mmcblk0p1 ]; then # huge devices with partitions
    mount /dev/mmcblk0p1 /mmc 
elif [ -r /dev/mmcblk0 ]; then # little devices (my first 256 MB microSD)
    mount /dev/mmcblk0 /mmc
else
    echo "no SD/MMC card found!"
    /bin/sh --login #start shell
fi
echo outting initramfs
exec switch_root /mmc /linuxrc

Может, профессионалы и фыркнут, но у меня работает - мне хватает.

P.S. еще мне показалось удобным поднять ftp-сервер на плате, чтобы сливать туда-оттуда разные файлы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

petrovs@petrovs:~/arm/src/linux$ make include/linux/version.h

make: arm-linux-gcc: Команда не найдена

CHK include/linux/version.h

UPD include/linux/version.h

почемуто это все что он делает на этом шаге, нормально так? или мало? хз

использую дистрибутив linux-2.6.33, с linux4sam, оттудаже и патч для этого ядра.

и еще, в /linux/include нет каталога asm-arm, нормально или нет?

 

при попытке скомпилировать gcc в первый раз выдает

.

.

.

checking for --enable-version-specific-runtime-libs... no

checking whether to enable maintainer-specific portions of Makefiles... no

checking for arm-linux-gcc... /home/petrovs/arm/src/build/gcc-4.5.1-stage1/./gcc/xgcc -B/home/petrovs/arm/src/build/gcc-4.5.1-stage1/./gcc/ -B/home/petrovs/arm/arm-linux/bin/ -B/home/petrovs/arm/arm-linux/lib/ -isystem /home/petrovs/arm/arm-linux/include -isystem /home/petrovs/arm/arm-linux/sys-include

checking for C compiler default output file name...

configure: error: in `/home/petrovs/arm/src/build/gcc-4.5.1-stage1/arm-linux/libmudflap':

configure: error: C compiler cannot create executables

See `config.log' for more details.

make[1]: *** [configure-target-libmudflap] Ошибка 1

make[1]: Выход из каталога `/home/petrovs/arm/src/build/gcc-4.5.1-stage1'

make: *** [all] Ошибка 2

не очень понятная ошибка, побовал версии gcc 4.3.5 и 4.5.1, в обоих случаях примерно тоже самое.

что хочет и почему не едет?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

petrovs@petrovs:~/arm/src/linux$ make include/linux/version.h

make: arm-linux-gcc: Команда не найдена

CHK include/linux/version.h

UPD include/linux/version.h

почемуто это все что он делает на этом шаге, нормально так? или мало? хз

Да, нормально.

 

использую дистрибутив linux-2.6.33, с linux4sam, оттудаже и патч для этого ядра.

и еще, в /linux/include нет каталога asm-arm, нормально или нет?

заглянул в ванильное 2.6.33.6 - там тоже нет, когда появляется - не помню. В используемом 2.6.29.6 - есть, похоже эти папки появляются уже после сборки самого ядра.

при попытке скомпилировать gcc в первый раз выдает

checking for --enable-version-specific-runtime-libs... no

хз что это, надо гуглить

configure: error: in `/home/petrovs/arm/src/build/gcc-4.5.1-stage1/arm-linux/libmudflap':

configure: error: C compiler cannot create executables

See `config.log' for more details.

make[1]: *** [configure-target-libmudflap] Ошибка 1

Мдя. Мой грех. Забыл, как сам накувыркался с этим маном. В общем, там такое дело - сначала выкуривается gcc cross compiling c gcc.gnu.org, затем собирается и устанавливается цель all-gcc:

make all-gcc
make install-gcc

что хочет
glibc собранного, которого еще нет.

и почему не едет?
пЫва мало было :beer:

И еще раз - gcc собирается для кросс компиляции, т.е. соборанный им эльф на собирающей машине не запустится, а мэйк пробует сделать именно это, если мой телепатический модуль не сбойнул:)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

думал что возможно надо попробовать

make all-gcc

make install-gcc

но почему то так и не попробовал, пытался баловаться параметрами ./config нашел оригинал представленной здесь статьи на аглицком, и там как раз перед промежуточной установкой gcc капиталистический товарищ устанавливал заголовки glibc, я следуя этому попытался провернуть этот фокус, но что то тоже не поехало

 

что хочет

glibc собранного, которого еще нет.

 

о, так поехало, вот подумал про это, а руками не запустил, бывает =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

petrovs@petrovs:~/arm/src/build/glibc-2.11.2$ BUILD_CC=gcc CC=${CROSS_COMPILE}gcc AR=${CROSS_COMPILE}ar RANLIB=${CROSS_COMPILE}ranlib AS=${CROSS_COMPILE}as LD=${CROSS_COMPILE}ld ../../glibc-2.11.2/./configure --prefix=/usr --build=i686-unknown-linux --host=arm-linux --target=arm-linux --without-fp --without-__thread --enable-add-ons=linuxthreads --with-headers=${SYSROOT}/usr/include 2>&1 | tee configure.out

checking build system type... i686-unknown-linux-gnu

checking host system type... arm-unknown-linux-gnu

checking for arm-linux-gcc... arm-linux-gcc

checking for suffix of object files... o

checking whether we are using the GNU C compiler... yes

checking whether arm-linux-gcc accepts -g... yes

checking for arm-linux-gcc option to accept ISO C89... unsupported

checking for gcc... gcc

checking how to run the C preprocessor... arm-linux-gcc -E

checking for arm-linux-g++... no

checking for arm-linux-c++... no

checking for arm-linux-gpp... no

checking for arm-linux-aCC... no

checking for arm-linux-CC... no

checking for arm-linux-cxx... no

checking for arm-linux-cc++... no

checking for arm-linux-cl.exe... no

checking for arm-linux-FCC... no

checking for arm-linux-KCC... no

checking for arm-linux-RCC... no

checking for arm-linux-xlC_r... no

checking for arm-linux-xlC... no

checking for g++... g++

configure: WARNING: using cross tools not prefixed with host triplet

checking whether we are using the GNU C++ compiler... yes

checking whether g++ accepts -g... yes

configure: running configure fragment for add-on linuxthreads

checking sysdep dirs... configure: error: The arm is not supported.

неожиданное сообщение, что делать?

 

BUILD_CC=gcc CC=${CROSS_COMPILE}gcc AR=${CROSS_COMPILE}ar RANLIB=${CROSS_COMPILE}ranlib AS=${CROSS_COMPILE}as LD=${CROSS_COMPILE}ld ../../glibc-2.11.2/./configure --prefix=${SYSROOT}/usr --build=i686-unknown-linux --target=arm-linux --without-fp --without-__thread --enable-add-ons=linuxthreads --with-headers=${SYSROOT}/usr/include 2>&1 | tee configure.out

здесь убрал параметр --host=arm-linux, не знаю верно ли это решение, если верить http://www.gnu.org/software/hello/manual/a...cifying%20Names и моему к сожалению скудному познанию аглицкого, то вроде как так и должно быть

 

 

причем пробежал без варнингов

 

но и ничего не сделал, а предложил поставить флаг --disable-sanity-checks, а с этим флагом вываливается ошибка

.

.

.

configure: error: gcc must provide the <cpuid.h> header

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

configure: running configure fragment for add-on linuxthreads

checking sysdep dirs... configure: error: The arm is not supported.

неожиданное сообщение, что делать?

А что я выше говорил про линукстредс? Пост 6.

Кроме того, если брал сырцы у гну, наверно видел файлы glibc-ports-xxx? Так вот сама глибц - под x86, а под арм ее ориентирует (добавляет платформозависимые куски) именно порт. И не факт, что самую свежую версию уже портировали.

а предложил поставить флаг --disable-sanity-checks, а с этим флагом вываливается ошибка
с ошибкой придется разбираться, но чуть позже, а флаг нужен, иначе при сборке мейк будет по-всякому тестировать собираемое, а как, если оно не запускается? есс-но будет тьма ошибок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нда, невнимательно читал 6 пост, да еще надо вообще внимательнее смотреть в директории и ридми файлы. как прикрутить этот порт? просто распаковать?

в инструкции пишет товарищ накатить патчи, это конечно хорошо, но для новичка затруднительно, как их накатывать? и еще, там есть три патча, порт, линукстридс и либидн. про линукстридс пишет надо просто распаковать, ну ладно, распаковал, как накатить патчи? гугл не помог, либо пользоваться не умею =(

 

про файлы типа тра-та-та.path вроде понятно, а вот про эти патчи не понятно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...