Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Segmentation fault
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Игорь_Ван
Здравствуйте!!!
Пишу программу для at91sam9260. Подключил библиотеки и откомпилировал - ошибок нет. Пытаюсь залить elf файл через tftp в Linux установленный на контроллере. При выполнение выдаёт - Segmentation fault. Среда - Eclipse, тулчейн - Sourcery_CodeBench_Lite_for_ARM_EABI. Программа с атмеловского сайта (getting started), но в файле main.c вместо того, что было, просто пустая функция main. Прикрепляю скрин дерева проекта.Нажмите для просмотра прикрепленного файла
Ixt
Цитата(Игорь_Ван @ Oct 25 2013, 16:08) *
Здравствуйте!!!
Пишу программу для at91sam9260. Подключил библиотеки и откомпилировал - ошибок нет. Пытаюсь залить elf файл через tftp в Linux установленный на контроллере. При выполнение выдаёт - Segmentation fault. Среда - Eclipse, тулчейн - Sourcery_CodeBench_Lite_for_ARM_EABI. Программа с атмеловского сайта (getting started), но в файле main.c вместо того, что было, просто пустая функция main. Прикрепляю скрин дерева проекта.Нажмите для просмотра прикрепленного файла


Для Линукса не нужна at91lib. Может стартап от атмела случайно подцепился?
Игорь_Ван
Если не подключить at91lib, то выскакивает ошибка - cannot find entry symbol _start; defaulting to 00008000 .
Ixt
Цитата(Игорь_Ван @ Oct 25 2013, 18:44) *
Если не подключить at91lib, то выскакивает ошибка - cannot find entry symbol _start; defaulting to 00008000 .


У вас обычный Линукс или какой-нибудь вроде uLinux? Для embedded линукса минимальная программа пишется достаточно просто (так же как и для компьютера) и ничем не отличается от общепринятых hello world'ов. А у вас похоже тулчейн требует linker script. Я думаю что с тулчейном или опциями сборки что-то не то.
at91lib здесь точно не нужна. Она содержит код инициализации периферии. А это не нужно, потому что низкоуровневая работа с оборудованием - это не задача прикладной программы. Всю низкоуровневую работу должно делать само ядро и его драйверы.
Игорь_Ван
Спасибо большое за ответ.
Linux, ядро 2.6.24(плата SK-AT91SAM9XE512-S3E). А не подскажите где достать linker script и что с ним делать? С eclipse только-только начал знакомиться...
Заранее спасибо!
Ixt
Цитата(Игорь_Ван @ Oct 25 2013, 19:52) *
Спасибо большое за ответ.
Linux, ядро 2.6.24(плата SK-AT91SAM9XE512-S3E). А не подскажите где достать linker script и что с ним делать? С eclipse только-только начал знакомиться...
Заранее спасибо!


Никакой linker script здесь не нужен. В этом-то и проблема.
Попробуйте вот эту программу из консоли скомпилировать и запустить на целевой системе. Без eclips'а для начала (чтобы попроще было).
Код
$ cat main.c

#include <stdio.h>

int main()
{
    printf("Hello world\n");
    return 0;
}
$ arm-none-linux-gnueabi-gcc -static main.c
$ ls -l a.out
$ file a.out


Тулчейн может называться по другому, но примерно так и должно быть. А вообще у стартеркита всё из каробки (точнее из ftp) должно быть.
Tarbal
Цитата(Игорь_Ван @ Oct 25 2013, 16:08) *
Здравствуйте!!!
Пишу программу для at91sam9260. Подключил библиотеки и откомпилировал - ошибок нет. Пытаюсь залить elf файл через tftp в Linux установленный на контроллере. При выполнение выдаёт - Segmentation fault. Среда - Eclipse, тулчейн - Sourcery_CodeBench_Lite_for_ARM_EABI. Программа с атмеловского сайта (getting started), но в файле main.c вместо того, что было, просто пустая функция main. Прикрепляю скрин дерева проекта.


Эта ошибка указывает на то, что вы вызываете free() с неправильным поинтером. Чините вашу программу.
Игорь_Ван
Про неправильный поинтер, что-то где-то видел на каком-то форуме...
программа выглядит так:
int main(void)
{
return 0;
}
каким образом её починить?)
Ixt
Цитата(Игорь_Ван @ Oct 25 2013, 21:18) *
Про неправильный поинтер, что-то где-то видел на каком-то форуме...
программа выглядит так:
int main(void)
{
return 0;
}
каким образом её починить?)

