Přerušení v Linuxu

jfila

Přerušení v Linuxu
« kdy: 23. 07. 2020, 06:27:40 »
Jak je to s přerušením v Linuxu? Můžete prosím i přiložit příklad zdrojáku? Očekával bych že vektory přerušení povedou do Kernelu a ten pak zavolá uživatelský program, je to tak? Musím se ale k "odběru" této události nějakým způsobem "přihlásit". Například RasPi a GPIO PIN.



RDa

  • *****
  • 989
    • Zobrazit profil
    • E-mail
Re:Přerušení v Linuxu
« Odpověď #2 kdy: 23. 07. 2020, 13:59:19 »
Obsluhovat preruseni v userspace je jen takova iluze / abstrakce, aby se nereklo. Bude to mit nejake latence, ktere musite vykryt napr. bufferovanim dat v one externi periferii. Hodi se to leda k cekani a aktivni probouzeni na ojedinelou udalost, ale aby nekdo s tim delal realnou obsluhu zarizeni, na to to uz nebude.

jfila

Re:Přerušení v Linuxu
« Odpověď #3 kdy: 23. 07. 2020, 18:12:34 »
Ano to je mi jasné, že tím nebude možné měřit čas v nanosekundách. Ale na občasné probuzení a vyčtení bufferu nějaký rozptyl nevadí.

borekz

  • ****
  • 472
    • Zobrazit profil
    • E-mail
Re:Přerušení v Linuxu
« Odpověď #4 kdy: 24. 07. 2020, 05:26:44 »
Pokud jde o vyčtení bufferu v přerušení a předání do aplikace, tak myslím, že v Linuxu se to obvykle řeší čtením souboru /dev/{fiktivní soubor implementovaný v kernel driveru}.


jfila

Re:Přerušení v Linuxu
« Odpověď #5 kdy: 24. 07. 2020, 08:33:23 »
Pokud jde o vyčtení bufferu v přerušení a předání do aplikace, tak myslím, že v Linuxu se to obvykle řeší čtením souboru /dev/{fiktivní soubor implementovaný v kernel driveru}.
Ano to chápu, ale toto je jiný případ. Například mám po SPI připojen řadič a náhodně mě chodí data, je zbytečné neustále posílat dotaz, zda je něco v bufferu, když řadič má int PIN.

Re:Přerušení v Linuxu
« Odpověď #6 kdy: 24. 07. 2020, 11:36:16 »
Linuxový zdroják je veřejný. Přerušení se tam používá v driverech na spoustě míst. Příklad použití jde vidět snadno třeba u nějakých krátkých driverů jako je třeba tento.

https://elixir.bootlin.com/linux/latest/source/drivers/input/touchscreen/mk712.c

Re:Přerušení v Linuxu
« Odpověď #7 kdy: 24. 07. 2020, 12:44:07 »
Pokud jde o vyčtení bufferu v přerušení a předání do aplikace, tak myslím, že v Linuxu se to obvykle řeší čtením souboru /dev/{fiktivní soubor implementovaný v kernel driveru}.
Ano to chápu, ale toto je jiný případ. Například mám po SPI připojen řadič a náhodně mě chodí data, je zbytečné neustále posílat dotaz, zda je něco v bufferu, když řadič má int PIN.

Pokud na to driver není hotový, tak bude potřeba si driver napsat, alespoň nějaký minimální. A když už se člověk maže se základním driverem (a obranou kernelu proti out-of-tree driverům, prakticky asi bude potřeba si zkompilovat především celý kernel ze zdrojáků, a pak tam svůj driver naroubovat do stromu) tak bych rovnou veškerý bit-banging nechal v kernelovém driveru, vůči user space pak stačí jenom obsluhovat syscally... zrovna u SPI asi nestačí read() a write(), spíš nějaké to ioctl() - protože ta sběrnice není "jednoduchá roura".

