Можно ли под линуксом обрабатывать аппаратные прерывания?

Модератор: Модераторы разделов

MiK13
Сообщения: 1225
ОС: Linux Debian

Можно ли под линуксом обрабатывать аппаратные прерывания?

Сообщение MiK13 »

Начальник решил разрабатывать новое измерительное устройство на базе компьютера 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 нет никакого способа задать функцию, которая бы получила управление при возникновении аппаратного прерывания?
Спасибо сказали:
Aliech
Сообщения: 1037
Статус: дилетант широкого профиля
ОС: debian/gentoo/openbsd

Re: Можно ли под линуксом обрабатывать аппаратные прерывания?

Сообщение Aliech »

Простите, но прерывания и не должны быть доступны в многопользовательской многозадачной ОС из пространства пользователя. И как ты "задашь функцию", которую должно выполнить ядро? Вот как ядро выполнит отдельную функцию из состава какого-то другого кода, загруженного в пространство пользователя? Нет, так не работает.
С уважением,
Павел Алиев
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20999
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Можно ли под линуксом обрабатывать аппаратные прерывания?

Сообщение Bizdelnick »

Aliech писал:
25.10.2021 20:53
И как ты "задашь функцию", которую должно выполнить ядро?
eBPF? Вопрос только, насколько целесообразно его для этого использовать.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Aliech
Сообщения: 1037
Статус: дилетант широкого профиля
ОС: debian/gentoo/openbsd

Re: Можно ли под линуксом обрабатывать аппаратные прерывания?

Сообщение Aliech »

Bizdelnick писал:
25.10.2021 21:31
eBPF? Вопрос только, насколько целесообразно его для этого использовать.
Да, я как-то стараюсь не вспоминать, что они JIT в ядро втащили...
С уважением,
Павел Алиев
Спасибо сказали:
MiK13
Сообщения: 1225
ОС: Linux Debian

Re: Можно ли под линуксом обрабатывать аппаратные прерывания?

Сообщение MiK13 »

Aliech писал:
25.10.2021 20:53
Простите, но прерывания и не должны быть доступны в многопользовательской многозадачной ОС из пространства пользователя. И как ты "задашь функцию", которую должно выполнить ядро?
А в чём проблема?
Я же могу, например, открыть файл /dev/ttySn и моя программа будет получать информацию когда по COM-порту что-то придёт. При этом только одна программа сможет открыть этот файл.
В данном случае у меня задача даже проще. Как только произойдёт прерывание, должна запуститься (или продолжить работу) некая программа, которая обработает принятые данные. При этом время реакции не должно превышать нескольких десятков микросекунд.
И в данном случае система хотя и многопользовательская, но пользователь у неё только один -- root.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20999
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Можно ли под линуксом обрабатывать аппаратные прерывания?

Сообщение Bizdelnick »

MiK13 писал:
26.10.2021 01:08
А в чём проблема?
Да нет проблемы. Вам всего лишь надо написать модуль, который будет делать то, что Вам надо.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Aliech
Сообщения: 1037
Статус: дилетант широкого профиля
ОС: debian/gentoo/openbsd

Re: Можно ли под линуксом обрабатывать аппаратные прерывания?

Сообщение Aliech »

MiK13 писал:
26.10.2021 01:08
А в чём проблема?
Проблема в непонимании архитектурных особенностей ОС и того, как же оно на самом деле там работает...

Есть даже целый класс ОС, которые нацелены именно на "поступило прерывание - срочно делаем дело", - ОС реального времени, конечно же. Linux с ними общего ничего не имеет.

И да, когда трогаете /dev/ttySn, - вы не представляете, насколько далеки в этот момент от реального железа. От прерывания, которое случится, от "дырки" памяти, через которое будут считываться данные...

А так, Bizdelnick, дело предложил, относительно модуля. Но мне кажется, что можно ещё проще решить. Так как подозреваю, что вы поставили задачу не верно. Опишите, пожалуйста, как вы в данный момент дожидаетесь поступления данных на интерфейс?
С уважением,
Павел Алиев
Спасибо сказали:
MiK13
Сообщения: 1225
ОС: Linux Debian

Re: Можно ли под линуксом обрабатывать аппаратные прерывания?

Сообщение MiK13 »

