[linux-ileri] Re: Seri porttan interrupt

---------

From: Serdar KÖYLÜ (serdarkoylu@fisek.com.tr)
Date: Mon 11 Aug 2003 - 15:01:28 EEST

  • Next message: Görkem Çetin: "[linux-ileri] 2.6 Qekirde=F0inde=20g=FCvenlik?="

    Selamlar..

    fcntl ile seri port cihazini asenkron kullanin. Temelde tty IO lari
    kernel tarafindan buffering icin kullanilir. Bu yuzden user space'den
    erismek dogru degildir.

    Cihazi asenkron acarsaniz, daha sonra SIGIO gibi sinyalleri beklersiniz.
    Seri porta bilgi geldiginde veya port bilgi gondermeye hazir oldugunda
    size bir sinyal gelir. Sizde bu sinyalin handleri icinde gerekeni
    yaparsiniz.

    Asenkron I/O ve non-blocking konularini inceleyin. fcntl ile bir dosyayi
    asenkron calisir hale getirirseniz, read dediginizde sizi bilgiyi
    almaniz icin beklemez, EAGAIN ile doner cabucak. Bilgi alinacak kadar
    hazir olunca, SIGIO sinyali yollanmasini saglar:

    #define FASYNC O_NONBLOCK | O_APPEND

    fcntl(fd, F_SETOWN, getpid());
    fcntl(fd, F_SETFL, FASYNC);

    Boylece portu asenkron I/O yaptik. Seri port oldugu iicn kafaniz
    karismasin. Asenkron UART'lar kernelin isi. Bizim icin bu bir cihaz.
    Dahasi bir soket veya dosya da olabilir, diskin okumasini beklemekle
    vakit kaybetmezsiniz. Simdi porttan bilgi bekleyelim:

    int bekle;

    int main(...)
    {
    bekle = 1;
    while (cik==0) {
    . sleep(1); /* Uyusunda buyusun demeyeceksiniz boyle elbet.
    Burada diger islerinizi yapabilirsiniz */
    . if (bekle==0) {
    . bytes = read(fd,buf,1024);
    . buf[bytes]=0;
    . printf("%d bytes alindi iste onlar: %s\n", bytes, buf);
    . if (falancafilanca) cik=1;
    . bekle = 1; /* bir sonraki girdiyi bekle */
    . }
    . }
    }

    Simdide bir signal handler:

    void signal_handler_Serial_IO (int status)
    {
      printf("Birileri bize bir seyler yolluyor..\n");
      bekle = 1;
    }

    Elbette signal handleri set edeceksiniz, termios struct ile port hizini
    vs. ayarlayacaksiniz vs. vs. Tek fark, read ile okumuyorsunuz. Portu
    kendi basina birakiyorsunuz. Porta bilgi gelince sinyal sizi
    uyandiriyor. Bizim kodumuzda orenk bir dongu var. Ama bunun olmasi
    gerekmiyor. Siz on planda isinize bakin. Seri porttan bilgi gelnce ne
    yapilacagini dogrudan handler icinde de yapabilirsiniz. Ama burada tipki
    ISR'lerde oldugu gibi, suratle geri donmek uzere bilgiyi alin bir
    buffere yazin, bir flag kullanarak ana kodun onu islemesini saglayin.

    Seri port kendine bilgi geldigi zaman IRQ uretir. Demekki, bu signal
    handler tipki ir ISR gibi sizin isinizi gorebilir..
    Saygi ve sevgiler..

    On 11 Aug 2003 09:55:18 +0300
    Muhammed Daud <muhammed@kilavuz.net> wrote:

    > merhaba
    > ben olsam interrupt 8`i kullanirdim
    > saniyede 18.2 kere bilgisayarin saatini ayarliyor
    > bunun yolunu degistirirseniz seri portu kontrol edip daha sonra saati
    > ayarlayabilir
    > On Sat, 2003-08-09 at 19:46, Derya Sezen wrote:
    >
    > > Merhaba,
    > >
    > > ttyS0 'a veri yazilip yazilmadigini interrupt olarak nasil
    > > alabilirim!? termios struct'ini nasil kullanmam gerekmekte, fikri
    > > olan?


  • Next message: Görkem Çetin: "[linux-ileri] 2.6 Qekirde=F0inde=20g=FCvenlik?="

    ---------

    Bu arsiv hypermail 2.1.6 tarafindan uretilmistir.