Her mikrodenetleyici hattının kendi programlama dili / sözdizimi var mı?


10

Arduino'yu programladım ve Teensy'i programlamaya başladım. C'ye benzerler, ancak programlama dilinde hafif nüanslar vardır.

Örneğin, Arduino'nun C'sinde, çıkış sinyallerine dijital bir pin atamak veya sinyal almak için pinMode (pin #, Output / Input) fonksiyonunu çağırırsınız. Teensy'nin C'sinde, toplu olarak giriş veya çıkış ( Teensy IO sözdizimi ) olarak atadığınız dört bağlantı noktasından (her biri bir iğne koleksiyonunu temsil eder) ilişkili "DDR" kaydını ayarlarsınız .

Sizin için yeni olan bir mikro denetleyici kullandığınızda, etkili bir şekilde yeni bir "dil" öğrenmeniz gerekip gerekmediğini bilmek istiyorum. Sözdizimindeki nüanslara rağmen, bileşenler ve yazılımda nasıl kurulduklarına rağmen "dil" kelimesini tırnak içine aldım, örneğin bağlantı noktaları ve pimler kavramı hala dijital çıkış / giriş yapabileceğiniz bir terminale atıfta bulunur. sinyaller.

Söylem aynı nafile: orada mikrodenetleyicilerdir değildir yazılımda programlanmış ya da her zaman bir yazılım katmanı uController programlamak için orada kullanılacak? İkincisi, onlar için kim yazar / doküman sağlar?


2
Arduino için programlama dili C ++ ise belki veya C yalnızca bir alt kümesine ++ (hatta - (değil (sadece) C) İşleme ). Tamamen açık değil, ama kesinlikle C'den daha fazla; örneğin sınıfları ve kullanıcı tanımlı operatörü + = vardır .
Peter Mortensen

1
C ++, g ++ - avr kullanarak derler. Teknik olarak bağımsız bir C ++ uygulaması olacaktır ve C ++ standart kitaplığını içermez (dinamik bellek ayırma ve istisnalar gibi şeyler nedeniyle). Sınıflar ve şablonlar gibi dil özelliklerini kullanabilirsiniz , doğrudan kayıtlara erişimle aynı performansı elde eden şablon tabanlı bir digitalWrite () değiştirme gördüm , Arduino yöntemi oldukça ek yüke sahiptir.
r_ahlskog

1
Dil aynı. Farklı olan API. Mikrodenetleyicilerden uzaklaşır ve masaüstü uygulamaları yazmaya başlarsanız, Windows, Linux ve Mac için C programları yazarken aynı sorunlarla karşılaşırsınız. Tamamen POSIX API'sini (her 3 platformun da desteklediği) kullansanız bile, kullanıcının ayarlarını / tercihlerini kaydetmek istediğinizde platforma özgü farklılıkları yine de vurursunuz.
slebetman

Yanıtlar:


3

Mikroişlemciler ve Mikrodenetleyiciler genellikle farklı ürün ve üretici hatları arasında paylaşılan bir mimari kullanır . Bu mimariler tipik olarak tüm uygulamalarda ortak olan düşük seviyeli bir komut seti ( komut seti ) tanımlar . AC veya C ++ derleyicisi tüm ARM işlemcilerinde çalıştırılabilir bayt kodu oluşturabilir.

Ancak, mimari resmin sadece yarısıdır. Çok sayıda belirli bellek adresi olduğundan, yerleşik çevre birimleri, bellek yönetimi ve mimarinin ele almadığı diğer uygulama ayrıntıları

Bir üretici veya üçüncü taraf tipik olarak tanımlar, bağlantı noktası eşlemeleri ve örnek kod sağlayacak bir kaynak dosyaları koleksiyonu ( HDK ) sağlar. Tipik olarak HDK, C ve C ++ içindir . Tipik olarak HDK ile ilişkili bir tanıtım panosu olacaktır (500 $ arduino düşünün). Geliştirme / örnek platformunu tasarladığınız cihaza ayarlamak için genellikle birçok ayrıntılı yapılandırma çalışması gerekir.

Arduino, AVR mimarisine dayanır ve öncelikle Atmel tarafından desteklenir. Arduino, platformu minimum çaba ile kullanmanız için bir platform önyükleyici ve basitleştirilmiş C ++ işlevleri ve nesneleri kitaplığı oluşturdu. Arduino platformu ve IDE, minimum ekipmana sahip hobiler için tasarlanmıştır. Arduino'dan önce PIC, kullanımı kolay ve ucuz BASIC ortamı ile benzer bir rol üstlendi.

Profesyonel bir ortamda tipik olarak bu destek satıcı / üretici tarafından sağlanır veya üçüncü bir tarafla sözleşme yapılır. Düşük seviye kodu ve başlıkları sağlarlar ve uygulamanızı bu HDK ile yazarsınız, daha büyük organizasyonlarda bu evde yapılabilir. Üreticilerin platformlarının etrafında, arduino kadar kutusundan çıkar çıkmaz kullanılmasını kolaylaştıran açık bir API / Yazılım ekosistemi oluşturma eğilimi var. Çok az programlama desteğine sahip sayısız yonga var ve çoğu platform bilgisi kurumsal dünyada kilitli.


14

Bu durumda dil tamamen aynıdır. Arduino ortamında, gerçek donanım kayıtlarına (DDRx, PORTx, INx, vb.) Erişimi biraz daha kullanıcı dostu işlevlerle 'saran' bazı ekstra kütüphaneler (sadece daha fazla C kodu) bulunur. Bu, ek yükü artırır (aynı işlem için daha fazla talimatın yürütülmesi gerekir), ancak yalnızca bu çağrıları kullanan bir program yazmak "basit" olduğundan esnekliği arttırır, ardından farklı bir çip (örneğin, bir arduino mega) için yeniden hedefleyin ve kütüphane uygun eşlemeyi dahili olarak ele alacaktır.

Farklı satıcıların yongaları arasında gerçekten düşük seviyeli erişim için gerçekten herhangi bir 'standart' API yoktur. Ancak, tüm düşük düzeyli erişim aynı şekilde yapılır - sabit bellek adreslerini okur ve yazar - böylece genel erişim yöntemi farklı parçalar arasında benzer olacaktır, sadece detaylar ve isimler farklı olacaktır. Belki de sadece başlık dosyalarına işaretçiler için kullanılan #defines kayıt adreslerinin büyük listelerini sağlayacaktır. Ya da üstbilgi dosyaları, işleri biraz hiyerarşi ile düzenli tutmak için yapıları kullanır. Bazı üreticiler daha üst düzey API'ler de sağlayabilir. Bu, karmaşık ve yapılandırılması zor çevre birimleri için çok yararlı olabilir. GPIO çok basit, ancak DMA destekli bir USB denetleyicisi gibi bir şeyin yüzlerce kaydı olabilir.

Sonuç olarak, evet, bazı yeni kayıt adlarını öğrenmeniz gerekecek, ancak dil hala C ++ (veya C, derleme veya belki de daha ezoterik bir şey).


4
Arduino sadece C değil (aslında C ++) - C derleyicisine beslemeden önce birkaç değişiklik yapan bir ön işlemciye sahip.
Nick Johnson

Aslında, Arduino için, C'den daha fazladır. C ++ (veya belki de C ++ 'ın bir alt kümesidir).
Peter Mortensen

Arduino kütüphaneleriyle sadece yerel C ++ mı yoksa daha fazlası mı?
kayleeFrye_onDeck

Arduino IDE, görünüşte başka türlü standart C ++ üzerine biraz ekstra ön işleme yapıyor. Çoğu IDE bunu yapmaz.
alex.forencich

Temelde C ++ ama main()sizin için önceden tanımlanmış. Bunun yerine iki giriş noktası elde edersiniz: init()ve loop()(eğer yanılıyorsam beni düzeltin ama sadece 20ft kutuplu
Arduino'ya dokundum

5

Mikrodenetleyicileri ve derleyicileri karıştırıyorsunuz. Herhangi bir mikro girişi programlayabileceğiniz üst düzey diller, o mikro için hangi derleyicilerin kullanılabileceğinin bir fonksiyonudur.

Düşük seviyede mikro, bir derleyicinin "program" olduğunu düşündüğünüz metin dosyası için türettiği makine talimatlarını yürütür. Gerçekleştirmek için gerçekten bir mantık belirlersiniz ve derleyici bu mantığı uygulamak için mevcut makine talimatlarının nasıl kullanılacağını anlar. Bu durumda, programladığınız şey, mikro ana komut setinin değil, derleyicinin bir fonksiyonudur.

Doğrudan doğal talimatlar belirterek bir mikro programlayabilirsiniz. Bu, montaj dili kullanılarak yapılır. Derleyici gibi, derleyici de yazdığınız bir metin dosyasını alan ve sonuç olarak makine talimatları üreten bir çevirmen. Aradaki fark, bu durumda bu makine talimatlarını doğrudan belirtmenizdir. Her yönerge bir ad verilir ve ikili ad kodları yerine bu adları yazarsınız, ancak yine de yönergeleri doğrudan belirtirsiniz. Montajcı, yalnızca metin dosyasında yazdığınız ad ve seçeneklerden her komutun tam ikili kodlamasını anlamaya çalışır.

Üst düzey bir dil çok farklı mikrolar arasında aynı olsa da, makine talimatları genellikle yalnızca ilgili mikrolar ailesinde benzerdir. Örneğin, tüm Microchip PIC 18, temel PIC 16'dan farklı ve yine PIC 24 ve dsPIC 30 ve 33 gibi 16 bitlik kısımlardan farklı olan aynı komut setine (çoğunlukla) sahiptir.


1
Montajcı ayrıca elle yapıldığında hataya oldukça açık olan atlama ifadeleri için etiketleri de çözer.
Pete Becker

2

Programlama dili hala C'dir. Ancak donanıma erişmek için üreticinin kütüphanesi farklıdır. Bildiğim kadarıyla hiçbir standart yok, bu yüzden her üreticinin kendi API'sı var. Farklı üreticiler arasında taşınabilir olmak istiyorsanız, API'nizi üreticiye özgü yöntemlerle eşleştiren belirli uygulamalarla donanıma erişmek için kendi soyut API'nizi tanıtmak isteyebilirsiniz.


Aslında, C'den daha fazladır. C ++ (veya belki de C ++ 'ın bir alt kümesidir).
Peter Mortensen

2

Diğer cevaplar, üst düzey diller (C ++ gibi) ve makine kodu arasında ayrım yapsa da, her mikro denetleyicinin ilişkili bir 'dili' olduğuna dair ifadenizi geçersiz kıldığına inanmıyorum.

Dil uygulamalarının farklılıkları, farklı diller olarak sınıflandırılacak kadar büyük değildir, ancak bunları 'lehçelere' ayırmaktan çekinmem. Burada iki değişim katmanı bulunabilir.

  1. Üst düzey sarıcı kitaplıkları üreticiden veya bazı üçüncü taraflardan edinilebilir
  2. Bazı derleyiciler standart uyumlu kod yayınlayamayabilir

Arduino platformunu izlerken bu noktaları ele alalım.

  • Arduino topluluğu AVR mimarisi yongaları için çok soyutlanmış C ++ kütüphaneleri sunar. Bu kütüphaneler, tipik bir C ++ programından (örneğin main () gizlenmesi) beklenenden farklı kontrol akışı önerir.
  • Başlık altında, Arduino kodunu C / C ++ kodu yayan avr-gcc kullanarak derler. Ancak istisnalar AVR çiplerinde iyi desteklenmez ve neredeyse her zaman devre dışıdır. Böyle büyük bir özellik eksik olduğunda, ortaya çıkan program 'normal' bir C ++ programının nasıl olacağı gibi davranmayabilir.

Bunu bilerek, herhangi bir keyfi mikrodenetleyiciyi nasıl programlayacağınıza nasıl karar veriyorsunuz? Birkaç seçeneğiniz var:

  1. Özel çipiniz için topluluk tarafından oluşturulan kütüphaneleri ve IDE'leri arayın. AVR çipleri bazen sadece C kullanılarak geliştirilir, ancak Arduino projesi hobiler için daha kullanıcı dostu bir deneyim sağlar.
  2. Özel çipiniz için derleyebilen derleyiciler bulun. Uygun derleyici, çipinizin veri sayfaları ve biraz sabır ile, metale çok yakın kod yazabileceksiniz.

Referans olarak, GCC için desteklenen arka uçların listesi. ARM, AVR, MIPS ve diğerleri için destek olduğunu fark edeceksiniz.

'Yazılım' ile programlanmamış yongalar hakkında ...

Sahada programlanabilir kapı dizilerine (FPGA'lar) bakmak isteyebilirsiniz! FPGA'lar, mantık kapılarını taklit etmek için arama tablolarının değerlerini değiştirerek kontrol edilir. Bunun tek başına uygun bir yazılım formu yoktur, ancak yine de VHDL ve Verilog gibi donanım açıklama dilleri kullanılarak geliştirilmektedir.


1

Bir pcboard'a bakıyorum ve bazı yüzeye monte cihazları, bazı dirençleri ve kapasitörleri ve ledleri görüyorum. Bu, bu kartlardan birinin ekran kartı olduğu için, dirençli ve kapasitörlü tüm kartların ve çoklu katmanların ve izlerin hepsinin video kartı olduğu anlamına mı geliyor? Hayır!

İşte başka bir örnek, bu web sayfası İngilizce alfabe ve İngilizce kelimeleri kullanır. Peki new york times web sitesi, bu web sitesi new york times mi? Hayır, sadece aynı alfabe ve dili paylaşıyorlar, ancak tamamen farklılar.

C, altında ayarlanan talimatı özetleyen genel amaçlı bir programlama dilidir. Çıplak metal için kullanılabilir, birbirinden farklı ve birbiriyle uyumlu olmayan işletim sistemleri oluşturmak için kullanılabilir, video oyunları oluşturmak için kullanılabilir, vb. Hepsi aynı temel C dilini, bazı ortak C işlevlerini ve yapılarını kullanmanın yanı sıra oluşturdukları hedef uygulamaya özel fonksiyon çağrıları. Bahsettiğiniz bu platformların her biri veya diğerleri için, birisinin oluşturmayı seçtiği bir dizi işlev olabilir. Tıpkı kendim de dahil olmak üzere bir avuç insan gibi sana aynı cevabı vermiş ama farklı bir şekilde yazmış. 100 programcı alın ve bunları birbirinden izole edin ve programlama özgürlüklerini tamamen kısıtlamadan belirli bir sorunu çözmek için bir programlama görevi verin, ve 1 ila 100 farklı, birbirinizle uyumsuz, muhtemelen 1 değil, eğitim ve deneyimlerine bağlı olarak birkaç ortak tema ve daha sonra bir set olarak her bir birey için benzersiz olan değişken adları ve işlev adları elde edersiniz. Zaten konuştuğunuz aynı panoları alın ve kesinlikle diğer armağanlarla olduğu kadar diğer platformlarla da uyumsuz olan (arduino işlevleriyle) kendi C kodumun olduğunu göreceksiniz. Bu, çıplak metal gömülü programlamanın güzelliğidir, herhangi bir şekilde kısıtlanmazsınız, işletim sistemleri standart kütüphane çağrıları veya guis sınırlı kurallar kümesi, vb. muhtemelen 1 değil, eğitim ve deneyimlerine bağlı olarak birkaç ortak tema ve daha sonra set olarak her bir birey için benzersiz olan değişken adları ve işlev adları. Zaten konuştuğunuz aynı panoları alın ve kesinlikle diğer armağanlarla olduğu kadar diğer platformlarla da uyumsuz olan (arduino işlevleriyle) kendi C kodumun olduğunu göreceksiniz. Bu, çıplak metal gömülü programlamanın güzelliğidir, herhangi bir şekilde kısıtlanmazsınız, işletim sistemleri standart kütüphane çağrıları veya guis sınırlı kurallar kümesi, vb. muhtemelen 1 değil, eğitim ve deneyimlerine bağlı olarak birkaç ortak tema ve daha sonra set olarak her bir birey için benzersiz olan değişken adları ve işlev adları. Zaten konuştuğunuz aynı panoları alın ve kesinlikle diğer armağanlarla olduğu kadar diğer platformlarla da uyumsuz olan (arduino işlevleriyle) kendi C kodumun olduğunu göreceksiniz. Bu, çıplak metal gömülü programlamanın güzelliğidir, herhangi bir şekilde kısıtlanmazsınız, işletim sistemleri standart kütüphane çağrıları veya guis sınırlı kurallar kümesi, vb. Zaten konuştuğunuz aynı panoları alın ve kesinlikle diğer armağanlarla olduğu kadar diğer platformlarla da uyumsuz olan (arduino işlevleriyle) kendi C kodumun olduğunu göreceksiniz. Bu, çıplak metal gömülü programlamanın güzelliğidir, herhangi bir şekilde kısıtlanmazsınız, işletim sistemleri standart kütüphane çağrıları veya guis sınırlı kurallar kümesi, vb. Zaten konuştuğunuz aynı panoları alın ve kesinlikle diğer armağanlarla olduğu kadar diğer platformlarla da uyumsuz olan (arduino işlevleriyle) kendi C kodumun olduğunu göreceksiniz. Bu, çıplak metal gömülü programlamanın güzelliğidir, herhangi bir şekilde kısıtlanmazsınız, işletim sistemleri standart kütüphane çağrıları veya guis sınırlı kurallar kümesi, vb.

Arduino gui ve C kütüphanelerini kullanmak anlamına gelir ve kendi başınıza inşa etmek yerine bir başkasının sanal alanında oynamayı seçebilirsiniz.

Aynı bilgisayarı alabilir ve Windows, Linux, BSD ve bir düzeyde C kullanan ancak işlev çağrıları birbiriyle uyumlu olmayan diğer işletim sistemlerinin bir çamaşır listesini farklı sürümlerini çalıştırabilirsiniz. Farklı donanıma, aynı dile uzanan aynı donanım ve uyumsuz C, uyumlu veya uyumsuz koda sahip olabilir. Dil hiçbir şekilde onları uyumlu hale getirmez.

C, bu gömülü platformlarda kullanılır, çünkü bu yaygın bir uygulamadır, bunun için C'nin yerini alabilecek başka bir dil yoktur. Yeni bir işlemci için ilk adım elbette montajdır, o zaman hemen hemen her zaman C olur, o zaman belki bir işletim sistemi (linux, bsd, vb.) Çalıştırmak için yeterince güçlü ise diğerleri. C, kodları platformlar arasında taşıma sırasındaki problemi çözmek için icat edildi ve ümit edildi ve bir işletim sistemine sahip olduğunuz sürece, bir işletim sistemine sahip olduğunuzda, bir ÇALIŞMA SİSTEMİNDE ÇALIŞIR, standart C dosyasını yapacak operasyonlar ve printf ve benzeri şeyler. Ancak çıplak metal farklı bir hikaye, işletim sistemi yoktur, genellikle bir dosya sistemi veya bir görüntü kavramı yoktur, ancak ortak uygulamada, köklerini C'yi hedef spesifik montaj diline dönüştüren bir C derleyicisi vardır.


Aslında, Arduino için, C'den daha fazladır. C ++ (veya belki de C ++ 'ın bir alt kümesidir).
Peter Mortensen

