Посмотрю если умеет, то как заставить сделать это? накладные расходы, если речь про скорость подготовки данных к выводу Впрочем, интерес на данный момент академический. Цель - выдернуть из wiringPI функции работы с SPI. Но не просто выдернуть, но и разобраться что к чему.
Когда нужно отправить данные в сетевую карту, на подготовку данных потратили какое-то время, затем можем выполнить запись минуя ip стек или можем работать через стек и драйвер. Тут вопросы возникают что использовать? Есть доверие к драйверу или нет? Там работа через драйвер, как вы уже заметили. Выдергивать-то нечего.
На малине загрузился с другого дистра для 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 Скачиваешь образ и не знаешь точно для какой архитектуры. Может я чего-то упустил или не внимательно читал...
Ну как. Там же какие-то параметры передаются ядру - скорость, режим работы, канал. Возможно есть ещё что-то. Я ж под GNU/Linux не прогал ни разу) Всё AVR да MSP.
Открываем устройство как файл через 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); } Настройку выполняем однажды, каждый раз не нужно настраивать если параметры не менялись, т.е. запустили приложение, настроили и обмениваемся. При обмене подготавливаем данные и выполняем транзакцию.