Linux Kernel teori/programmeringsfråga.

Permalänk
Medlem

Linux Kernel teori/programmeringsfråga.

Tja jag tänkte att det var lika bra att fråga här då det har mer med Linux teori än ren programmering.

Jo det är så här att jag skall interfaca generella portar på min dator. Men jag har lite problem med att förstå mig på det hela.

I detta exempel så är det bara en knapp(brytare) jag skall koppla in på nån av ingångarna.

I kernelspace så får man använda IRQ,DMA och diverse sleep funktioner när man programmerar. Javisst detta är ju jätte bra. När jag väljer att skriva en drivrutin så kan jag välja att antingen skriva en charachter device eller en blockdevice. Eftersom jag i kernelspace får använda avbrott så behöver jag inte ligga och polla ingången utan jag kan använda mig av avbrott som hårdvaran genererar.

Jag bestämmer mig nu för att det är en character device jag vill skriva en drivrutin för.

Jag skriver min drivrutin som använder sig av avbrott då denna porten har tillgång till ett externt avbrott.

Det interesanta här nu som jag inte lyckas hitta nån information om är hur jag i userspace kan sitta och läsa av charachter device utan att sno en massa cpu tid. Eftersom jag i userspace inte har tillgång till interrupts så måste jag ju ligga och polla charachter devicen efter ny information och jag får ett program som tar en massa onödig cputid.

Jag skulle kunna använda mig av sleep i userspace, men då finns det ju en chans att jag missar information som skickas på charachter devicen.

Så frågan är hur skriver jag ett userspace program som går ner i sleep och vaknar till liv när det finns ny data att hämta från devicen.

När jag höll på med client serverprogrammering så kunde man sätta om man ville ha blocking mode eller streaming mode där blocking mode satte processen i sleep tills det fanns något att läsa frånsocketn. Detta borde betydda att mitt lilla problem är lösbart. Iofs så är ju eth0 en blockdevice skulle jag gissa.

Jag vet inte om det är nått fundamentalt jag missat efter att ha läst sida upp och sida ner när jag läst om hur man skriver linux drivrutiner. För jag tror inte att man använder massa usleep i userspace för att sitta och läsa av en device, känns som om man skulle slösa en massa resurser då.

Finns det nån linux guru som kan hjalpa mig på traven ?

Visa signatur

sega arkad maskin med 2 analoga joyar 16 knappar, 30" monitor. Neo geo 6 slotars som dunkar ski**n ur din PC!

Permalänk
Medlem

select(2) kanske kan vara användbart?

Permalänk
Medlem

Hmm det skulle vara om man kan får select att vänta oändligt länge isf.
Då dett kan komma en insignal inom 1 sekund eller 100år. Iofs borde ju select returnera nått värde efter om den timar out utan ett värde ändras på devicen isf så skulle man ku kunna körs med en while(1) loop. Får ta och läsa igenom man filen mycket noggrant.

Visa signatur

sega arkad maskin med 2 analoga joyar 16 knappar, 30" monitor. Neo geo 6 slotars som dunkar ski**n ur din PC!

Permalänk
Medlem

http://man.he.net/man2/select

Exemplet förklar ganska bra hur det hela går till. Du kan använda NULL som timeout-värde och i så fall väntar select tills din dator krashar.

Permalänk
Medlem

Kan du inte ha en get-funktion i din drivrutin som programmet anropar och "fastnar i" tills det kommer data.

Permalänk
Medlem

Njae det är inte i själva drivrutinen jag har problem då hårdvaran använder sig av interrupts.

Däremot så förstår jag ej teorin bakom hur ett program i userspace klarar av att läsa data från en device utan att polla. Men signal verkar ju vara mycket trevligt, skulle vara interesant att veta hur den fungerar mer ingående.

Visa signatur

sega arkad maskin med 2 analoga joyar 16 knappar, 30" monitor. Neo geo 6 slotars som dunkar ski**n ur din PC!