Linux má koukám jakousi generickou podporu pro SPI, standardní API do user space i uvnitř kernel space. Dokonce ve zdrojákách vidím modul zvaný spi-bitbang. Tzn. máte k dispozici generické vyšší vrstvy, rozhraní do user space je hotové, máte k dispozici knihovnu bitbanging rutin, jenom si musíte dopsat svůj relativně lehký modulek, který to všecko slepí dohromady a parametrizuje na Vaši mapu GPIO pinů v RPi. Ve vanilce je několik modulů, které bitbanging knihovničku využívají = můžete použít jako example. Viz Kconfig, hledejte výskyty "select SPI_BITBANG".

Spíš mě ale zaráží, našel jsem zmínky, že RPi obsahuje hardwarový SPI řadič, tam pak samozřejmě bitbanging není potřeba, ale: copak k tomu není dávno hotový driver? Neválí se něco hotového na Githubu? Nebo je to použité=zabrané na nějaké režijní účely? Nejsem znalcem RPi...

jfila

Re:Přerušení v Linuxu
« Odpověď #8 kdy: 24. 07. 2020, 13:03:02 »
Děkuji mrknu na to. Raspberry Pi má SPI a modul lze normálně používat, také mám v plánu to využít, ale potřeboval jsem to přerušení.

RDa

  • *****
  • 989
    • Zobrazit profil
    • E-mail
Re:Přerušení v Linuxu
« Odpověď #9 kdy: 24. 07. 2020, 13:58:26 »
Pokud jde o vyčtení bufferu v přerušení a předání do aplikace, tak myslím, že v Linuxu se to obvykle řeší čtením souboru /dev/{fiktivní soubor implementovaný v kernel driveru}.
Ano to chápu, ale toto je jiný případ. Například mám po SPI připojen řadič a náhodně mě chodí data, je zbytečné neustále posílat dotaz, zda je něco v bufferu, když řadič má int PIN.

Pokud na to driver není hotový, tak bude potřeba si driver napsat, alespoň nějaký minimální. A když už se člověk maže se základním driverem (a obranou kernelu proti out-of-tree driverům, prakticky asi bude potřeba si zkompilovat především celý kernel ze zdrojáků, a pak tam svůj driver naroubovat do stromu) tak bych rovnou veškerý bit-banging nechal v kernelovém driveru, vůči user space pak stačí jenom obsluhovat syscally... zrovna u SPI asi nestačí read() a write(), spíš nějaké to ioctl() - protože ta sběrnice není "jednoduchá roura".

Linux má koukám jakousi generickou podporu pro SPI, standardní API do user space i uvnitř kernel space. Dokonce ve zdrojákách vidím modul zvaný spi-bitbang. Tzn. máte k dispozici generické vyšší vrstvy, rozhraní do user space je hotové, máte k dispozici knihovnu bitbanging rutin, jenom si musíte dopsat svůj relativně lehký modulek, který to všecko slepí dohromady a parametrizuje na Vaši mapu GPIO pinů v RPi. Ve vanilce je několik modulů, které bitbanging knihovničku využívají = můžete použít jako example. Viz Kconfig, hledejte výskyty "select SPI_BITBANG".

Spíš mě ale zaráží, našel jsem zmínky, že RPi obsahuje hardwarový SPI řadič, tam pak samozřejmě bitbanging není potřeba, ale: copak k tomu není dávno hotový driver? Neválí se něco hotového na Githubu? Nebo je to použité=zabrané na nějaké režijní účely? Nejsem znalcem RPi...

Ale tazatel nechce implementovat samotne SPI, ale dodatecny notifikacni mechanizmus vyuzivajici preruseni - jakozto optimalni reseni vuci amaterismum typu busy-loop a polling! Samozrejme ze RPI ma hw SPI a linux ma sve genericke SPI API.

Re:Přerušení v Linuxu
« Odpověď #10 kdy: 24. 07. 2020, 15:41:31 »
Ale tazatel nechce implementovat samotne SPI, ale dodatecny notifikacni mechanizmus vyuzivajici preruseni - jakozto optimalni reseni vuci amaterismum typu busy-loop a polling! Samozrejme ze RPI ma hw SPI a linux ma sve genericke SPI API.
Já pořád nerozumím tomu, proč by měl v userlandu dělat polling.

