Мне, право, не удобно беспокоить вас, но не могли бы вы мне подсказать. Скачал тулчейн для проца Cortex A9. Поставил Debian на WSL. Распаковал туда тулчейн и проинсталлил. Прописал пути (PATH) в bashrc. Компилятор выдал: Теперь хочу поставить библиотеку wiringPi. https://github.com/friendlyarm/WiringNP Но вот никак не могу понять - ведь ее же надо собирать компилятором arm-cortexa9-linux-gnueabihf. Получается, что во всех makefiles надо сменить gcc на arm-cortexa9-linux-gnueabihf? Проца у меня нет. Железа тоже. Поэтому собрать на железе и сдуть оттуда библиотеки не предлагать.
Ну, обычно пусть к экзешнику компилятора берется из $(CC). Так что надо просто проверить/выставить эту переменную перед началом сборки
Если я правильно понял, то Код (Bash): andrey@HP:~$ export CC=/opt/FriendlyARM/toolchain/4.9.3/bin/arm-cortexa9-linux-gnueabihf-gcc:$CC andrey@HP:~$ $CC -bash: /opt/FriendlyARM/toolchain/4.9.3/bin/arm-cortexa9-linux-gnueabihf-gcc:: No such file or directory Как правильно занести путь до компилятора?
Он, этот проц какой то особенный? Стандартного набора инструкций для arm v7 не достаточно? Типа arm-linux-gnueabihf-gcc и arm-linux-gnueabihf-g++ не подходит? Склонировал и выполнил ./build как в редме.мд написано, ничего не правил совсем, установлен только компилятор arm-linux-gnueabihf Спойлер: build Код (C++): /tmp/WiringNP$ ./build wiringPi Build script ===================== WiringPi Library [UnInstall] make: Nothing to be done for 'all'. [Install Headers] [Install Dynamic Lib] WiringPi Devices Library [UnInstall] [Compile] ds1302.c [Compile] maxdetect.c [Compile] piNes.c [Compile] gertboard.c [Compile] piFace.c [Compile] lcd128x64.c [Compile] lcd.c [Compile] piGlow.c [Link (Dynamic)] [Install Headers] [Install Dynamic Lib] GPIO Utility [Compile] gpio.c [Compile] extensions.c [Compile] readall.c [Compile] pins.c readall.c: In function ‘readallPhys’: readall.c:649:16: warning: implicit declaration of function ‘getAltSilence’; did you mean ‘getline’? [-Wimplicit-function-declaration] int alt = getAltSilence (pin); ^~~~~~~~~~~~~ getline readall.c:656:23: warning: implicit declaration of function ‘digitalReadSilence’; did you mean ‘digitalRead’? [-Wimplicit-function-declaration] printf (" | %d", digitalReadSilence (pin)) ; ^~~~~~~~~~~~~~~~~~ digitalRead gpio.c: In function ‘doLoad’: gpio.c:228:6: warning: ignoring return value of ‘system’, declared with attribute warn_unused_result [-Wunused-result] system (cmd) ; ^~~~~~~~~~~~ gpio.c:235:6: warning: ignoring return value of ‘system’, declared with attribute warn_unused_result [-Wunused-result] system (cmd) ; ^~~~~~~~~~~~ gpio.c:274:7: warning: ignoring return value of ‘system’, declared with attribute warn_unused_result [-Wunused-result] system (cmd) ; ^~~~~~~~~~~~ gpio.c:280:7: warning: ignoring return value of ‘system’, declared with attribute warn_unused_result [-Wunused-result] system (cmd) ; ^~~~~~~~~~~~ [Link] [Install] All Done. NOTE: To compile programs with wiringNP, you need to add: -lwiringPi to your compile line(s).
я поначалу сделал также. Но у меня-то хост писюк Код (Bash): gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/6/lto-wrapper Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Debian 6.3.0-18+deb9u1' --with-bugurl=file:///usr/share/doc/gcc-6/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-6 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-6-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-6-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-6-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) но закрались сомнения, так как библиотека залегла не по тем путям, где ее ждут Код (Bash): /opt/FriendlyARM/toolchain/4.9.3/bin/arm-cortexa9-linux-gnueabihf-gcc -lwiringPi /opt/FriendlyARM/toolchain/4.9.3/lib/gcc/arm-cortexa9-linux-gnueabihf/4.9.3/../../../../arm-cortexa9-linux-gnueabihf/bin/ld.bfd: cannot find -lwiringPi Понятно, что пути решает не компилятор и я где-то не отдупляю))) Все объектные файлы легли сюда Код (Bash): ~/WiringPI/WiringNP/wiringPi$ dir boardtype_friendlyelec.c max31855.c mcp23016.c mcp23s08.o mcp3004.c pcf8574.c piThread.o softServo.o wiringPiI2C.c wiringSerial.o boardtype_friendlyelec.h max31855.h mcp23016.h mcp23s17.c mcp3004.h pcf8574.h sn3218.c softTone.c wiringPiI2C.h wiringShift.c boardtype_friendlyelec.o max31855.o mcp23016.o mcp23s17.h mcp3004.o pcf8574.o sn3218.h softTone.h wiringPiI2C.o wiringShift.h COPYING.LESSER max5322.c mcp23016reg.h mcp23s17.o mcp3422.c pcf8591.c sn3218.o softTone.o wiringPi.o wiringShift.o drcSerial.c max5322.h mcp23017.c mcp23x0817.h mcp3422.h pcf8591.h softPwm.c sr595.c wiringPiSPI.c drcSerial.h max5322.o mcp23017.h mcp23x08.h mcp3422.o pcf8591.o softPwm.h sr595.h wiringPiSPI.h drcSerial.o mcp23008.c mcp23017.o mcp3002.c mcp4802.c piHiPri.c softPwm.o sr595.o wiringPiSPI.o libwiringPi.so.2.0 mcp23008.h mcp23s08.c mcp3002.h mcp4802.h piHiPri.o softServo.c wiringPi.c wiringSerial.c Makefile mcp23008.o mcp23s08.h mcp3002.o mcp4802.o piThread.c softServo.h wiringPi.h wiringSerial.h я прописал этот путь в PATH, но всё-равно он не находит. Как же тогда это происходит на целевой машине? Ведь каких-то хитромудрых инструкций (типа прописать пути в переменные) нет. Куда смотрит компилятор с опцией ? здесь этой опции нет https://gcc.gnu.org/onlinedocs/gcc-9.2.0/gcc/Option-Summary.html#Option-Summary но на просторах тырнета говорится про /usr и /usr/lib
И у меня тоже ПК, не arm железо, а x86_64 gcc самый обычный, может он в дистре был или из официальных репов поставил, сейчас не помню. Код (Text): gcc --version gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0 Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Тоже решил посмотреть чтож там насобиралось. Спойлер: readelf Код (Text): readelf -h /usr/local/lib/libwiringPi.so ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: DYN (Shared object file) Machine: Advanced Micro Devices X86-64 Version: 0x1 Entry point address: 0x3300 Start of program headers: 64 (bytes into file) Start of section headers: 119536 (bytes into file) Flags: 0x0 Size of this header: 64 (bytes) Size of program headers: 56 (bytes) Number of program headers: 7 Size of section headers: 64 (bytes) Number of section headers: 28 Section header string table index: 27 Ууупс, а что архитектура не та??? Какой-то ELF64 и Advanced Micro Devices X86-64 Зачистим пока этот ненужный код Спойлер: ./build uninstall Код (Text): ./build uninstall wiringPi: [UnInstall] DevLib: [UnInstall] gpio: [UnInstall] ./build clean wiringPi: [Clean] DevLib: [Clean] gpio: [Clean] Examples: [Clean] Gertboard: [Clean] PiFace: [Clean] Quick2Wire: [Clean] PiGlow: [Clean] Оказывается в билде участвовали wiringPi DevLib gpio (это что устанавливалось) и прочие примеры и утилиты. Попробуем собрать по немножку, сначала wiringPi Заглянем в WiringNP/wiringPi/Makefile есть какие-то Код (Text): DESTDIR=/usr PREFIX=/local STATIC=libwiringPi.a DYNAMIC=libwiringPi.so.$(VERSION) #DEBUG = -g -O0 DEBUG = -O2 CC = gcc Зачем нам именно в /usr на нашем ПК иметь этот код для arm-a, да и gcc немножко не для arm-а указан, поправим чуть-чуть Код (Text): DESTDIR=/tmp/wiring-pi CC = arm-linux-gnueabihf-gcc Попробуем собрать Спойлер: WiringNP/wiringPi$ make Код (Text): WiringNP/wiringPi$ make [Compile] wiringPi.c wiringPi.c: In function ‘waitForInterrupt’: wiringPi.c:2476:9: warning: ‘return’ with no value, in function returning non-void return; ^~~~~~ wiringPi.c:2469:5: note: declared here int waitForInterrupt(int pin, int mS) { ^~~~~~~~~~~~~~~~ wiringPi.c: In function ‘digitalRead’: wiringPi.c:2151:7: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result] read(sysFds [pin], &c, 1); ^~~~~~~~~~~~~~~~~~~~~~~~~ wiringPi.c: In function ‘digitalReadSilence’: wiringPi.c:2203:13: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result] read(sysFds [pin], &c, 1); ^~~~~~~~~~~~~~~~~~~~~~~~~ wiringPi.c: In function ‘digitalWrite’: wiringPi.c:2267:21: warning: ignoring return value of ‘write’, declared with attribute warn_unused_result [-Wunused-result] write(sysFds [pin], "0\n", 2); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ wiringPi.c:2269:21: warning: ignoring return value of ‘write’, declared with attribute warn_unused_result [-Wunused-result] write(sysFds [pin], "1\n", 2); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ wiringPi.c: In function ‘waitForInterrupt’: wiringPi.c:2500:5: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result] (void) read(fd, &c, 1); ^~~~~~~~~~~~~~~~~~~~~~ [Compile] wiringSerial.c wiringSerial.c: In function ‘serialPutchar’: wiringSerial.c:146:3: warning: ignoring return value of ‘write’, declared with attribute warn_unused_result [-Wunused-result] write (fd, &c, 1) ; ^~~~~~~~~~~~~~~~~ wiringSerial.c: In function ‘serialPuts’: wiringSerial.c:158:3: warning: ignoring return value of ‘write’, declared with attribute warn_unused_result [-Wunused-result] write (fd, s, strlen (s)) ; ^~~~~~~~~~~~~~~~~~~~~~~~~ [Compile] wiringShift.c [Compile] piHiPri.c [Compile] piThread.c [Compile] wiringPiSPI.c [Compile] wiringPiI2C.c [Compile] softPwm.c [Compile] softTone.c [Compile] softServo.c [Compile] mcp23008.c [Compile] mcp23016.c [Compile] mcp23017.c [Compile] mcp23s08.c [Compile] mcp23s17.c [Compile] sr595.c [Compile] pcf8574.c [Compile] pcf8591.c pcf8591.c: In function ‘myAnalogWrite’: pcf8591.c:44:3: warning: ignoring return value of ‘write’, declared with attribute warn_unused_result [-Wunused-result] write (node->fd, b, 2) ; ^~~~~~~~~~~~~~~~~~~~~~ [Compile] mcp3002.c [Compile] mcp3004.c [Compile] mcp4802.c [Compile] mcp3422.c mcp3422.c: In function ‘myAnalogRead’: mcp3422.c:62:7: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result] read (node->fd, buffer, 4) ; ^~~~~~~~~~~~~~~~~~~~~~~~~~ mcp3422.c:68:7: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result] read (node->fd, buffer, 3) ; ^~~~~~~~~~~~~~~~~~~~~~~~~~ mcp3422.c:74:7: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result] read (node->fd, buffer, 3) ; ^~~~~~~~~~~~~~~~~~~~~~~~~~ mcp3422.c:80:7: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result] read (node->fd, buffer, 3) ; ^~~~~~~~~~~~~~~~~~~~~~~~~~ [Compile] max31855.c [Compile] max5322.c [Compile] sn3218.c [Compile] drcSerial.c [Compile] boardtype_friendlyelec.c boardtype_friendlyelec.c: In function ‘getFieldValueInCpuInfo’: boardtype_friendlyelec.c:138:44: warning: suggest parentheses around assignment used as truth value [-Wparentheses] GetKeyValue(isGotHardware, p, "Hardware", hardware, hardwareMaxLen); ^ boardtype_friendlyelec.c:127:25: note: in definition of macro ‘GetKeyValue’ if (valP=strtok(line2, ":")) { \ ^~~~ boardtype_friendlyelec.c:138:44: warning: suggest parentheses around assignment used as truth value [-Wparentheses] GetKeyValue(isGotHardware, p, "Hardware", hardware, hardwareMaxLen); ^ boardtype_friendlyelec.c:129:33: note: in definition of macro ‘GetKeyValue’ if (valP=strtok(0, ":")) { \ ^~~~ boardtype_friendlyelec.c:139:44: warning: suggest parentheses around assignment used as truth value [-Wparentheses] GetKeyValue(isGotRevision, p2, "Revision", revision, revisionMaxLen); ^ boardtype_friendlyelec.c:127:25: note: in definition of macro ‘GetKeyValue’ if (valP=strtok(line2, ":")) { \ ^~~~ boardtype_friendlyelec.c:139:44: warning: suggest parentheses around assignment used as truth value [-Wparentheses] GetKeyValue(isGotRevision, p2, "Revision", revision, revisionMaxLen); ^ boardtype_friendlyelec.c:129:33: note: in definition of macro ‘GetKeyValue’ if (valP=strtok(0, ":")) { \ ^~~~ boardtype_friendlyelec.c: In function ‘getAllwinnerBoardID’: boardtype_friendlyelec.c:183:21: warning: suggest parentheses around assignment used as truth value [-Wparentheses] if (p = strtok(line, ":")) { ^ boardtype_friendlyelec.c:186:29: warning: suggest parentheses around assignment used as truth value [-Wparentheses] if (p = strtok(0, ":")) { ^ [Link (Dynamic)] Чего-то собралось, попробуем установить Спойлер: WiringNP/wiringPi$ make install Код (Text): WiringNP/wiringPi$ make install [Install Headers] [Install Dynamic Lib] ln: failed to create symbolic link '/tmp/wiring-pi/lib/libwiringPi.so': No such file or directory Makefile:124: recipe for target 'install' failed make: *** [install] Error 1 Хотел создать сим-линк, а директории-то нет. Поможем ему Код (Text): mkdir -p /tmp/wiring-pi/lib Ещё раз попробуем установить Код (Text): make install [Install Headers] [Install Dynamic Lib] Смотрим что у нас с динамической библиотекой Код (Text): readelf -h /tmp/wiring-pi/lib/libwiringPi.so ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: DYN (Shared object file) Machine: ARM Version: 0x1 Entry point address: 0x2560 Start of program headers: 52 (bytes into file) Start of section headers: 101048 (bytes into file) Flags: 0x5000400, Version5 EABI, hard-float ABI Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 6 Size of section headers: 40 (bytes) Number of section headers: 26 Section header string table index: 25 Собрали именно для arm-а, а взлетит или нет пока не ясно. А вам оно на что? Для чего использовать wiringPi планировали?
Попробуем собрать пример blink Код (Text): arm-linux-gnueabihf-gcc WiringNP/examples/blink.c -o blink WiringNP/examples/blink.c:27:10: fatal error: wiringPi.h: No such file or directory #include <wiringPi.h> ^~~~~~~~~~~~ compilation terminated. Не находит заголовочных файлов, добавим путь в include Код (Text): arm-linux-gnueabihf-gcc -I/tmp/wiring-pi/local/include WiringNP/examples/blink.c -o blink /tmp/ccuNvtk5.o: In function `main': blink.c:(.text+0xe): undefined reference to `wiringPiSetup' blink.c:(.text+0x16): undefined reference to `pinMode' blink.c:(.text+0x1e): undefined reference to `digitalWrite' blink.c:(.text+0x26): undefined reference to `delay' blink.c:(.text+0x2e): undefined reference to `digitalWrite' blink.c:(.text+0x36): undefined reference to `delay' collect2: error: ld returned 1 exit status Не находит реализации функций, тех что библиотеке. Укажем где искать "-L/tmp/wiring-pi/lib/" и что использовать "-lwiringPi" Код (Text): arm-linux-gnueabihf-gcc -I/tmp/wiring-pi/local/include WiringNP/examples/blink.c -o blink -L/tmp/wiring-pi/lib/ -lwiringPi /tmp/wiring-pi/lib//libwiringPi.so: undefined reference to `pthread_join' /tmp/wiring-pi/lib//libwiringPi.so: undefined reference to `pthread_create' /tmp/wiring-pi/lib//libwiringPi.so: undefined reference to `pthread_cancel' collect2: error: ld returned 1 exit status Ещё и с потоками хочет работать, укажем ему где реализация потоков. Код (Text): arm-linux-gnueabihf-gcc -I/tmp/wiring-pi/local/include WiringNP/examples/blink.c -o blink -L/tmp/wiring-pi/lib/ -lwiringPi -lpthread Собрал без ошибок, смотрим что собрал. Код (Text): readelf -h blink ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: DYN (Shared object file) Machine: ARM Version: 0x1 Entry point address: 0x5f5 Start of program headers: 52 (bytes into file) Start of section headers: 7104 (bytes into file) Flags: 0x5000400, Version5 EABI, hard-float ABI Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 9 Size of section headers: 40 (bytes) Number of section headers: 29 Section header string table index: 28
так вот эти строки надо в makefile писать или можно просто в переменные терминала? собственно, тема и возникла из-за того, что на хосте при кросс-компиляции приходится прописывать пути к либам и иклюдам. На целевой машине, я так понимаю, не надо. Всё это прописать не проблема - хоть в make, хоть в tasks.json. есть желание потренироваться в коде для одноплатников, но на большом брате и в VSCode. Есть распи, но в руки попал даташит на Allwinner)) wiringPi - это так, для проверки работоспособности. Ну и посмотреть, как там в регистрах копаться) Очень хочется debug)
Так я так понимаю, что компилятор в тулчейне от производителя уже содержит все необходимые оптимизации под целевую платформу (речь про arm-cortexa9-linux-gnueabihf-gcc), а в arm-linux-gnueabihf-gcc их надо специально задавать через опции. Или нет? Напрягает то, что версия какая-то древняя. Наверняка gcc на железе будет гораздо свежее)
В мейк-файле явно указано что использовать для $(CC) Спойлер: Makefile Код (Text): CC = gcc all: $(CC) --version Спойлер: make Код (Text): make gcc --version gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0 Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Попробуем задать CC в окружении Спойлер: CC=arm-linux-gnueabihf-gcc make Код (Text): CC=arm-linux-gnueabihf-gcc make gcc --version gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0 Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Вывод один и тот-же Давайте закомментируем #CC = gcc Спойлер: Makefile Код (Text): #CC = gcc all: $(CC) --version Спойлер: make Код (Text): make cc --version cc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0 Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Уже какой-то cc, поищем его Спойлер: whereis cc Код (Text): whereis cc cc: /usr/bin/cc /usr/share/man/man1/cc.1.gz readlink -f /usr/bin/cc /usr/bin/x86_64-linux-gnu-gcc-7 readlink -f /usr/bin/gcc /usr/bin/x86_64-linux-gnu-gcc-7 Да это тот-же gcc Попробуем установить CC через окружение, оставив #CC = gcc Спойлер: make Код (Text): CC=arm-linux-gnueabihf-gcc make arm-linux-gnueabihf-gcc --version arm-linux-gnueabihf-gcc (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1) 7.4.0 Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Уже другой вывод Если переменная не определена никак, а в мейк-файле нужно её чем-то определить, можете использовать конструкцию MY_VAR ?= aaa Спойлер: Makefile Код (Text): MY_VAR ?= aaa all: @echo $(MY_VAR) Спойлер: make Код (Text): make aaa Спойлер: MY_VAR=bbb make Код (Text): MY_VAR=bbb make bbb Иногда бывает полезно переменные (пользовательские) использующиеся для сборки, определять в отдельном файле и включать его в Makefile по условию наличия, типа у пользователя есть users.mk - включаем его, нет - используем дефалтовые переменные. wiringPi для тренировки? А зачем её-то? Если-бы нужна была поддержка какой либо периферии, было-б ясно для чего, а лампочками помигать и гпио послушать - есть /sys/class/gpio Для отладки (удаленной) gdbserver. Всяких vscode я побаиваюсь, не понятно поведение поэтому и страшновато. Как-то эклипсе по старинке получается. При сборке wiringPi никаких премудрых ключей нет, всё стандартно. Посмотрел версии на ПК и на Малине Код (Text): arm-linux-gnueabihf-gcc --version arm-linux-gnueabihf-gcc (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1) 7.4.0 Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Код (Text): pi@raspberrypi:~ $ lsb_release -a No LSB modules are available. Distributor ID: Raspbian Description: Raspbian GNU/Linux 10 (buster) Release: 10 Codename: buster pi@raspberrypi:~ $ gcc --version gcc (Raspbian 8.3.0-6+rpi1) 8.3.0 Copyright (C) 2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. GCC 7.4 released [2018-12-06] GCC 8.3 released [2019-02-22] Да-уж, очень сильно древняя, аж на 2 с половиной месяца между релизами
ну у меня-то 4.9.3) Или поставить из дебиановского репозитория (или от Linaro) и не загоняться по этому поводу? А, ну я допетрил) надо править makefile, иначе его определение Код (Bash): СС = gcc всё-равно затрет мое) бегло посмотрел исходники на гитхабе - ногодрыг через регистры реализован. А раз так, подумал я, то писать свой ногодрыг пока ни к чему - поработаю через эту библиотеку. ну неееее.....это хорошо для bash или ещё для чего, но на сях....ну неееее Эклипс есть в виде Code Composer от TI. На моем ноуте грузится ну очень долго....Но это ладно. Очень не привычно вызывать IntelliSence по ctrl + space. VSCode грузится в разы быстрее. Но да, это всего лишь редактор, пусть и комбайн. Зато поддержка всего и вся)
Посмотрел на waitForInterrupt и wiringPiISR В wiringPiISR передаваемый указатель на коллбэк void (*function)(void) совсем не используется А waitForInterrupt почему-то используют poll, который в свою очередь через драйвер работает. А где регистры? Я прежде, работая через драйвер gpio, настраивал срабатывания по фронту или спаду или то и другое, в пуле ловил событие. Если нет доверия к драйверу, видимо медленно работает, давай-ка через библиотеку, а там тоже через драйвер. Пичалька...
Ну зачем сразу интеррапт) Для начала подергать ногой, потом аппаратно пошимить. SPI прикрутить. А уж потом прерывания. а как иначе реализовать отклик на прерывание? Чай у нас же не RTOS.
Немножко в цифрах Language | Library | Tested / version | Square wave Shell | /proc/mem access | 2015-02-14 | 2.8 kHz Shell/gpio utility | WiringPi gpio utility | 2015-02-15 / 2.25 | 40 Hz Python | RPi.GPIO | 2015-02-15 / 0.5.10 | 70 kHz Python | wiringpi2 bindings | 2015-02-15 / latest github | 28 kHz Ruby | wiringpi bindings | 2015-02-15 / latest gem (1.1.0) | 21 kHz C | Native library | 2015-02-15 / latest RaspPi wiki code | 22 MHz C | BCM 2835 | 2015-02-15 / 1.38 | 5.4 MHz C | wiringPi | 2015-02-15 / 2.25 | 4.1 – 4.6 MHz Perl | BCM 2835 | 2015-02-15 / 1.9 | 48 kHz источник Если хотим быстро, пишем нативный драйвер под конкретный чип и не паримся.
Такое от @Алексей.А надо бы в вики! Ну или подобное. А то развели питонов. Вы бы ещё и тапочки для тараканов... (шутка конечно) пропагандировали в примерах. А то сами не заметили что ни вопрос то питон, кроме железа конечно.
а как на сях скрипты писать? На питоне написал, загрузил и вуа-ля. Интерпретатор питона один черт или на сях, или на асме. Остался вопрос без ответа. Я правильно понимаю, что arm-cortexa9-linux-gnueabihf-gcc это тоже, что и arm-linux-gcc только с правильно выставленными опциями https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html
Ещё немножко в цифрах Пока nanoPi не доехал, эксперименты на Raspberry Pi 3 Model B Rev 1.2 Поскольку WiringPi позволяет работать как через регистры, так и через драйвер, решил проверить производительность, чуть поправив пример blink.c Для вывода использовал GPIO16 Спойлер: blink.c Код (C): #include <stdio.h> #include <time.h> #include <sys/stat.h> #include <wiringPi.h> int main (int argc, char** argv) { struct stat s; int n, pin, iterations, major, minor; time_t t; wiringPiVersion(&major, &minor); printf("WiringPi version: %d.%d\n", major, minor); if (stat("/sys/class/gpio/gpio16/value", &s) == 0) { // пользователь настроил GPIO16 как output puts("using: WiringPi via /sys/class/gpio/"); wiringPiSetupSys(); pin = 16; // BCM 16 gpio iterations = 5000000; } else { puts("using: WiringPi via registers"); wiringPiSetup(); pin = 27; // WiringPi 27 pin iterations = 200000000; } pinMode (pin, OUTPUT); for (n = iterations, t = time(NULL); n > 0; n--) { digitalWrite(pin, HIGH); digitalWrite(pin, LOW); } t = time(NULL) - t; printf("iterations: %d\n", iterations); printf("elapsed time: %usec.\n", t); if (t > 0) { printf("times per second: %u\n", iterations / t); } return 0; } Спойлер: compile pi@raspberrypi:~ $ gcc blink.c -o blink -lwiringPi Пока не настраивая GPIO16 как output, запускаю ./blink с выставленным WIRINGPI_DEBUG для болтливости WiringPi Спойлер: WIRINGPI_DEBUG=1 ./blink Код (Text): pi@raspberrypi:~ $ WIRINGPI_DEBUG=1 ./blink WiringPi version: 2.50 using: WiringPi via registers wiringPi: wiringPiSetup called piGpioLayout: Hardware: Hardware : BCM2835 piGpioLayout: Revision string: Revision : a02082 piGpioLayout: last4Chars are: "2082" piGpioLayoutOops: Returning revision: 2 piBoardId: Revision string: Revision : a02082 piBoardId: New Way: revision is: 00A02082 piBoardId: rev: 2, type: 8, proc: 2, mfg: 0, mem: 2, warranty: 0 iterations: 200000000 elapsed time: 32sec. times per second: 6250000 Настраиваю GPIO16 как output Спойлер: GPIO16 Код (Text): pi@raspberrypi:~ $ echo 16 >/sys/class/gpio/export pi@raspberrypi:~ $ echo out >/sys/class/gpio/gpio16/direction Ещё раз запускаю ./blink Спойлер: WIRINGPI_DEBUG=1 ./blink Код (Text): pi@raspberrypi:~ $ WIRINGPI_DEBUG=1 ./blink WiringPi version: 2.50 using: WiringPi via /sys/class/gpio/ wiringPi: wiringPiSetupSys called piGpioLayout: Hardware: Hardware : BCM2835 piGpioLayout: Revision string: Revision : a02082 piGpioLayout: last4Chars are: "2082" piGpioLayoutOops: Returning revision: 2 iterations: 5000000 elapsed time: 29sec. times per second: 172413 Работа с gpio через драйвер немножко (раз в 35-40) медленнее Несмотря на высокую производительность WiringPi при работе через регистры, производительность, я думаю, можно увеличить, довольно много времени уходит на вызовы и возвраты при использовании собранной библиотеки. Нужно сделать ещё примерчик работы с регистрами без использования библиотеки под конкретный чип, в моем случае BCM2835.