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

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

  1. Если есть подозрение, что компилятор оптимизирован для кортекс-а9, так что мешает это проверить?
    Собрали код ресурсоёмкий, например асимметричное шифрование на эллиптических кривых (ECDSA), на одном и другом компиляторе, и сравнили бы производительность.

    П.С.
    Осмелюсь высказать своё мнение,
    В процессе разработки, сборка и выполнение тест-кейсов выполняется на тех средствах, что удобны для разработчика.
    Если железо позволяет, это как раз наш случай, финальная сборка и тест-кейсы выполняется на реальном железе.
    К сожалению, не всегда достаточно ресурсов для выполнения сборки на реальном железе :(
     
    Последнее редактирование: 6 ноя 2019
  2. parovoZZ

    parovoZZ Гуру

    Блин, а я ж где-то видел готовые бенчмарки для прогона армов...
     
  3. b707

    b707 Гуру

    ну примерно как на Атмеге328 - через Вайринг 70 КГц, через регистры - 8 МГц
    Тем не менее в подавляющем большинстве случаев скорости digitalWrite() вполне хватает.
    Так что питон не так и плох, я ожидал худшего в сравнении С/С++
     
  4. parovoZZ

    parovoZZ Гуру

    на атмеге = тактовая/2, а не 8 МГц) Вот только больше там ничего сделать нельзя, в отличие от...
     
  5. parovoZZ

    parovoZZ Гуру

    залез на малинку, а там....
    Код (Bash):
    gcc version 4.9.2 (Raspbian 4.9.2-10+deb8u2)
    а из какого магазина? Из родного доставка кусается))
     
  6. Если атмеги стм-ки можно назвать realtime, то линуксовые одноплатники роутеры и т.п. как-то с realtime-мом не очень получается.
    Смотрю логическим анализатором на ногодрыг 5-6 мегабит и вижу пропуски до сотен наносекунд микросекунд.
    Код (Bash):
    pi@raspberrypi:~ $ cat /etc/os-release
    PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
    NAME="Raspbian GNU/Linux"
    VERSION_ID="10"
    VERSION="10 (buster)"
    VERSION_CODENAME=buster
    ID=raspbian
    ID_LIKE=debian
    HOME_URL="http://www.raspbian.org/"
    SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
    BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
    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.

    pi@raspberrypi:~ $ cat /proc/device-tree/model
    Raspberry Pi 3 Model B Rev 1.2
    onpad.ru Только одну штуку купил, на пробу.
     
    SergeiL нравится это.
  7. Для дрыганья ногами может и хватает, а для вычислений уступает в десятки раз
     
  8. SergeiL

    SergeiL Гуру

    Так Unix-подобные системы и не были никогда real time.
    Тут просто нужно смотреть на систему, и допустимые задержки. Может для чего-то они будут и real time.
     
  9. asam

    asam Гик

    Ну, если работать на уровне user space, то с real time все очень печально. Ядро в любой момент может положить на user process с прибором, даже если он высокоприоритетный, и заняться своими внутренними делами. Несколько лучше обстоит дело если работать с прерываниями на уровне драйверов (Kernel space), но всегда могут случиться и более высокоприоритные прерывания и порушить тайминги. А запрещать в драйвере прерывания больше чем на несколько микросекунд крайне не рекомендуется. И вообще на уровне драйверо порушить всю систему плевое дело.

    Поэтому сейчас стало модным делать комбинированные системы на чипе, где на ряду с Cortex-А ядрами для Линкукса или, прости господи, WinCE есть еще и одно или два Cortex-M ядра где можно под FreeRTOS или вообще без ОС заниматься реалтаймом. Общаются они по shared memory.
     
    ИгорьК нравится это.
  10. Просто порой, читая пОсты о том что, на некоторых mcu производительность пониже, давайте возьмем лучше другой чип, у которого и mmu есть и производительность выше, поднимем на нем линукс и получим другое качество.
    А получается если на M3 не было проблем с spi в режиме slave на одном мегабите, то на линуксовом контроллере реализуя программный spi для slave режима, даже на мегабите получаем ошибки.
    Летом вышел i.MX7 пока до нас не доехал, хотелось бы попробовать, без него все какой-то колхоз получается, для M4 делаем обвязку устанавливая медиатеки (+память +флешка +стекляшка).
     
    ИгорьК нравится это.
  11. parovoZZ

    parovoZZ Гуру

    а что так? В промышленном оборудовании всё то, что имеет поддержку CodeSys, внутри имеет WinCE. Овен, beckhof и иже с ним...
     
  12. Получил nanopineo2, был удивлен архитектурой.
    На raspberrypi и nanopineo2 вроде-бы Cortex-A53, только один armv7l а другой aarch64
    Код (C):

    pi@raspberrypi:~ $ lscpu
    Architecture:  armv7l
    Byte Order:  Little Endian
    CPU(s):  4
    On-line CPU(s) list: 0-3
    Thread(s) per core:  1
    Core(s) per socket:  4
    Socket(s):  1
    Vendor ID:  ARM
    Model:  4
    Model name:  Cortex-A53
    Stepping:  r0p4
    CPU max MHz:  1200.0000
    CPU min MHz:  600.0000
    BogoMIPS:  38.40
    Flags:  half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32

    alex@nanopineo2:~$ lscpu
    Architecture:  aarch64
    Byte Order:  Little Endian
    CPU(s):  4
    On-line CPU(s) list: 0-3
    Thread(s) per core:  1
    Core(s) per socket:  4
    Socket(s):  1
    NUMA node(s):  1
    Vendor ID:  ARM
    Model:  4
    Model name:  Cortex-A53
    Stepping:  r0p4
    CPU max MHz:  1008.0000
    CPU min MHz:  120.0000
    BogoMIPS:  48.00
    NUMA node0 CPU(s):  0-3
    Flags:  fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
    Решил сравнить производительность используя криптографию на эллиптических кривых, вычисление и проверка подписи, взял код с гитхаба и построил маленький примерчик.
    Код (C):

    #include <stdio.h>
    #include <time.h>
    #include "ecc.h"

    int main() {
      time_t t = time(NULL);
      int n;
      for (n = 0; n < 250; n++) {
        uint8_t p_publicKey[ECC_BYTES+1];
        uint8_t p_privateKey[ECC_BYTES];
        uint8_t p_secret[ECC_BYTES];
        uint8_t p_hash[ECC_BYTES];
        uint8_t p_signature[ECC_BYTES*2];
        if (ecc_make_key(p_publicKey, p_privateKey) != 1) {
          puts("ecc_make_key failed");
          break;
        }
        if (ecdh_shared_secret(p_publicKey, p_privateKey, p_secret) != 1) {
          puts("ecdh_shared_secret failed");
          break;
        }
        if (ecdsa_sign(p_privateKey, p_hash, p_signature) != 1) {
          puts("ecdsa_sign failed");
          break;
        }
        if (ecdsa_verify(p_publicKey, p_hash, p_signature) != 1) {
          puts("ecdsa_verify failed");
          break;
        }
      }
      printf("elapsed time: %ld\n", time(NULL) - t);
      return 0;
    }

    Собираю и смотрю что получилось на raspberrypi
    Код (C):
    pi@raspberrypi:~ $ gcc ecc.c main.c -o test1
    pi@raspberrypi:~ $ readelf -h test1
    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:  EXEC (Executable file)
      Machine:  ARM
      Version:  0x1
      Entry point address:  0x10438
      Start of program headers:  52 (bytes into file)
      Start of section headers:  21108 (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

    И на nanopineo2
    Код (C):
    alex@nanopineo2:~$ gcc ecc.c main.c -o test1  
    alex@nanopineo2:~$ readelf -h test1
    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:  AArch64
      Version:  0x1
      Entry point address:  0x7c0
      Start of program headers:  64 (bytes into file)
      Start of section headers:  25904 (bytes into file)
      Flags:  0x0
      Size of this header:  64 (bytes)
      Size of program headers:  56 (bytes)
      Number of program headers:  9
      Size of section headers:  64 (bytes)
      Number of section headers:  29
      Section header string table index: 28
    А теперь устроим соревнование :)
    Код (Bash):
    pi@raspberrypi:~ $ ./test1
    elapsed time: 57

    alex@nanopineo2:~$ ./test1
    elapsed time: 25
    64-х битный Cortex-A53 одержал победу над 32-х битным Cortex-A53
     
    SergeiL, parovoZZ и ИгорьК нравится это.
  13. asam

    asam Гик

    Летом?? Мы iMX7 в готовых изделиях уже с 16 года используем, а вышел он вообще в 14м кажется. Может ты с iMX8 путаешь?
     
  14. Летом в новостях CNXSoft читаль статью о массовом производстве, видимо новость немножко тухлая.

    П.С.
    Нашел, это был PicoCORE i.MX 7ULP
     
    Последнее редактирование: 8 ноя 2019
  15. parovoZZ

    parovoZZ Гуру

    А что за устройства?
     
  16. asam

    asam Гик

    Вискозометр с блэкджеком и шлюхами GUI и WiFI.
     
  17. parovoZZ

    parovoZZ Гуру

    А такой вопрос: альтернативные функции GPIO контролируются ядром Linux? В исходниках wiringPI вижу обращение к файлу /dev/spidev0.х для включения SPI, а не к /dev/mem с записью в регистр альтернативных значений.
     
  18. Загрузили драйвер ядра и он смонтировал устройство /dev/spidev0.x а нам захотелось линии spi использовать самостоятельно.
    А зачем тогда драйвер загружали??
    Видимо библиотека wiringPI предназначалась для работы в юзер-спейсе и не предполагалось что у пользователя будет достаточно сил чтоб выгрузить драйвер ядра и работать с регистрами напрямую.
     
  19. parovoZZ

    parovoZZ Гуру

    Так а родной драйвер умеет гнать данные через DMA? Где б про это почитать?
     
  20. В исходниках драйвера, для армбиан где-то в недрах armbian/build
    Не понятно зачем вам это? Не устраивает скорость?
    На малине, старой, ещё с одним ядром, в режиме мастер, на макете с проводами 20см получал скорость 25мегабит, выше сыпались ошибки, это на кадрах в 4к.
    А на маленьких кадрах и на 40мегабит работало.