Начальник решил разрабатывать новое измерительное устройство на базе компьютера Zynq от Xilinx. Там процессор ARM с двумя ядрами и FPGA. Система -- Petalinux.
После установки кросс-компиляторов для ARM под Debian 11 получается делать простые программы для этой системы. В том числе и по управлению интерфейсами SPI и GPIO (пока ещё не до конца разобрался -- через /dev/gpio* кое-что получается, но напрямую нет).
Но нужно ещё и обрабатывать прерывания. То есть когда АЦП закончит работу, он должен выставить сигнал прерывания, чтобы отдельной программой обработать данные.
В 16-м уроке на Youtube "FPGA SoC Zynq 7000 (lesson 16): Linux for Zynq 7000, AXI GPIO example" Алексей Ростов говорит, что из пространства пользователя получить доступ к прерыванию невозможно. И что единственный способ -- постоянно опрашивать флаг состояния.
Но неужели в Linux нет никакого способа задать функцию, которая бы получила управление при возникновении аппаратного прерывания?
Можно ли под линуксом обрабатывать аппаратные прерывания?
Модератор: Модераторы разделов
-
- Сообщения: 1225
- ОС: Linux Debian
-
- Сообщения: 1037
- Статус: дилетант широкого профиля
- ОС: debian/gentoo/openbsd
Re: Можно ли под линуксом обрабатывать аппаратные прерывания?
Простите, но прерывания и не должны быть доступны в многопользовательской многозадачной ОС из пространства пользователя. И как ты "задашь функцию", которую должно выполнить ядро? Вот как ядро выполнит отдельную функцию из состава какого-то другого кода, загруженного в пространство пользователя? Нет, так не работает.
С уважением,
Павел Алиев
Павел Алиев
-
- Модератор
- Сообщения: 20999
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Можно ли под линуксом обрабатывать аппаратные прерывания?
eBPF? Вопрос только, насколько целесообразно его для этого использовать.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 1037
- Статус: дилетант широкого профиля
- ОС: debian/gentoo/openbsd
Re: Можно ли под линуксом обрабатывать аппаратные прерывания?
Да, я как-то стараюсь не вспоминать, что они JIT в ядро втащили...Bizdelnick писал: ↑25.10.2021 21:31eBPF? Вопрос только, насколько целесообразно его для этого использовать.
С уважением,
Павел Алиев
Павел Алиев
-
- Сообщения: 1225
- ОС: Linux Debian
Re: Можно ли под линуксом обрабатывать аппаратные прерывания?
А в чём проблема?
Я же могу, например, открыть файл /dev/ttySn и моя программа будет получать информацию когда по COM-порту что-то придёт. При этом только одна программа сможет открыть этот файл.
В данном случае у меня задача даже проще. Как только произойдёт прерывание, должна запуститься (или продолжить работу) некая программа, которая обработает принятые данные. При этом время реакции не должно превышать нескольких десятков микросекунд.
И в данном случае система хотя и многопользовательская, но пользователь у неё только один -- root.
-
- Модератор
- Сообщения: 20999
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Можно ли под линуксом обрабатывать аппаратные прерывания?
Да нет проблемы. Вам всего лишь надо написать модуль, который будет делать то, что Вам надо.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 1037
- Статус: дилетант широкого профиля
- ОС: debian/gentoo/openbsd
Re: Можно ли под линуксом обрабатывать аппаратные прерывания?
Проблема в непонимании архитектурных особенностей ОС и того, как же оно на самом деле там работает...
Есть даже целый класс ОС, которые нацелены именно на "поступило прерывание - срочно делаем дело", - ОС реального времени, конечно же. Linux с ними общего ничего не имеет.
И да, когда трогаете /dev/ttySn, - вы не представляете, насколько далеки в этот момент от реального железа. От прерывания, которое случится, от "дырки" памяти, через которое будут считываться данные...
А так, Bizdelnick, дело предложил, относительно модуля. Но мне кажется, что можно ещё проще решить. Так как подозреваю, что вы поставили задачу не верно. Опишите, пожалуйста, как вы в данный момент дожидаетесь поступления данных на интерфейс?
С уважением,
Павел Алиев
Павел Алиев
-
- Сообщения: 1225
- ОС: Linux Debian
Re: Можно ли под линуксом обрабатывать аппаратные прерывания?
Я это знаю. К сожалению приходится работать не с тем, что "теоретически где-то существует", а с тем, что получается достать. И с тем, с чем уже есть опыт работы.
В целом конечно не представляю. Но понимаю, что там очень большая цепочка. Учитывая, что он может работать в самых разных режимах.
Я понимаю, что это, скорее всего, самый оптимальный вариант. Но, к сожалению, никто у нас модули не делал.
Вся сложность в том, что я сам до конца не представляю всю структуру.
Есть компьютер Zynq от Xilix. Там стоит какой-то процессор ARM (программы, транслированные arm-linux-gnueabihf-gcc работают нормально) и ещё есть ПЛИС, на которой предполагается реализовать ряд алгоритмов обработки.
Начальник хочет, раз процессор двухъядерный, чтобы на одном ядре работал Linux, а на другом -- программа реального времени. Я пока не представляю как это сделать. ПЛИС (FPGA) получается данные от другого устройства по каналу DMA и по завершении приёма данных должна выставить прерывание, чтобы другая программа (уже в процессоре) обработала эти данные и выдала результат обработки в сеть.
-
- Модератор
- Сообщения: 20999
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Можно ли под линуксом обрабатывать аппаратные прерывания?
Всё когда-то бывает в первый раз.
Гляньте, может, это Вас заинтересует. Я особо не вникал, да и из Вашего описания плохо понял, какие у Вас потребности.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Спасибо сказали:
-
- Сообщения: 1225
- ОС: Linux Debian
Re: Можно ли под линуксом обрабатывать аппаратные прерывания?
Большое спасибо!
Завтра на работе попробую собрать и потом на основе этого что-нибудь своё сделать.
-
- Сообщения: 1037
- Статус: дилетант широкого профиля
- ОС: debian/gentoo/openbsd
Re: Можно ли под линуксом обрабатывать аппаратные прерывания?
Любая хотелка может порезаться об "это так не работает". Программа в пространстве пользователя не увидит прерывание никогда. Придётся писать модуль, чтобы он оповещал что-то в пространстве пользователя об получении прерывания.MiK13 писал: ↑26.10.2021 19:48Начальник хочет, раз процессор двухъядерный, чтобы на одном ядре работал Linux, а на другом -- программа реального времени. Я пока не представляю как это сделать. ПЛИС (FPGA) получается данные от другого устройства по каналу DMA и по завершении приёма данных должна выставить прерывание, чтобы другая программа (уже в процессоре) обработала эти данные и выдала результат обработки в сеть.
Максимум, на что получается рассчитывать, - это запустить linux с rt-патчсетом, на одно из ядер жёстко прибить задачу, выдать ей максимальный приоритет.
И это не считая необходимости проработать вопрос доступа логики из ПЛИСа в пространство памяти, доступное CPU.
С уважением,
Павел Алиев
Павел Алиев
-
- Сообщения: 1225
- ОС: Linux Debian
Re: Можно ли под линуксом обрабатывать аппаратные прерывания?
Оказывается этот вывод сделан на основе статьи из журнала «Современная электроника» №1 за 2013 год.
Там, в частности, написано:
И ещё:В несимметричной конфигурации каждый из процессоров (ядер) выполняет свою операционную систему при разделении физической памяти.
Правда, я пока не знаю, на каком уровне может выбираться несимметричная (AMP) или симметричная (SMP) многопроцессорная конфигурация.Обычной практикой является размещение на одном из ядер операционной системы общего назначения ОС Linux, а на втором ядре – ОСРВ, например, FreeRTOS, или QNX, или приложения, выполняемого без операционной системы
-
- Сообщения: 1225
- ОС: Linux Debian
Re: Можно ли под линуксом обрабатывать аппаратные прерывания?
Возникла потребность быстро получать данные по каналу DMA, обрабатывать их и передавать в сеть.Bizdelnick писал: ↑26.10.2021 20:18Гляньте, может, это Вас заинтересует. Я особо не вникал, да и из Вашего описания плохо понял, какие у Вас потребности.
Так, что модуль xilinx_axidma мог бы в этом очень помочь.
После ряда разных попыток удалось создать файл axidma.ko и
Shell
$ make
make: Цель «all» не требует выполнения команд.
Скопировал axidma.ko в каталог, где есть файлы .ko,
Добавил, по аналогии, строку axidma.ko: в файл /lib/modules/4.14.0-xilinx-v2018.2/modules.dep
Но после reboot и входа в систему:
Shell
root@petalinux:~# lsmod
Not tainted
uio_pdrv_genirq 16384 0 - Live 0xbf000000
root@petalinux:~# modprobe axidma.ko
root@petalinux:~# lsmod
Tainted: G
axidma 28672 0 - Live 0xbf008000 (O)
uio_pdrv_genirq 16384 0 - Live 0xbf000000
root@petalinux:~# ls -l /dev/*dma*
crw------- 1 root root 10, 62 Dec 3 01:06 /dev/cpu_dma_latency
И тестовый пример выдал:
Shell
# ./axidma_benchmark
AXI DMA Benchmark Parameters:
Transmit Buffer Size: 7.91 MiB
Receive Buffer Size: 7.91 MiB
Number of DMA Transfers: 1000 transfers
Error opening AXI DMA device: No such file or directory
Expected the AXI DMA device at the path `/dev/axidma`
Failed to initialize the AXI DMA device.
В dmesg после попытки установить axidma появляется строка
axidma: loading out-of-tree module taints kernel.