MCU (lar) ile Fonksiyonel Programlama


12

Haskell, LISP veya Scheme gibi işlevsel diller , bir programcının işlevsel programlama paradigmasını kullanarak hızlı bir şekilde çalışmasına izin verir . Onların var yetersizliklere , ancak başvurum programın kendisi verimliliği daha programcı verimliliği üzerinde büyük önem vermektedir.

Makine kontrolü yapmak için mikrodenetleyici üzerinde fonksiyonel programlama kullanmak istiyorum.

Minimum sistem kaynakları gibi ne gibi sınırlamalar var?
Bu dillerin hangi örnek uygulamaları mevcut?


1
Sorunuz " Ellerinizi alabileceğiniz en güçlü programlama diliyle herhangi bir makineyi programlamaya değmez mi?" İse , C ++ ve Java sorularının okunması önerilir (işlevsel programlama yerine OOP hakkında).
Kevin Vermeer

1
İlk paragrafınız tartışmacı olarak karşımıza çıkıyor ve bu size birkaç yakın oyu netleştirdi. Daha pasif bir şeye ("gömülü sistemler için Haskell / LISP / Scheme uygulamaları var ne örnek var") veya tamamen kaldırmaya çalışın.
Kevin Vermeer

2
"Verimsiz" ifadenizi almıyorum. Hobi / prototip tarafına karşı düşük önyargı sergiliyorsunuz - düşük hacim (aka: 1). C / C ++ / asm, işlemcileri yeterli hız ve alana sahip kullanabileceğiniz binlerce veya milyonlarca kez yükseltilmiş daha küçük ve daha hızlı kodlarla sonuçlanır. Gömülü gömülüdür. Genel amaçlı bir işletim sisteminde programlama yapmıyorsunuz.
Nick T

4
@Nick T - "C / C ++ / asm işlemcileri, yeterli hız ve alana sahip işlemcileri kullanabileceğiniz binlerce veya milyonlarca kez yükseltilmiş daha küçük, daha hızlı kodlarla sonuçlanır" - ya bakım? İşlevsel bir dil, bir C-programının 10'ların yapmasını gerektirdiği şeyleri sıklıkla tek bir satırda yapabilir, yani hatalara daha az yer kalır. Ek olarak, bunlara uyulabilir (yani Haskell) ve tercümanlardan daha hızlı olan hedef üzerinde çalıştırabilirler. Bu konuyu biraz araştırmak istedim çünkü derlenmiş bir Haskell bir C uygulaması demek kadar hızlı, ancak daha hızlı geliştirilebilir. Statükoyu biraz sorgulamak istedim.
J. Polfer

1
@Sheepsimulator Ne yazık ki, sonuncunuz gibi yorumlar bu tartışmacı gibi sorular soruyor.
Kellenjb

Yanıtlar:


11

