Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:3
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:7
Форум » starterkit.ru » Embedded Linux
компиляция программ и их перенос на плату
Novichok
Добавлено 16.07.2010 14:04 Редактировалось 16.07.2010 14:07
0
Сообщение: 1
Novichok
5

Пункты: 36
Регистрация: 08.07.2010
Цитата
вот лог того, что должно быть и что получится:

Код
[root@armmaker my1]# ls -l
итого 8
-rw-r--r-- 1 user user 263 Авг 14 21:56 Makefile
-rw-r--r-- 1 user user 91 Авг 14 21:53 my1.c
[root@armmaker my1]# cat my1.c
#include <stdio.h>

int main(void)
{
printf("Hello World!\n");
return 0;
}
[root@armmaker my1]# cat Makefile
CC=arm-none-linux-gnueabi-gcc
CXX=arm-none-linux-gnueabi-g++
LD=arm-none-linux-gnueabi-ld
LDFLAGS=-L/usr/local/bin/arm-none-linux-gnueabi/lib -static -s
EXEC = my1
OBJS = my1.o

all: $(EXEC)

$(EXEC): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS$(LDLIBS_$@))
[root@armmaker my1]# make
arm-none-linux-gnueabi-gcc -c -o my1.o my1.c
arm-none-linux-gnueabi-gcc -L/usr/local/bin/arm-none-linux-gnueabi/lib -static -s -o my1 my1.o
[root@armmaker my1]# ls -l
итого 464
-rw-r--r-- 1 user user 263 Авг 14 21:56 Makefile
-rwxr-xr-x 1 root root 457964 Авг 14 22:00 my1
-rw-r--r-- 1 user user 91 Авг 14 21:53 my1.c
-rw-r--r-- 1 root root 1052 Авг 14 22:00 my1.o
[root@armmaker my1]#


в финале вас должно волновать формирование бинарника
Код
-rwxr-xr-x 1 root root 457964 Авг 14 22:00 my1

далее согласно плану:

Цитата
e. Полученный my1 скопировал в /tftpboot
10. И так! Апогей – программа запустилась на ките:
a. На ките с помощью tftp загрузил my1
b. Дал ему права на запуск командой chmod +x my1
c. И собственно запустил программу которая и отработала как и хотел


используя вышеуказанный материал создал в папке My1 два файла: my1.c и Makefile с кодом приведенным выше. (только в мэйкфайле изменил строчку на LDFLAGS=-L/usr/local/arm-none-linux-gnueabi/lib -static -s -o my1 my1.o, так как в local/bin/ нет arm... а он лежит сразу в local)
после запуска команды make получил следующее:
[root@armmaker my1]# make
Makefile:11: *** пропущен разделитель. Останов.
в чем может быть проблема?
Спуститься к концу Подняться к началу
Персональная информация
Hermes
Добавлено 16.07.2010 14:50 Редактировалось 16.07.2010 15:00 Сообщение: 2
Hermes
5

Пункты: 3383
Регистрация: 02.04.2010
Код
Makefile:11: *** пропущен разделитель. Останов.

ругается на строчку $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS$(LDLIBS_$@)) ?
я в мейкфайлах не особо разбираюсь, но может вот этот вариант правильней:
Код
$(CC) $(LDFLAGS) $(LIBS) -o $@ ./$(OBJS) $(LDLIBS$(LDLIBS_$@))

ну не знаю у меня hello world компилилось вообще без Makefile
просто выполнял /usr/local/bin/arm-none-linux-gnueabi/arm-none-linux-gnueabi-gcc my1.c -static

ЗЫ: пути надо поменять на свои. Без мейкфайла можно собрать только простейший хеловорлд. если прописать в PATH адрес до компилятора, в последствии можно вводить только arm-none-linux-gnueabi-gcc

полазел по форуму и нашел интересный пример для вас:
Код
Почти простой HelloWorld, но и ещё пишет на карточку файл и измеряет скорость записи.
hello.cpp
Код

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <time.h>
#include <sys/time.h>
#define FILEBIN "/mnt/mmc/test.bin"
#define SIZEBUFF 1000000
unsigned long GetTickCount()
{
timeval tval;
struct timezone tzon;
gettimeofday(&tval,&tzon);
unsigned long t;
t=(unsigned long)tval.tv_sec * 1000 + tval.tv_usec/1000;
return t;
}

int main (int argc,char *argv[])//,char *envp[])
{
unsigned char *obuf;
obuf=(unsigned char *)malloc(SIZEBUFF);
for (int i=0;i<2048;i++)
{
obuf[i]=(unsigned char)i;
}
printf("ARM CPU work!
");
remove(FILEBIN);
FILE *fd=fopen(FILEBIN,"wb");
if(fd<0)
printf("error open file
");
unsigned long tic=GetTickCount();
for(int i=0;i<20000;i++)
{
size_t sizw=fwrite(obuf,1,512,fd);
};
fseek(fd,0,SEEK_END);
size_t lenf=ftell(fd);
fclose(fd);
free(obuf);
char txt[40];
unsigned long tti=GetTickCount()-tic;
sprintf(txt,"file size %d time %d %f
",lenf,tti,(float)lenf * 1000/(float)tti);
printf(txt);
printf("FIN prog!
");
return 0;
}

И Makefile
Код

CC=arm-none-linux-gnueabi-gcc
CXX=arm-none-linux-gnueabi-g++
LD=arm-linux-ld

LDFLAGS=-L/usr/local/arm-linux/arm-linux/lib -static -s
LIBS=-L/usr/local/arm-none-linux-gnueabi/lib -static -s

export CC
export CXX
export LD
export LDFLAGS

EXEC = hello
OBJS = hello.o

all: $(EXEC)

$(EXEC): $(OBJS)
$(CC) $(LDFLAGS) $(LIBS) -o $@ ./$(OBJS) $(LDLIBS$(LDLIBS_$@))
cp $(EXEC) /tftpboot/vidarm
romfs:
$(ROMFSINST) ./$(EXEC)

clean:
-rm -f $(EXEC) *.elf *.gdb *.o
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 16.07.2010 15:02 Сообщение: 3
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
после запуска команды make получил следующее:
[root@armmaker my1]# make
Makefile:11: *** пропущен разделитель. Останов.
в чем может быть проблема?

результат cat Makefile выложите

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 16.07.2010 15:32 Редактировалось 16.07.2010 15:32 Сообщение: 4
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
э-э.. не надо выкладывать, исправьте у себя ошибку

у вас:
Код
LDFLAGS=-L/usr/local/arm-none-linux-gnueabi/lib -static -s -o my1 my1.o

надо:
Код
LDFLAGS=-L/usr/local/arm-none-linux-gnueabi/lib -static -s

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Novichok
Добавлено 16.07.2010 16:49 Редактировалось 16.07.2010 16:56 Сообщение: 5
Novichok
5

Пункты: 36
Регистрация: 08.07.2010
ой, простите) криво копирнул...
вот мой Makefile:

CC=arm-none-linux-gnueabi-gcc
CXX=arm-none-linux-gnueabi-g++
LD=arm-none-linux-gnueabi-ld
LDFLAGS=-L/usr/local/arm-none-linux-gnueabi/lib -static -s
EXEC = my1
OBJS = my1.o

all: $(EXEC)

$(EXEC): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS$(LDLIBS_$@))

т.е. Либы лежат в папке /usr/local/arm-none-linux-gnueabi/lib/
а сами компиляторы в папке /usr/local/bin/
make сам должен найти компиляторы?

Цитата
ругается на строчку $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS$(LDLIBS_$@)) ?
я в мейкфайлах не особо разбираюсь, но может вот этот вариант правильней:
Код
$(CC) $(LDFLAGS) $(LIBS) -o $@ ./$(OBJS) $(LDLIBS$(LDLIBS_$@))

я сам то не шарю в этом))
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 16.07.2010 17:04 Редактировалось 16.07.2010 17:48 Сообщение: 6
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
уф.. к концу дня мозг устал думать :)
попробуйте совет Hermes

