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ı?
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
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. –