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

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

  1. parovoZZ

    parovoZZ Гуру

    Посмотрю

    если умеет, то как заставить сделать это?

    накладные расходы, если речь про скорость подготовки данных к выводу
    Впрочем, интерес на данный момент академический. Цель - выдернуть из wiringPI функции работы с SPI. Но не просто выдернуть, но и разобраться что к чему.
     
  2. Когда нужно отправить данные в сетевую карту, на подготовку данных потратили какое-то время, затем можем выполнить запись минуя ip стек или можем работать через стек и драйвер.
    Тут вопросы возникают что использовать? Есть доверие к драйверу или нет?
    Там работа через драйвер, как вы уже заметили. Выдергивать-то нечего.
     
  3. На малине загрузился с другого дистра для aarch64
    Код (Bash):
    alex@localhost ~ $ lscpu
    Архитектура:  aarch64
    Порядок байт:  Little Endian
    CPU(s):  4
    On-line CPU(s) list: 0-3
    Thread(s) per core:  1
    Ядер на сокет:  4
    Сокетов:  1
    NUMA node(s):  1
    ID прроизводителя:  ARM
    Модель:  4
    Имя модели:  Cortex-A53
    Степпинг:  r0p4
    BogoMIPS:  38.40
    NUMA node0 CPU(s):  0-3
    Флаги:  fp asimd evtstrm crc32 cpuid
    Повторил тест что в #32 и получил результат по лучше
    Код (Bash):
    alex@localhost ~ $ time ./test1
    elapsed time: 36
    34.99user 0.10system 0:35.17elapsed 99%CPU (0avgtext+0avgdata 1224maxresident)k
    0inputs+0outputs (0major+70minor)pagefaults 0swaps
    Не понятно только почему на raspberrypi.org в downloads/raspbian ни слова о armhf или о aarch64
    Скачиваешь образ и не знаешь точно для какой архитектуры. Может я чего-то упустил или не внимательно читал...
     
  4. parovoZZ

    parovoZZ Гуру

    Ну как. Там же какие-то параметры передаются ядру - скорость, режим работы, канал. Возможно есть ещё что-то. Я ж под GNU/Linux не прогал ни разу) Всё AVR да MSP.
     
  5. Открываем устройство как файл через open и управляем через ioctl
    И никаких премудростей.
    Код (C++):
    #include <fcntl.h>
    #include <sys/ioctl.h>
    #include <linux/spi/spidev.h>
    #define BUFFER_SIZE   2048
    unsigned int spi_speed = 10000000;
    unsigned char spi_bitsPerWord = 8;
    unsigned char spi_mode = SPI_MODE_0;
    int spi_fd;
    do {
       // Открываем устройство
       if ((spi_fd = open("/dev/spidev0.0", O_RDWR)) < 0) {
         perror("open failed");
         break;
       }
       // Настраиваем режим записи
       if (ioctl(spi_fd, SPI_IOC_WR_MODE, &spi_mode) < 0) {
         perror("Could not set SPIMode (WR)...ioctl failed");
         break;
       }
       // Настраиваем режим чтения
       if (ioctl(spi_fd, SPI_IOC_RD_MODE, &spi_mode) < 0) {
         perror("Could not set SPIMode (RD)...ioctl failed");
         break;
       }
       // Устанавливаем количество бит в слове для записи
       if (ioctl(spi_fd, SPI_IOC_WR_BITS_PER_WORD, &spi_bitsPerWord) < 0) {
         perror("Could not set SPI bitsPerWord (WR)...ioctl failed");
         break;
       }
       // Устанавливаем количество бит в слове для чтения
       if (ioctl(spi_fd, SPI_IOC_RD_BITS_PER_WORD, &spi_bitsPerWord) < 0) {
         perror("Could not set SPI bitsPerWord(RD)...ioctl failed");
         break;
       }
       // Устанавливаем скорость для записи
       if (ioctl(spi_fd, SPI_IOC_WR_MAX_SPEED_HZ, &spi_speed) < 0) {
         perror("Could not set SPI speed (WR)...ioctl fail");
         break;
       }
       // Устанавливаем скорость для чтения
       if (ioctl(spi_fd, SPI_IOC_RD_MAX_SPEED_HZ, &spi_speed) < 0) {
         perror("Could not set SPI speed (RD)...ioctl fail");
         break;
       }
       // Определяем буфер для записи
       // сюда нужно сохранять данные для передачи
       unsigned char sendbuf[BUFFER_SIZE];
       // Определяем буфер для чтения
       // сюда будут сохранены полученные данные
       unsigned char recvbuf[BUFFER_SIZE];
       // Определяем структуру spi транзакции
       struct spi_ioc_transfer message;
       bzero(&message, sizeof(message));
       // Если есть что передавать, устанавливаем .tx_buf
       message.tx_buf = (unsigned long)sendbuf;
       // Если хотим получить данные, устанавливаем .rx_buf
       message.rx_buf = (unsigned long)recvbuf;
       // Устанавливаем количество того что хотим передать/принять
       message.len = BUFFER_SIZE;
       // Определяем количество бит в слове
       message.bits_per_word = spi_bitsPerWord;
       // Выполняем обмен данными
       if (ioctl(spi_fd, SPI_IOC_MESSAGE(1), &message) < 0) {
         perror("Problem transmitting spi data");
       } else {
         puts("Transmitting spi data succesful");
       }
    } while (0);
    // Закрываем устройство
    if (spi_fd >= 0) {
       close(spi_fd);
    }
    Настройку выполняем однажды, каждый раз не нужно настраивать если параметры не менялись, т.е. запустили приложение, настроили и обмениваемся.
    При обмене подготавливаем данные и выполняем транзакцию.
     
    Последнее редактирование: 21 ноя 2019