Напишите как вы её собираете, приведите информацию о бинарнике (вывод утилит ls, file, ldd). Информацию о компиляторе (arm-none-linux-gnueabi-gcc -v), "uname -a" на целевой платформе.
mdmitry
Цитата(Игорь_Ван @ Oct 25 2013, 16:08) *
...
тулчейн - Sourcery_CodeBench_Lite_for_ARM_EABI.

Этот тулчейн для приложения без ОС. Название скорее такого плана arm-none-eabi
Для создания приложений под linux нужен тулчейн вида arm-none-linux-gnueabi
Tarbal
Всегда путаю две эти ошибки. Это использование поинтера, указывающего на неправильный адрес.

Самый близкий, но не самый простой способ -- выполнить программу myprogram под управлением strace.
strace ./myprogram > logfile.txt

Просматривая конец длинного файла logfile.txt можно найти что произошло. Но там надо опыт иметь, чтобы разобраться.

Если у вас есть gdb, то можно прошагать до места ошибки.
Скомпилируйте с ключем -g иначе не будет дебагирования.
Он позволяет ставить брекпоинты, что поможет обойти длинные циклы.

Еще способ:

Понаставить
printf("1\n");
printf("2\n");

В разные места программы каждый раз меняя цифру. Это позволит найти докуда программа доходит прежде чем упасть. Правда надо будет неоднократно добавлять printf и перекомпилировать.

Цитата(Игорь_Ван @ Oct 25 2013, 21:18) *
Про неправильный поинтер, что-то где-то видел на каком-то форуме...
программа выглядит так:
int main(void)
{
return 0;
}
каким образом её починить?)


Если эта программа дает такой результат -- значит она неправильно построена.
Как верно заметили кросс компиляторы бывают для Линукса и для bare metal
У вас на самом компьютере есть gcc? если да, то можно скомпиллировать ту же программу на таргет компьютере.

Вот объяснение разницы компиляторов:
https://sourcery.mentor.com/sgpp/lite/arm/portal/kbentry34

Остальные вопросы:
https://sourcery.mentor.com/sgpp/lite/arm/p...target_arch=arm

Откуда скачивать:
http://www.mentor.com/embedded-software/so...s/lite-edition/

У меня установлены такие tools:
ls arm-none-linux-gnueabi/arm-2011.03/bin/
arm-none-linux-gnueabi-addr2line arm-none-linux-gnueabi-gdbtui
arm-none-linux-gnueabi-ar arm-none-linux-gnueabi-gprof
arm-none-linux-gnueabi-as arm-none-linux-gnueabi-ld
arm-none-linux-gnueabi-c++ arm-none-linux-gnueabi-nm
arm-none-linux-gnueabi-c++filt arm-none-linux-gnueabi-objcopy
arm-none-linux-gnueabi-cpp arm-none-linux-gnueabi-objdump
arm-none-linux-gnueabi-elfedit arm-none-linux-gnueabi-ranlib
arm-none-linux-gnueabi-g++ arm-none-linux-gnueabi-readelf
arm-none-linux-gnueabi-gcc arm-none-linux-gnueabi-size
arm-none-linux-gnueabi-gcc-4.5.2 arm-none-linux-gnueabi-sprite
arm-none-linux-gnueabi-gcov arm-none-linux-gnueabi-strings
arm-none-linux-gnueabi-gdb arm-none-linux-gnueabi-strip

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

Вполне вероятно, что у вас есть и линукс и bare metal версии тулчейна. Попробуйте найти где переключить компилятор в вашем Эклипсе. Скорее всего это путь. Найдите где у вас стоят похожие файлы и если есть для линукса. Если нет, то можете скачать с сайта, что я дал ранее.
Игорь_Ван
Cпасибо большое!!! Стояла bare metal версия тулчейна, а нужна была для линукса.
Tarbal
Цитата(Игорь_Ван @ Oct 31 2013, 16:03) *
Cпасибо большое!!! Стояла bare metal версия тулчейна, а нужна была для линукса.


Успехов sm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.