2012-04-02 17 views
7

Belirli bir ARM tabanlı Linux anakartı (aslında özel bir UART sürücüsü) için özel seri veri yolu sürücüsü uyguluyorum. Bu sürücü, özel bir protokol yoluyla veri yolunun diğer ucunda belirli bir MCU ile iletişimi sağlamalıdır. Sürücü (ve aslında 'un olmamalıdır) işlevlerinden herhangi birini kullanıcı alanına göstermeyecek veya kullanıcı alanında hiç kullanılmayacaktır (bu nedenle, stok TTY alt sistemini kullanmak yerine özel sürücüye olan gereksinim).Linux çekirdeğinde doğru modüller arası eşitleme gerçekleştiriliyor

iletişim protokolünü uygulamak ve UART/okur yazar ve onları MCU ile iletişim kurmasını sağlamak için kullanıcılarına üst düzey işlevleri kümesi ihracat sahiptir edecektir sürücü (örn read_register(), drive_gpios(), bütün bu şeyler) . Bu modülün sadece bir kullanıcısı olacak.

Arama modülü, işlemlerin tamamlanmasını beklemek zorunda kalacaktır (yukarıda belirtilen read_register() ve diğerleri). Şu anda semaforları kullanmayı düşünüyorum: kullanıcı modülü, transferleri başlatacak ve bir semafor üzerinde duracak olan sürücünün fonksiyonunu arayacak; Sürücümün IRQ işleyicisi MCU'ya istekleri gönderecek ve cevapları okuyacak ve bittiğinde, semaforun üzerine yazacak, böylece çağrı modülünü uyandıracak. Ama ben çekirdek programlamaya aşina değilim ve olası alternatif uygulamaların (görevler? Bekleme kuyrukları?) Çokluğu ile şaşırıyorum.

Soru şu ki: semafor temelli yaklaşımım tamam mı, yoksa çok mu? Olası alternatifler nelerdir? Kaybettiğim tuzaklar var mı?

+3

Semaphores, anladığım kadarıyla, daha iyi linux internalsyonlarını desteklemek için, ücretsiz pdf olarak sunulan "linex kernel development 3rd edition" adlı güzel bir kitaba atıfta bulunmalı ve günceldir (.39 kernel inanıyorum). Bu kitap gerçekten derin gitmiyor, ancak temel ilkeleri açıklıyor ve seçenekleri gösteriyor. İyi eğlenceler. – AoeAoe

+0

Güzel bir kitap, teşekkür ederim! Eğer başka biri ilgilenirse, Linux Sürücüler Geliştirme ve Linux Çekirdek Modül Geliştirme (her ikisi de ücretsiz olarak çevrimiçi olarak alınabilir) elde etmenizi öneririm. –

cevap

5

Geleneksel olarak iki bölüm halinde yapılır Linux taşıma IRQ:

Yani "üst yarısı" olarak adlandırılan
  1. IRQ bağlamında fiili çalışma (IRQ işleyicisi kendisi) 'dir. Bu bölüm mümkün olduğunca hızlı çıkmalıdır. Bu nedenle, temelde kesme kaynağını kontrol eder ve ardından alt yarıya başlar. "Alt yarısı". İş kuyruğu olarak uygulanabilir. Gerçek işin yapıldığı yer burası. o engelleme işlevlerini kullanabilirsiniz böylece vb normal bağlamında çalışır

sadece özel nesne kullanmak, sizin çalışan iş parçacığı IRQ için daha iyi beklemek istersen

completion aradı. Bu görev için tam olarak yaratılmıştır.

İlgili konular