Цитата
ну не знаю у меня hello world компилилось вообще без Makefile
просто выполнял /usr/local/bin/arm-none-linux-gnueabi/arm-none-linux-gnueabi-gcc my1.c -static

поправив начальный путь на свой..
а какое происхождение ваше кросскомпилятора? как то он странновато установлен..

вечером, по возможности, попробую посмотреть что к чему..

update
Цитата
make сам должен найти компиляторы?

нет, это не Выундовз, которая сама додумывает и придумывает за пользователя.
Здесь аскетичная и суровая ось всех народов - Линукс. Пока все не объяснишь - не поедет. :)
Make будет опираться в своих знаниях по поиску содержимым Makefile и переменными текущего шелла (а вероятно еще чем-нить мной не постигнутым)
Make можно задать вопрос - Make --help

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Novichok
Добавлено 16.07.2010 17:44 Сообщение: 7
Novichok
5

Пункты: 36
Регистрация: 08.07.2010
окей, тогда next question xD:
допустим получил я my1 my1.o, я так понимаю первый это бинарник. его надо загрузить на плату и запустить через консоль? а где на плате будут храниться написанные программы? нужно используя файловую систему закинуть в какую нибудь папочку и оттуда запускать?
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 16.07.2010 17:47 Сообщение: 8
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
далее согласно плану:

Цитата
e. Полученный my1 скопировал в /tftpboot
10. И так! Апогей – программа запустилась на ките:
a. На ките с помощью tftp загрузил my1
b. Дал ему права на запуск командой chmod +x my1
c. И собственно запустил программу которая и отработала как и хотел

my1.o трогать не надо, это файл объектных кодов, к запуску программы отношения не имеет

зы tftp --help

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Novichok
Добавлено 20.07.2010 12:29 Редактировалось 20.07.2010 13:06 Сообщение: 9
Novichok
5

Пункты: 36
Регистрация: 08.07.2010
e. Полученный my1 скопировал в /tftpboot
10. И так! Апогей – программа запустилась на ките:
a. На ките с помощью tftp загрузил my1
b. Дал ему права на запуск командой chmod +x my1

my1 скопировал в /tftpboot

пункт А: как из Линукса на плате с помощью tftp загрузить My1 ?
tftp --help и где мне смотреть этот хелп? на плате нет, а Виртуальной станции в Линуксе тоже нет
такое ощущение что tftp нет, но ведь ядро же загрузили на плату через команду tftp_update
подскажите хоть мануал или статью где можно почитать про работу с файловой системой на плате (где там что лежит, куда закидывать проги, как их запускать)
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 20.07.2010 12:58 Сообщение: 10
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
эта.. не худо бы линуксу слегка поучиться.. уж больно вопросы примитивные..
скопируйте свой бинарник на любой доступный носитель (SD/MMC, USB Flash) и подмонтируйте этот накопитель к плате-киту..
про права на запуск не забудьте.

утилиты tftp, ftpget, ftpput входят в состав Busybox, т.е. чтобы они появились на плате надо включить их в конфигурации Busybox, пересобрать и обновить корневую ФС.

Цитата
ядро же загрузили на плату через команду tftp_update

это принципиально разные понятия - "команда tftp_update" это всего лишь имя скрипта (можно горшком назвать), который выполняет последовательность команд в Uboot по загрузке бинарников и запуск ядра. Содержимое можно посмотреть, остановив Uboot и дав команду printenv. Напротив, существует _программа_ tftp для ОС Линукс. почувствуйте разницу..

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux