Burada çok çeşitli cevaplar ... çoğunlukla konuyu çeşitli şekillerde ele alıyor.
25 yılı aşkın süredir çeşitli dillerde gömülü düşük seviyeli yazılım ve bellenim yazıyorum - çoğunlukla C (ancak Ada, Occam2, PL / M ve yol boyunca çeşitli montajcılar ile).
Uzun bir düşünce ve deneme yanılma sürecinden sonra, sonuçları oldukça hızlı bir şekilde alan ve test sarmalayıcıları ve koşum takımları oluşturmak oldukça kolay olan bir yönteme karar verdim.
Yöntem böyle bir şeye gider:
Kullanmak istediğiniz her ana çevre birimi için bir sürücü veya donanım soyutlama kod birimi yazın. Ayrıca işlemciyi başlatmak ve her şeyi ayarlamak için bir tane yazın (bu, dost ortamı sağlar). Tipik olarak küçük gömülü işlemcilerde - AVR'niz bir örnektir - hepsi küçük 10 - 20 gibi birimler olabilir. Bunlar başlatma birimleri, ölçeklenmemiş bellek tamponlarına A / D dönüşümü, bitsel çıkış, buton girişi (sadece açılma yok örneklenmiş), darbe genişlik modülasyon sürücüleri, UART / basit seri sürücüler kullanım kesintileri ve küçük I / O tamponları olabilir. Birkaç tane daha olabilir - örn. EEPROM, EPROM veya diğer I2C / SPI aygıtları için I2C veya SPI sürücüleri.
Donanım soyutlama (HAL) / sürücü birimlerinin her biri için bir test programı yazıyorum. Bu seri bağlantı noktasına (UART) ve işlemci başlatmasına dayanır - bu nedenle ilk test programı sadece bu 2 birimi kullanır ve sadece bazı temel giriş ve çıkışları yapar. Bu, işlemciyi başlatabildiğimi ve temel hata ayıklama desteği seri G / Ç çalıştığımı test etmemi sağlıyor. Bu işe yaradığında (ve ancak o zaman), diğer HAL test programlarını geliştiriyorum ve bunları bilinen iyi UART ve INIT birimlerinin üzerine inşa ediyorum. Bu yüzden bitsel girişleri okumak ve bunları seri hata ayıklama terminalimde güzel bir biçimde (onaltılık, ondalık, her neyse) görüntülemek için test programlarına sahip olabilirim. Daha sonra EEPROM veya EPROM test programları gibi daha büyük ve daha karmaşık şeylere geçebilirim - Çalıştırmak, çalıştırmak ve sonucu görmek için bir test seçebilmem için bu menünün çoğunu yönlendiriyorum. SCRIPT yapamıyorum ama genellikle yapmıyorum
Tüm HAL'ımı çalıştırdıktan sonra, düzenli bir kronometre almanın bir yolunu buluyorum. Bu tipik olarak 4 ila 20 ms arasında bir orandadır. Bu düzenli olmalı, kesilmeyle oluşturulmalıdır. Sayaçların devrilmesi / taşması genellikle bunun nasıl yapılabileceğidir. Kesme işleyici daha sonra bir bayt boyutu "semafor" İNCELEME. Bu noktada, gerektiğinde güç yönetimi ile de uğraşabilirsiniz. Semafor fikri, değeri> 0 ise "ana döngüyü" çalıştırmanız gerektiğidir.
YÖNETİCİ ana döngüyü çalıştırır. Hemen hemen bu semaforun 0 olmayan hale gelmesini bekler (bu detayı soyutluyorum). Bu noktada, bu keneleri saymak için sayaçlarla oynayabilirsiniz (çünkü kene oranını biliyorsunuz) ve böylece geçerli yürütme kene 1 saniye, 1 dakika ve diğer ortak aralıklar için olup olmadığını gösteren bayrakları ayarlayabilirsiniz. kullanmak isteyebilir. Yönetici semaforun> 0 olduğunu bildiğinde, her "uygulama" süreç "güncelleme" fonksiyonundan tek bir geçiş gerçekleştirir.
Uygulama süreçleri etkin bir şekilde yan yana oturup bir "güncelleme" kene tarafından düzenli olarak çalıştırmak olsun. Bu sadece yürütme tarafından çağrılan bir işlevdir. Bu, giriş, küçük bir iş parçası ve çıkış yapan tüm uygulamalara dayanan çok basit bir evde yetiştirilen RTOS ile etkili bir şekilde çok görevlidir. Uygulamaların kendi durum değişkenlerini koruması gerekir ve adaleti zorlayacak önleyici bir işletim sistemi olmadığından uzun süreli hesaplamalar yapamazlar. ZORUNLU uygulamaların çalışma süresi (kümülatif olarak) ana kene süresinden daha kısa olmalıdır.
Yukarıdaki yaklaşım kolaylıkla genişletilebilir, böylece eşzamansız olarak çalışan iletişim yığınları eklenebilir ve iletişim iletileri daha sonra uygulamalara teslim edilebilir (her birine "rx_message_handler" olan yeni bir işlev eklersiniz ve hangi uygulamanın gönderileceği).
Bu yaklaşım, adlandırmayı düşündüğünüz hemen hemen her iletişim sistemi için çalışır - birçok tescilli sistem, açık standart iletişim sistemleri için çalışabilir (ve yaptı), hatta TCP / IP yığınları için bile çalışır.
Ayrıca, iyi tanımlanmış arayüzlere sahip modüler parçalar halinde inşa edilmesi avantajına sahiptir. Parçaları istediğiniz zaman içeri ve dışarı çekebilir, farklı parçaları değiştirebilirsiniz. Yol boyunca her noktada, bilinen iyi alt katman parçalarına (aşağıdaki şeyler) dayanan test koşum takımı veya işleyiciler ekleyebilirsiniz. Bir tasarımın kabaca% 30 ila% 50'sinin genellikle oldukça kolay eklenen özel yazılı birim testlerinden faydalanabileceğini buldum.
Bunu bir adım daha ileri götürdüm (bunu yapan başka birinden çaldım bir fikir) ve HAL katmanını PC için eşdeğerle değiştirdim. Örneğin, bir bilgisayarda C / C ++ ve winforms ya da benzerlerini kullanabilir ve DİKKATLİ bir kod yazarak her arabirimi taklit edebilirsiniz (örn. EEPROM = PC belleğine okunan bir disk dosyası) ve ardından tüm gömülü uygulamayı bir PC'de çalıştırabilirsiniz. Dostça bir hata ayıklama ortamı kullanma yeteneği büyük miktarda zaman ve çaba tasarrufu sağlayabilir. Sadece gerçekten büyük projeler genellikle bu tür çabaları haklı çıkarabilir.
Yukarıdaki açıklama, gömülü platformlarda işleri nasıl yaptığım konusunda benzersiz olmayan bir şeydir - benzer olan birçok ticari kuruluşla karşılaştım. Uygulama şekli genellikle uygulamada büyük ölçüde farklıdır, ancak ilkeler çoğu zaman aynıdır.
Umarım yukarıdakiler biraz lezzet verir ... bu yaklaşım, birkaç kB'de agresif pil yönetimi ile sürekli çalışan 100K veya daha fazla kaynak hattının canavarlarına kadar çalışan küçük gömülü sistemler için çalışır. Windows CE gibi büyük bir işletim sisteminde "katıştırılmış" çalıştırırsanız, yukarıdakilerin tümü tamamen önemsizdir. Ama bu GERÇEK gömülü programlama değil.