1

İkinci sorunuzu cevaplamak için, "mikrodenetleyici" terimi, çipin üzerinde bir CPU ve RAM (ve muhtemelen ROM) olduğunu ima eder. Tüm mikrodenetleyiciler yazılım çalıştırır - bu yüzden onları seviyoruz.

İlk soruyu daha derinlemesine inceleyerek, tüm MCU'larda bir C derleyicisi varken, temel C dili her işlemci üzerindeki her komutu desteklemez. Örneğin, C sola / sağa kaydırma işleçlerine sahiptir, ancak sola / sağa döndürme işleçleri yoktur. C'nin işaretçi sistemi doğal olarak ayrı program ve veri adres alanlarını desteklemez (bazı Harvard Mimarilerinde olduğu gibi). C'nin doğrudan SIMD desteği yoktur.

Derleyiciler bu özelliklerle başa çıkmak için birkaç seçeneğe sahiptir:

  1. Temel dili, genellikle yeni anahtar kelimelerle genişletin (örneğin, disk belleği olan anılar için yakın ve uzak).

  2. İçsel işlevler sağlayın (örneğin döndürme için __ror () ve __rol ()).

  3. Bunları optimize edicide çalışın, böylece C işlem dizileri tek bir verimli talimatta derlenir (örn. Çarpma / birikme).

  4. Bunları yok sayın ve C standart dışı özellikler isterse kullanıcının montaj kodunu yazmasını sağlayın.

