Øvelsen: http://mps.iha.dk/mediawiki/index.php/EXERCISE_LDD_TIMER
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.
Øvelsen
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.
IOCTL defineres
Vi kalder ioctl øverst i koden sammen med de andre funktioner. Dernæst defineres den i my_fops. Fil: sysLed_ioctl.c
IOCTL implementeres
Vi implementere ioctl funktionen i driveren for SysLed4. ioctl testes vha. printk i en switch-case. Fil: sysLed_ioctl.c
IOCTL common fil
For at teste ioctl, opretter vi først en common.h, hvori der defineres magic number, som bruges til at reservere en speciel plads til vores driver. Fil: common.h
IOCTL kald testes
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.
SYS_LED4 DRIVER:
Herunder implementeres driveren der vha. timer skal toggle SysLed4.
SysLed4 driveren skrives herunder:
SYS_LED4 DRIVER:
Herunder implementeres driveren der vha. timer skal toggle SysLed4.
SysLed4 driveren skrives herunder:
Tilføj variabel
Variablen timeOut tilføjes:
Timer funktion
Der oprettes en timer funktion kaldet timer_func. Derudover tilføjes en struct.
IOCTL kald
Herunder er koden til ioctl kaldet, som gør at SysLed4 blinker:
Test program
Herunder er vores testprogram: timer_app.c
For at vi kan anvende test programmet skal testprogrammet: timer_app.c kompiles vha. følgende kode linje i terminalen:
For at vi kan anvende test programmet skal testprogrammet: timer_app.c kompiles vha. følgende kode linje i terminalen:
arm-angstrom-linux-gnueabi-g++ -o timer_app timer_app.c
RESULTAT:
Dioden blinkede.
c) Tjek belastning af processor
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.
KOMMENTAR:
Da vi benytter Timer API’en lader vi kernen håndtere Timeren, således at når vi venter bruger vi ikke CPU’en. Hvis vi til gengæld havde brugt en busy-wait metode vil driveren konstant tjekke tiden og derfor optage alt CPU-tid.
No comments:
Post a Comment