Bu bir cevaptan çok bir görüş / yorumdur.
C programında istemiyorsunuz ve programlamamalısınız. C ++, doğru şekilde kullanıldığında çok daha üstündür. (Tamam, itiraf etmeliyim ki, yanlış bir şekilde kullanıldığında C'den çok daha kötüdür.) Bu, (modern) bir C ++ derleyicisine sahip olan ve AVR ( bazı sınırlamalar, filo tekdüze olmayan bir adres alanının sorunlarından bahseder), ancak neredeyse tüm PIC'leri (PIC32 desteklenebilir, ancak henüz iyi bir bağlantı noktası görmedim) hariç.
C / C ++ 'da algoritmaları programlarken, bahsettiğiniz seçenekler arasındaki fark küçüktür (16, 32 veya daha fazla bit aritmetiği yaptığınızda 8 veya 16 bit çip ciddi bir dezavantaj olacaktır). Performansın son onsuna ihtiyacınız olduğunda, muhtemelen montajcı kullanmanız gerekir (kendi kodunuz veya satıcı tarafından sağlanan kod veya üçüncü bir taraf). Bu durumda, seçtiğiniz çipi yeniden değerlendirmek isteyebilirsiniz.
Donanımı kodlarken bazı soyutlama katmanlarını (genellikle üretici tarafından sağlanır) kullanabilir veya kendiniz yazabilirsiniz (veri sayfasına ve / veya örnek koda dayalı olarak). IME mevcut C soyutlamaları (mbed, cmsis, ...) genellikle işlevseldir (neredeyse) doğrudur, ancak performansta korkunç bir şekilde başarısız olurlar (oldfarts'ın bir pim seti işlemi için yaklaşık 6 dolaylı dolaylama katmanı olduğunu kontrol edin), kullanılabilirlik ve taşınabilirlik. Belirli bir çipin tüm işlevlerini size açıklamak istiyorlar , neredeyse her durumda umursamayacağınız ve umursamayacağınız ve kodunuzu söz konusu satıcıya (ve muhtemelen o çipe) kilitler.
Bu C ++ çok daha iyi yapabilirdi: düzgün yapıldığında, bir pin seti 6 veya daha fazla soyutlama katmanından geçebilir (çünkü daha iyi (taşınabilir!) Bir arayüz ve daha kısa kod mümkün kılar), ancak hedeften bağımsız bir arayüz sağlayın basit durumlar için ve yine de montajcıda yazdığınızla aynı makine koduyla sonuçlanır .
Kullandığım kodlama stilinin bir parçası, ya sizi heyecanlandırabilir ya da dehşete kapabilir:
// GPIO part of a HAL for atsam3xa
enum class _port { a = 0x400E0E00U, . . . };
template< _port P, uint32_t pin >
struct _pin_in_out_base : _pin_in_out_root {
static void direction_set_direct( pin_direction d ){
( ( d == pin_direction::input )
? ((Pio*)P)->PIO_ODR : ((Pio*)P)->PIO_OER ) = ( 0x1U << pin );
}
static void set_direct( bool v ){
( v ? ((Pio*)P)->PIO_SODR : ((Pio*)P)->PIO_CODR ) = ( 0x1U << pin );
}
};
// a general GPIO needs some boilerplate functionality
template< _port P, uint32_t pin >
using _pin_in_out = _box_creator< _pin_in_out_base< P, pin > >;
// an Arduino Due has an on-board led, and (suppose) it is active low
using _led = _pin_in_out< _port::b, 27 >;
using led = invert< pin_out< _led > >;
Gerçekte daha soyutlama katmanları vardır. Ancak ledin son kullanımı, diyelim ki onu açmak için, hedefin karmaşıklığını veya ayrıntılarını göstermiyor (bir arduin uno veya ST32 mavi hapı için kod aynı olacaktır).
target::led::init();
target::led::set( 1 );
Derleyici tüm bu katmanlar tarafından korkutulmaz ve ilgili sanal işlevler olmadığından, iyileştirici her şeyi görür (çevre saatini etkinleştirmek gibi bazı ayrıntılar atlanmıştır):
mov.w r2, #134217728 ; 0x8000000
ldr r3, [pc, #24]
str r2, [r3, #16]
str r2, [r3, #48]
Bu şekilde montajcıda yazardım - PIO kayıtlarının ortak bir bazdan ofsetlerle kullanılabileceğini fark etseydim. Bu durumda muhtemelen yapardım, ancak derleyici böylesi şeyleri optimize etmede çok daha iyi.
Cevabım olduğu sürece, donanımınız için bir soyutlama katmanı yazın, ancak modern C ++ (kavramlar, şablonlar) ile yapın, böylece performansınıza zarar vermez. Bu ile kolayca başka bir çipe geçebilirsiniz. Hatta etrafında yerleştirdiğiniz, familiair olan, iyi hata ayıklama araçlarına sahip olan vb.Geliştirmeye başlayabilirsiniz ve son seçimi daha sonraya kadar erteleyin (gerekli bellek, CPU hızı vb. Hakkında daha fazla bilgi sahibi olduğunuzda).
IMO Gömülü gelişimin kusurlarından biri önce çipi seçmektir (bu forumda sıklıkla sorulan bir soru: hangi çip için seçmeliyim .... En iyi cevap genellikle: önemli değil.)
(edit - "Performans açısından, C veya C ++ aynı düzeyde mi?"
Aynı yapılar için C ve C ++ aynıdır. C ++, herhangi bir araç gibi, iyi veya kötü için kullanılabilen soyutlama için çok daha fazla yapıya sahiptir (sadece birkaç: sınıflar, şablonlar, constexpr). Tartışmaları daha ilginç hale getirmek için: herkes neyin iyi neyin kötü olduğunu kabul etmez ...