Bir sonraki seviye, esas olarak sizin için tüm kayıtları tanımlayan üretici tarafından sağlanan başlık dosyalarıdır. Bunları kendiniz yapabilirsiniz, ancak bu MCU konusunda uzman değilseniz büyük bir acıdır.

Son olarak, kayıt yazma işlemleri gibi sizin için düşük yazıları işleyen üretici tarafından sağlanan kütüphane işlevleri vardır.

Örneğiniz iki seviyeyi karıştırmaktadır. DDR, bir kayıt anlamına gelen bir makrodur. Bir işaretçi erişimi veya bir derleyici iç fonksiyonu olarak uygulanır (hangisini unutuyorum). pinMode () sizin için DDR kaydına yazan bir işlevdir.

Bir MCU hattından diğerine geçtiğinizde yeni kayıtlar ve yeni derleyici tuhaflıkları öğrenmeniz gerekir. Aynı şirkette kalırsanız benzer bir API alabilirsiniz. Farklı şirketler API'leri paylaşmaz; neden rakiplerimize geçmenize yardımcı olalım? :-)


1

Mikrodenetleyiciler genellikle donanım düzeyinde farklı mikrokodlara sahiptir. Bizi makine kodunu girmekten (yani her biri mikrodenetleyicinin ham mikrokodunu temsil eden rakamlar şeklinde talimatlar) veya sembolik montajcıda (her makine kodu talimatı için anımsatıcı bir etiket sağlayan) kaydetmek için taşınabilir üst düzey diller kullanılır.

C ve Forth, farklı makine kod setleri arasında kolayca taşınabilir olacak şekilde tasarlanmıştır.

Yani Arduino'da C ve Teensy'de C kullanırsanız, her iki durumda da C'yi kullanırsınız.

Arduino'da Forth ve Teensy'de Forth kullandıysanız, her iki durumda da Forth'u kullanırsınız.

Bazen, ek donanım olanakları, dili yeni donanıma taşıyan kişiden (veya gruptan), çok düşük düzeyli kod yazmak zorunda kalmadan donanım platformunun yeni olanaklarına erişebilmeniz için önceden hazırlanmış bir kod yazmasını ister. kendin.

Bu kütüphaneler (C cinsinden) veya sözlükler (Forth'ta) içinde donanıma özgü bazı işlevler veya sözcükler olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.