Кросс-компиляция

Тема в разделе "Raspberry Pi", создана пользователем parovoZZ, 4 ноя 2019.

  1. parovoZZ

    parovoZZ Гуру

    Мне, право, не удобно беспокоить вас, но не могли бы вы мне подсказать.

    Скачал тулчейн для проца Cortex A9. Поставил Debian на WSL. Распаковал туда тулчейн и проинсталлил. Прописал пути (PATH) в bashrc. Компилятор выдал:
    Теперь хочу поставить библиотеку wiringPi.
    https://github.com/friendlyarm/WiringNP
    Но вот никак не могу понять - ведь ее же надо собирать компилятором arm-cortexa9-linux-gnueabihf. Получается, что во всех makefiles надо сменить gcc на arm-cortexa9-linux-gnueabihf?

    Проца у меня нет. Железа тоже. Поэтому собрать на железе и сдуть оттуда библиотеки не предлагать.
     
  2. asam

    asam Гик

    Ну, обычно пусть к экзешнику компилятора берется из $(CC). Так что надо просто проверить/выставить эту переменную перед началом сборки
     
  3. parovoZZ

    parovoZZ Гуру

    Если я правильно понял, то
    Код (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
    Как правильно занести путь до компилятора?
     
  4. Он, этот проц какой то особенный? Стандартного набора инструкций для arm v7 не достаточно? Типа arm-linux-gnueabihf-gcc и arm-linux-gnueabihf-g++ не подходит?
    Склонировал и выполнил ./build как в редме.мд написано, ничего не правил совсем, установлен только компилятор arm-linux-gnueabihf
    Код (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).
     
    Igor68 нравится это.
  5. parovoZZ

    parovoZZ Гуру

    я поначалу сделал также. Но у меня-то хост писюк
    Код (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
     
  6. И у меня тоже ПК, не 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.
    Тоже решил посмотреть чтож там насобиралось.
    Код (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
    Зачистим пока этот ненужный код
    Код (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
    Попробуем собрать
    Код (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)]
    Чего-то собралось, попробуем установить
    Код (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 планировали?
     
    ZAZ-965, ИгорьК, parovoZZ и ещё 1-му нравится это.
  7. Попробуем собрать пример 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
     
    ZAZ-965, asam, ИгорьК и 2 другим нравится это.
  8. parovoZZ

    parovoZZ Гуру

  9. parovoZZ

    parovoZZ Гуру

    так вот эти строки надо в makefile писать или можно просто в переменные терминала?

    собственно, тема и возникла из-за того, что на хосте при кросс-компиляции приходится прописывать пути к либам и иклюдам. На целевой машине, я так понимаю, не надо. Всё это прописать не проблема - хоть в make, хоть в tasks.json.

    есть желание потренироваться в коде для одноплатников, но на большом брате и в VSCode. Есть распи, но в руки попал даташит на Allwinner)) wiringPi - это так, для проверки работоспособности. Ну и посмотреть, как там в регистрах копаться) Очень хочется debug)
     
  10. parovoZZ

    parovoZZ Гуру

    Так я так понимаю, что компилятор в тулчейне от производителя уже содержит все необходимые оптимизации под целевую платформу (речь про arm-cortexa9-linux-gnueabihf-gcc), а в arm-linux-gnueabihf-gcc их надо специально задавать через опции. Или нет? Напрягает то, что версия какая-то древняя. Наверняка gcc на железе будет гораздо свежее)
     
  11. В мейк-файле явно указано что использовать для $(CC)
    Код (Text):
    CC = gcc
    all:
      $(CC) --version
    Код (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 в окружении
    Код (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
    Код (Text):
    #CC = gcc
    all:
      $(CC) --version
    Код (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, поищем его
    Код (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
    Код (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
    Код (Text):

    MY_VAR ?= aaa
    all:
      @echo $(MY_VAR)
    Код (Text):
    make
    aaa
    Код (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 с половиной месяца между релизами :)
     
    ZAZ-965, asam, Igor68 и ещё 1-му нравится это.
  12. parovoZZ

    parovoZZ Гуру

    ну у меня-то 4.9.3) Или поставить из дебиановского репозитория (или от Linaro) и не загоняться по этому поводу?

    А, ну я допетрил) надо править makefile, иначе его определение
    Код (Bash):
    СС = gcc
    всё-равно затрет мое)

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

    ну неееее.....это хорошо для bash или ещё для чего, но на сях....ну неееее

    Эклипс есть в виде Code Composer от TI. На моем ноуте грузится ну очень долго....Но это ладно. Очень не привычно вызывать IntelliSence по ctrl + space.
    VSCode грузится в разы быстрее. Но да, это всего лишь редактор, пусть и комбайн. Зато поддержка всего и вся)
     
  13. Посмотрел на waitForInterrupt и wiringPiISR
    В wiringPiISR передаваемый указатель на коллбэк void (*function)(void) совсем не используется
    А waitForInterrupt почему-то используют poll, который в свою очередь через драйвер работает.
    А где регистры? Я прежде, работая через драйвер gpio, настраивал срабатывания по фронту или спаду или то и другое, в пуле ловил событие.
    Если нет доверия к драйверу, видимо медленно работает, давай-ка через библиотеку, а там тоже через драйвер. Пичалька...
     
    Igor68 нравится это.
  14. Igor68

    Igor68 Гуру

    ШИКАРНО! Очень поучительно! Спасибо за такое!
     
  15. parovoZZ

    parovoZZ Гуру

    Ну зачем сразу интеррапт) Для начала подергать ногой, потом аппаратно пошимить. SPI прикрутить. А уж потом прерывания.

    а как иначе реализовать отклик на прерывание? Чай у нас же не RTOS.
     
  16. Немножко в цифрах
    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
    источник
    Если хотим быстро, пишем нативный драйвер под конкретный чип и не паримся.
     
    Igor68 нравится это.
  17. parovoZZ

    parovoZZ Гуру

    это я на хабре видел.
     
  18. Igor68

    Igor68 Гуру

    Такое от @Алексей.А надо бы в вики! Ну или подобное.


    А то развели питонов. Вы бы ещё и тапочки для тараканов... (шутка конечно) пропагандировали в примерах. А то сами не заметили что ни вопрос то питон, кроме железа конечно.
     
  19. parovoZZ

    parovoZZ Гуру

    а как на сях скрипты писать? На питоне написал, загрузил и вуа-ля. Интерпретатор питона один черт или на сях, или на асме.

    Остался вопрос без ответа.
    Я правильно понимаю, что
    arm-cortexa9-linux-gnueabihf-gcc
    это тоже, что и
    arm-linux-gcc
    только с правильно выставленными опциями
    https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html
     
  20. Ещё немножко в цифрах
    Пока nanoPi не доехал, эксперименты на Raspberry Pi 3 Model B Rev 1.2
    Поскольку WiringPi позволяет работать как через регистры, так и через драйвер, решил проверить производительность, чуть поправив пример blink.c
    Для вывода использовал GPIO16
    Код (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;
    }
    pi@raspberrypi:~ $ gcc blink.c -o blink -lwiringPi
    Пока не настраивая GPIO16 как output, запускаю ./blink с выставленным WIRINGPI_DEBUG для болтливости WiringPi
    Код (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
    Код (Text):
    pi@raspberrypi:~ $ echo 16 >/sys/class/gpio/export
    pi@raspberrypi:~ $ echo out >/sys/class/gpio/gpio16/direction
    Ещё раз запускаю ./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.