ARMPIT SCHEME, ARM çekirdeği olan RISC mikrodenetleyicileri üzerinde çalışan Şema dili (Lisp'in sözlüksel olarak kullanılan lehçesi) için bir yorumlayıcıdır. Bazı uzantılar (G / Ç için) ve bazı eksiklikler (MCU belleğine sığacak şekilde) içeren Algoritmik Dil Düzeni (r5rs) Revize Raporundaki açıklamaya dayanmaktadır. Ayrıca çoklu görev ve çoklu işlemeyi desteklemek için tasarlanmıştır. Koltukaltı Şemasının, kontrol ve enstrümantasyon kurslarındaki öğrenci projeleri veya mikrodenetleyicilere ihtiyaç duyulan capstone tasarım kursları dahil olmak üzere eğitim ortamlarına uygun olması beklenmektedir. MCU'lar (örneğin BASIC ve FORTH) için mevcut olan yorumlanmış diller spektrumunu zenginleştirmek ve MCU tabanlı bayt kodu yorumlayıcılarına (örneğin Şema veya Java için) ve derlenmiş dillere (örn. C) alternatif olabilir.

http://armpit.sourceforge.net/

Diyorsun:

C, C ++, derleme vb. Kullanmak Haskell, LISP veya Scheme gibi dillerle karşılaştırıldığında oldukça verimsizdir

Üst düzey diller kullanmak, programcı zamanının daha verimli kullanılmasıdır, ancak genellikle bilgi işlem kaynaklarının daha az verimli kullanılması olabilir. Hacimde üretilen gömülü sistemler için maliyet ve performans genellikle geliştirme çabasından daha yüksek önceliğe sahiptir.



5

C, C ++ ve Assembly'nin hepsi makine diline çok yakın. Daha üst düzey bir dil kullanarak, daha hızlı / daha kolay / vb geliştirme için ek yük eklersiniz.


3
-1: Bu cevaba gerçekten katılmıyorum. Assembly'nin makine diline yakın olma hakkınız olmasına rağmen, C ve C ++ çok farklı üst düzey dillerdir.
BG100

1
@ BG100, aslında "yüksek seviye / düşük seviye" çizgi C içinde bir yere çizmek yerine sadece yüksek seviye bir dil olarak adlandırırdım. Aritmetik, işaretçi (string) işlemleri ve diğer yaygın temel görevleri gerçekleştirirken, derleyicilerin genellikle ürettiği talimatlar, herhangi bir soyutlama katmanı olmadan verileri doğrudan manipüle eder.
Nick T

@Nick T: Anlıyorum, ama şunu düşünün: genellikle mümkün olduğunca hızlı bir şekilde yürütülmesi gereken bir kesme rutini yazarsanız, C'de ne kadar süre çalışacağına dair hiçbir fikriniz olmaz, ancak montajcıda sadece talimatları sayın. Bence düşük seviye programınızda TAMAMEN olduğunu biliyor, C'yi kullandığınızdan emin değilsiniz.
BG100

@ BG100: Aynı montajcı talimatı, işlenenlere ve adresleme modlarına bağlı olarak yürütmek için farklı sayıda döngü alabilir. C de olsa, derledikten sonra değişmeyen (yapamaz) statik kod alırsınız. Doğru, bu biraz acımasız bir argüman, ama eğer minutiae'ye büyük bir kırmızı çizgi çizmeye çalışacağını tartışacaksak ...
Nick T

3

Son zamanlarda Python'da bir ARM panosu programlıyorum ve bence harika. Gerçek zamanlı kontrol için iyi değil, ancak yüksek seviyeli bir dilde C'den çok daha hoş olan web ile ilgili daha fazla şey yapıyorum .


3

Mikrodenetleyicilerin çoğu hala 8 ve 16 bitlik cihazlardır (bu yavaşça değişmesine rağmen). Şimdiye kadar diğer yanıtlarda bahsedilen iki üst düzey dil örneği (Şema ve Python) 32-bit ARM çekirdeğinde çalışıyor. Daha küçük 8 ve 16 bitlik cihazlar (sadece birkaç dolara mal olabilir) belirtilen dilleri desteklemek için yeterli RAM'e sahip değildir - tipik olarak sadece birkaç KB RAM'e sahiptir.

Ayrıca, bu üst düzey diller düşük gecikmeli kesme işleyicileri ve benzerlerini yazmak için tasarlanmamıştır. Bir mikrodenetleyici kesme işleyicisinin saniyede yüzlerce veya binlerce kez çağrılması alışılmadık bir durum değildir ve her seferinde görevini onlarca mikrosaniye veya daha az sürede gerçekleştirmek için gereklidir.


1
Şema, '70'lerin ortalarında ve çok erken' 80'lerde geliştirildi. Şema hiçbir şekilde 32 bit işlemci veya megabayt bellek gerektirmez. Şema 80'lerin ortalarında AT sınıfı PC'ler için mevcuttu. Son uygulamalar daha fazla kaynak açısından zengin ortamlar için optimize edilebilir, ancak günümüzde "küçük" bilgi işlem platformları üzerinde çalışan Şemalara ilişkin net örnekler vardır.
Photon

@Resim Ben düzeltilmiş duruyorum. Onlarca KB belleğe sahip işlemcileri (çoğu küçük mikro denetleyicide mevcut olandan daha fazlasını) hedefleyen BIT projesinin farkında olmama rağmen , Université de Montréal ve Université Laval'daki birkaç öğrenci tarafından tasarlanan PICBIT'i keşfettim , bu da gerçek Şema programlarının 2K kadar az RAM ile PIC işlemciler üzerinde çalışmasına izin verir. Oldukça Muhteşem.
tcrosley

3

Lua dili ile bazı fonksiyonel programlama yapmak mümkündür. Gerçekten, Lua mutli-paradigma bir dildir; Wikipedia bunun 'komut dosyası oluşturma, zorunlu, işlevsel, nesne yönelimli, prototip tabanlı' bir dil olduğunu iddia ediyor. Dil tek bir paradigmayı zorunlu kılmaz, bunun yerine programcının duruma uygulanabilir olan herhangi bir paradigmayı uygulamasına izin verecek kadar esnektir. Şema'dan etkilenmiştir.

Lua'nın özellikleri arasında birinci sınıf fonksiyonlar , sözcüksel kapsam belirleme ve kapanışlar ve fonksiyonel programlama için yararlı olan couteinler bulunmaktadır. Bu özelliklerin işlevsel programlamaya ayrılmış bir sayfası olan Lua kullanıcıları wiki'sinde nasıl kullanıldığını görebilirsiniz . Ben de rastladım bu Google Code projesi (Bu Haskell, Bahsettiğiniz başka dile göre iddia etkilendiği etmez), ama onu kullanmadım.

eLua , ARM7TMDI, Cortex-M3, ARM966E-S ve AVR32 mimarileri için bir dizi geliştirme kartı için yapılandırılmış ve kendi platformunuz için yapılandırabilmeniz için açık kaynaklı bir uygulamadır. Lua, ANSI C'de uygulandı ve tüm kaynak 200kB'nin altında. En az 128k Flash ve 32k RAM önerilir. Şu anda bunun için bir PIC32 portu üzerinde çalışıyorum (yine de 'PIC32 panosunu al' aşamasında).

Lua ile ilgili en iyi şey, bir tutkal dili olarak tasarlanmasıdır, bu nedenle hızlı olması gereken şeyler (kesmeler vb.) İçin C uzantıları yazmak ve dilin dinamik, yorumlanmış özelliklerini hızlı yapmak için kullanmak çok kolaydır. program mantığındaki gelişme.

Lua tamamen işlevsel bir dil değildir, ancak içinde çok sayıda işlevsel programlama yapabilirsiniz, hızlı ve küçüktür ( diğer komut dosyası dillerine kıyasla ) ve bir programı denemek için cihazınızı yeniden yapılandırmanız gerekmez. Etkileşimli bir tercüman bile var!


1

"Zor problemleri çözmek için bir MCU'da işlevsel bir dille işlevsel programlama yapmanın yolları var mı?"

Evet, yolları var. Ama dezavantajı, 32 bit işlemci, MMU, 128MB RAM, SSD, RTOS ve $$$'ye ihtiyacınız var.

Mikrodenetleyiciler mikroişlemcilerden farklıdır. Mikrodenetleyici sadece 8 bit CPU, 1K RAM, 8K ROM olabilir, ancak dahili bir UART, PWM, ADC, vb.'ye sahiptir. Ve sadece 1,30 dolar.

Böylece tüm üst düzey dillerin çalışmasını sağlayabilirsiniz, ancak bunun yapılması çok daha pahalıya mal olur.


2
Mikrodenetleyici tanımınızı tekrar gözden geçirmeniz gerektiğini düşünüyorum. Birçok mikrodenetleyici artık 128kB veya daha fazla Flash'a ve 64kB veya daha fazla RAM'e, bazı ufacık diller için bir tercüman çalıştırmak için bolca alana sahiptir. Gömülü bir Linux aygıtı için spesifikasyonlar verdiğiniz anlaşılıyor; Bence OP adanmış bir liman istiyordu.
Kevin Vermeer

1
8 bit MCU için 1,30 $ ödüyorsanız, daha ucuz olan birkaç 32 bit MCU vardır. Ayrıca, piyasadaki 8 bitlik MCU'ların çoğunun kodların etkisiz mimarileri olduğunu ve 80'lerin başından itibaren miras alınan tasarımlar olduğunu göz önünde bulundurun.
Lundin

0

Bu kitap hafif bir FP hissi ile programlama yapmak için bir yol sağlar. http://www.state-machine.com/psicc2/

Ancak gerçek FP, çalışma zamanında işlevler oluşturma ve bunları programınızdan geçirme yeteneğine sahip olmayı gerektirir. Burada bir sorunumuz var: Bu inşa edilmiş işlevi nasıl temsil edebiliriz? ve bu işlevi etkili bir şekilde nasıl yürütebiliriz? Büyük bir sistemde, birinci fonksiyon uygulamasında gerçek makine kodu üreten dinamik derlemeyi kullanabiliriz. MCU'da, Forth dil çekirdeği gibi çok ilkel derleyicileri uygulamak için sadece RAM'imiz var.

Ne olduğunu tercih ediyorsanız tek yolu FP veya OOP kullanabilirsiniz metaprogramming : yazma karmaşık fonksiyonel / OOP MCU için programlar oluşturmak programları (örneğin C kaynak kodu veya LLVM IL). Bu varyantta, paradigma veya programlama yöntemlerinin karmaşıklığıyla sınırlı değilsiniz.

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.