Přijde mi, že se OP ptá z prostředka: má nějaký problém, vymyslel pro něj řešení, které neumí implementovat* a chtěl by s tou implementací pomoct. IMHO by bylo lepší, kdyby nastínil ten původní problém, třeba pro něj existuje nějaké jiné, standardní řešení.

Např. pokud by původní problém byl v tom, že nějaký hardware pomocí SPI pushuje hodnoty v nepravidelných intervalech a on na ně chce reagovat (soft)realtime, tak nepotřebuje žádné interrupty, bohatě mu stačí blokující znakové zařízení...

* to není kritika!

mhi

  • ***
  • 215
    • Zobrazit profil
Re:Přerušení v Linuxu
« Odpověď #11 kdy: 24. 07. 2020, 16:09:57 »
Celkem standardni reseni je naprogramovat kernel driver; neni k tomu treba modifikovat kernel tree, driver jde odladit i uplne mimo nej, samozrejme za predpokladu ze z toho bude modul. Neni to az tak slozite, jak se na prvni pohled zda, hlavne kdyz clovek vystaci s nejakym existujicim prikladem - pak neni ani nutne nejak hluboce studovat ruzne locking mechanismy, apod.

Fungovat to pak muze treba tak, ze komunikuju s driverem pres read/write/ioctl bez nejake nutnosti resit realtimovost (tzn. mereni casu probiha v KERNELu, ne userspace).

RDa

  • *****
  • 989
    • Zobrazit profil
    • E-mail
Re:Přerušení v Linuxu
« Odpověď #12 kdy: 24. 07. 2020, 18:03:20 »
Např. pokud by původní problém byl v tom, že nějaký hardware pomocí SPI pushuje hodnoty v nepravidelných intervalech a on na ně chce reagovat (soft)realtime, tak nepotřebuje žádné interrupty, bohatě mu stačí blokující znakové zařízení...

SPI i I2C jsou master/slave zbernice, a jinak nez pollingem se s takovyma periferiema neda bavit. Pokud chce zarizeni neco rict, muze trpelive mlcet, az dostane slovo (polling), nebo se ozvat dodatecnym, out of band, signalem - prerusenim, na zaklade cehoz vyvola pozornost mastera aby ho zkontroloval.

Blokujici zarizeni se da vytvorit jedine napsanim ovladace konkretni periferie (konkretniho cipu).

Tazatel chce jenom implementovat "user space driver", protoze vyvoj a ladeni je mnohokrat jednodussi. Pokud je srozumen s reakcni dobou / latencema a nevadi to dane aplikaci, tak bych to taky tak preferoval.

_Jenda

  • ****
  • 433
    • Zobrazit profil
    • https://jenda.hrach.eu/
    • E-mail
Re:Přerušení v Linuxu
« Odpověď #13 kdy: 24. 07. 2020, 18:34:28 »
Děkuji mrknu na to. Raspberry Pi má SPI a modul lze normálně používat, také mám v plánu to využít, ale potřeboval jsem to přerušení.
No tak třeba v RPi pythoní knihovně je na to funkce GPIO.wait_for_edge.

Re:Přerušení v Linuxu
« Odpověď #14 kdy: 24. 07. 2020, 18:43:19 »
SPI i I2C jsou master/slave zbernice, a jinak nez pollingem se s takovyma periferiema neda bavit. Pokud chce zarizeni neco rict, muze trpelive mlcet, az dostane slovo (polling), nebo se ozvat dodatecnym, out of band, signalem - prerusenim, na zaklade cehoz vyvola pozornost mastera aby ho zkontroloval.
Jasne, ale tohle je/bude v jádře, ne v userspace.

Blokujici zarizeni se da vytvorit jedine napsanim ovladace konkretni periferie (konkretniho cipu).

Tazatel chce jenom implementovat "user space driver", protoze vyvoj a ladeni je mnohokrat jednodussi. Pokud je srozumen s reakcni dobou / latencema a nevadi to dane aplikaci, tak bych to taky tak preferoval.
Těžko může implementovat jenom "user space driver", když chce funkcionalitu, kterou žádný (?) existující kernel driver nemá.