Formål
I en device driver ønsker vi nogle gange
at foretage noget autonomt, uden at vi tilgår denne, eks vha read / write. Et
godt eksempel kunne være en driver som henter værdier fra en A/D konverter med
et fast interval og gemmer værdierne i en fifo buffer. User space applikationen
kan herved læse en mængde samples ad gangen og ikke have nær så stramme
tidskrav, som hvis der skulle læses én sample ad gangen. Dette vil øge den
præcisionen af samplingstidspunktet.
I denne øvelse skal vi lave en tilføjelse til vores eksisterende SYS_LED4 GPIO driver. Vha et ioctl kald skal det være muligt at sætte LED'en til at toggle med et fast interval.
I denne øvelse skal vi lave en tilføjelse til vores eksisterende SYS_LED4 GPIO driver. Vha et ioctl kald skal det være muligt at sætte LED'en til at toggle med et fast interval.
Du vil komme til at lære om:
§
IOCTL kald
§
Kernel Timers
§
Kernel Interrupts
§
Blocking I/O
I den oprindelige SYS_LED4 driver skrev vi
til driveren via en device fil /dev/sys_led4, hvorved write metoden for driven
blev kaldt således at vi kunne tænde og slukke for LED'en. Opgaven er denne
gang at gøre det muligt at få SYS_LED4 til at starte med at blinke med en specifik
frekvens. Det vil vi opnå ved at tilføje 2 ioctl kald til hhv at starte/stoppe
for at LED'en blinker og til at styre den frekvens den skal blinke med.
a) Implementer ioctl kald
Start med at implementere et ioctl kald i driveren og en lille tilhørende
testapplikation. Du kan i driveren evt blot udskrive til kernen ved hjælp af
printk(), når en given IOCTL funktion kaldes.
Sysled_4.c: addition to the created code in lab 5
Note: remember to include common.h
UserSpaceApp.c:
Common.h:
By running dmesg after insmod and mknod:
b) Implementer toggler
Implementer en periodisk timer til at styre et SYS_LED4. Det indbefatter både
det at starte/stoppe timeren og styre den frekvens.
Sysled_4.c:
Note: SYS_LED4_UNLOCKED_ioctl included to fops
UserSpaceApp.c:
Common.h:
By running dmesg:
c) Når det virker, kan du prøve at køre
”top” fra linux prompten og check hvor belastet processoren er. Prøv at ændre
din implementation til at bruge en busy-wait metode og se hvad der sker ifht processor
belastningen.
The processor is
not very much loaded (about 3%) when the timer "sleeps" in the second
we choose. However, if you do busywait with mdelay (), the processor is much
more congested.
Ingen kommentarer:
Send en kommentar