Aliech писал:
26.10.2021 02:32
Есть даже целый класс ОС, которые нацелены именно на "поступило прерывание - срочно делаем дело", - ОС реального времени, конечно же.
Я это знаю. К сожалению приходится работать не с тем, что "теоретически где-то существует", а с тем, что получается достать. И с тем, с чем уже есть опыт работы.
Aliech писал:
26.10.2021 02:32
И да, когда трогаете /dev/ttySn, - вы не представляете, насколько далеки в этот момент от реального железа. От прерывания, которое случится, от "дырки" памяти, через которое будут считываться данные...
В целом конечно не представляю. Но понимаю, что там очень большая цепочка. Учитывая, что он может работать в самых разных режимах.
Aliech писал:
26.10.2021 02:32
А так, Bizdelnick, дело предложил, относительно модуля.
Я понимаю, что это, скорее всего, самый оптимальный вариант. Но, к сожалению, никто у нас модули не делал.
Aliech писал:
26.10.2021 02:32
Но мне кажется, что можно ещё проще решить. Так как подозреваю, что вы поставили задачу не верно. Опишите, пожалуйста, как вы в данный момент дожидаетесь поступления данных на интерфейс?
Вся сложность в том, что я сам до конца не представляю всю структуру.
Есть компьютер Zynq от Xilix. Там стоит какой-то процессор ARM (программы, транслированные arm-linux-gnueabihf-gcc работают нормально) и ещё есть ПЛИС, на которой предполагается реализовать ряд алгоритмов обработки.
Начальник хочет, раз процессор двухъядерный, чтобы на одном ядре работал Linux, а на другом -- программа реального времени. Я пока не представляю как это сделать. ПЛИС (FPGA) получается данные от другого устройства по каналу DMA и по завершении приёма данных должна выставить прерывание, чтобы другая программа (уже в процессоре) обработала эти данные и выдала результат обработки в сеть.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20999
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Можно ли под линуксом обрабатывать аппаратные прерывания?

Сообщение Bizdelnick »

MiK13 писал:
26.10.2021 19:48
к сожалению, никто у нас модули не делал
Всё когда-то бывает в первый раз.

Гляньте, может, это Вас заинтересует. Я особо не вникал, да и из Вашего описания плохо понял, какие у Вас потребности.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
MiK13
Сообщения: 1225
ОС: Linux Debian

Re: Можно ли под линуксом обрабатывать аппаратные прерывания?

Сообщение MiK13 »

Bizdelnick писал:
26.10.2021 20:18
Гляньте, может, это Вас заинтересует.
Большое спасибо!
Завтра на работе попробую собрать и потом на основе этого что-нибудь своё сделать.
Спасибо сказали:
Aliech
Сообщения: 1037
Статус: дилетант широкого профиля
ОС: debian/gentoo/openbsd

Re: Можно ли под линуксом обрабатывать аппаратные прерывания?

Сообщение Aliech »

MiK13 писал:
26.10.2021 19:48
Начальник хочет, раз процессор двухъядерный, чтобы на одном ядре работал Linux, а на другом -- программа реального времени. Я пока не представляю как это сделать. ПЛИС (FPGA) получается данные от другого устройства по каналу DMA и по завершении приёма данных должна выставить прерывание, чтобы другая программа (уже в процессоре) обработала эти данные и выдала результат обработки в сеть.
Любая хотелка может порезаться об "это так не работает". Программа в пространстве пользователя не увидит прерывание никогда. Придётся писать модуль, чтобы он оповещал что-то в пространстве пользователя об получении прерывания.

Максимум, на что получается рассчитывать, - это запустить linux с rt-патчсетом, на одно из ядер жёстко прибить задачу, выдать ей максимальный приоритет.

И это не считая необходимости проработать вопрос доступа логики из ПЛИСа в пространство памяти, доступное CPU.
С уважением,
Павел Алиев
Спасибо сказали:
MiK13
Сообщения: 1225
ОС: Linux Debian

Re: Можно ли под линуксом обрабатывать аппаратные прерывания?

Сообщение MiK13 »

MiK13 писал:
26.10.2021 19:48
Начальник хочет, раз процессор двухъядерный, чтобы на одном ядре работал Linux, а на другом -- программа реального времени.
Оказывается этот вывод сделан на основе статьи из журнала «Современная электроника» №1 за 2013 год.
Там, в частности, написано:
В несимметричной конфигурации каждый из процессоров (ядер) выполняет свою операционную систему при разделении физической памяти.
И ещё:
Обычной практикой является размещение на одном из ядер операционной системы общего назначения ОС Linux, а на втором ядре – ОСРВ, например, FreeRTOS, или QNX, или приложения, выполняемого без операционной системы
Правда, я пока не знаю, на каком уровне может выбираться несимметричная (AMP) или симметричная (SMP) многопроцессорная конфигурация.
Спасибо сказали:
MiK13
Сообщения: 1225
ОС: Linux Debian

Re: Можно ли под линуксом обрабатывать аппаратные прерывания?

Сообщение MiK13 »

Bizdelnick писал:
26.10.2021 20:18
Гляньте, может, это Вас заинтересует. Я особо не вникал, да и из Вашего описания плохо понял, какие у Вас потребности.
Возникла потребность быстро получать данные по каналу DMA, обрабатывать их и передавать в сеть.
Так, что модуль xilinx_axidma мог бы в этом очень помочь.
После ряда разных попыток удалось создать файл axidma.ko и

Shell

$ make
make: Цель «all» не требует выполнения команд.
Но возник вопрос: как добавить этот модуль в Petalinux?
Скопировал 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
То есть никакого устроства dma не появилось.
И тестовый пример выдал:

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.
То есть этому тесту нужно устройство /dev/axidma. Но его нет. Какая может быть причина?

В dmesg после попытки установить axidma появляется строка
axidma: loading out-of-tree module taints kernel.
Спасибо сказали: