Функціональне програмування з MCU


12

Функціональні мови, такі як Haskell, LISP або Scheme, дозволяють програмісту швидко працювати, використовуючи функціональну парадигму програмування . Вони мають свою неефективність , але мій додаток робить більший акцент на ефективності програміста, ніж на ефективності самої програми.

Я б хотів використовувати функціональне програмування на мікроконтролері для управління машиною тощо.

Які обмеження існують, наприклад, мінімальні системні ресурси?
Який приклад реалізації цих мов доступний?


1
Якщо ваше запитання "Чи не варто програмувати будь-яку машину з найпотужнішою мовою програмування, яку ви можете отримати в своїх руках", питання C ++ та Java рекомендується читати (про OOP, а не про функціональне програмування).
Кевін Вермер

1
Ваш перший абзац сприймається як аргументований, завдяки чому ви набрали декілька голосів. Подумайте про те, щоб переформулювати щось більш пасивне ("Мені цікаво використовувати функціональне програмування для управління машиною, які приклади є для реалізації вбудованих систем Haskell / LISP / Scheme") або видалити його повністю.
Кевін Вермер

2
Я не купую ваше "неефективне" твердження. Ви, здається, проявляєте надзвичайну упередженість щодо сторони хобі / прототипу - низький об'єм (ака: 1). C / C ++ / asm призводить до меншого, швидшого коду, який посилюється тисячі чи мільйони разів, коли ви можете використовувати процесори з достатньою швидкістю та простором. Вбудований вбудований. Ви не програмуєте на ОС загального призначення.
Нік Т

4
@ Nick T - "C / C ++ / asm призводить до меншого, більш швидкого коду, який посилюється тисячі чи мільйони разів, коли ви можете використовувати процесори з достатньою швидкістю та простором" - що з технічним обслуговуванням? Функціональна мова часто може робити в одному рядку те, що C-програмі потрібно робити 10 секунд, тобто менше місця для помилок. Крім того, їх можна виконати (тобто Haskell) та змусити бігти по цілі, що швидше, ніж перекладачі. Я хотів трохи вивчити цю тему, тому що складений Haskell може бути так само швидким, але швидшим для розвитку, ніж скажімо додаток C. Хотіли трохи поставити під сумнів статус-кво.
Дж. Полфер

1
@Sheepsimulator На жаль, такі коментарі, як ваш останній, викликають такі аргументативні питання.
Kellenjb

Відповіді:


11

ARMPIT SCHEME - інтерпретатор мови схеми (лексично-діапазонний діалект Lisp), який працює на мікроконтролерах RISC з ядром ARM. Він заснований на описі в переглянутому звіті про алгоритмічну мовну схему (r5rs), з деякими розширеннями (для вводу / виводу) та деякими упущеннями (для вміщення в пам'ять MCU). Крім того, він розроблений для підтримки багатозадачності та багатопроцесорності. Очікується, що схема пахви буде добре підходити до навчальних закладів, включаючи студентські проекти на курсах з контролю та приладів, або курси з дизайну шапочки, де потрібні мікроконтролери. Він покликаний збагатити спектр інтерпретованих мов, доступних для MCU (наприклад, BASIC і FORTH) і може бути альтернативою інтерпретаторам байт-кодів на базі MCU (наприклад, для Scheme або Java) та для компільованих мов (наприклад, C).

http://armpit.sourceforge.net/

Ти кажеш:

Використання C, C ++, складання тощо є досить неефективним порівняно з мовами, такими як Haskell, LISP або Scheme

Використання мов високого рівня - це більш ефективне використання програмного часу, але часто може бути менш ефективним використанням обчислювальних ресурсів. Для вбудованих систем, виготовлених за обсягом, вартість та продуктивність часто є пріоритетнішими, ніж зусилля з розробки.



5

C, C ++ і Assembly дуже близькі до машинної мови. Використовуючи мову вищого рівня, ви додаєте додаткові накладні витрати в обмін на більш швидкий / простіший / тощо.


3
-1: Я не дуже згоден з цією відповіддю. Хоча ваше право щодо того, що збірка наближена до машинної мови, C і C ++ є дуже різними мовами високого рівня.
BG100

1
@ BG100, я б фактично намалював лінію "високий рівень / низький рівень" десь у межах C, а не просто називав би це мова високого рівня. Під час виконання арифметичних, вказівних (рядкових) операцій та інших поширених основних завдань інструкції, які компілятори, як правило, виробляють, ЦП безпосередньо керує даними без будь-яких шарів абстракції.
Нік Т

@ Nick T: Я бачу вашу думку, але врахуйте це: якщо ви пишете процедуру переривання, яку, як правило, потрібно виконати якнайшвидше, в C ви б не мали поняття, скільки часу це займе, але в асемблері ви могли б просто порахуйте інструкції. Я думаю, що низький рівень знає, що ТОЧНО відбувається у вашій програмі, ви цього точно не знаєте, чи використовуєте C.
BG100

@ BG100: та сама інструкція асемблера може зайняти різну кількість циклів для виконання на основі операндів та режимів їх адресації. Хоча в C, після компіляції ви отримуєте статичний код, який не може (не може) змінюватися. Щоправда, це дещо поважний аргумент, але якщо ми збираємось сперечатися у деталях, щоб спробувати намалювати велику червону лінію ...
Nick T

3

Я нещодавно програмував плату ARM в Python, і думаю, що це чудово. Це не корисно для контролю в режимі реального часу, але я роблю більше матеріалів, пов’язаних з Інтернетом, що набагато приємніше на мові високого рівня, ніж на С.


3

Більшість мікроконтролерів все ще є 8 і 16-бітними пристроями (хоча це повільно змінюється). Два екземпляри мов вищого рівня (схема та Python), згадані в інших відповідях поки що, працюють на 32-бітних ядрах ARM. Менші 8 та 16-бітні пристрої (які можуть коштувати всього пару доларів) не мають достатньої кількості оперативної пам’яті для підтримки згаданих мов - зазвичай вони мають лише кілька КБ оперативної пам’яті.

Крім того, ці мови вищого рівня не розроблені для написання обробників переривань з низькою затримкою тощо. Незвично, що обробник переривання мікроконтролера може дзвонити сотні чи тисячі разів на секунду, і кожен раз, коли потрібно виконувати своє завдання в десятки мікросекунд або менше.


1
Схема була розроблена в середині кінця 70-х та дуже початку 80-х. У жодному разі схемі не потрібен 32-бітний процесор або мегабайти пам'яті. Схема була доступна для ПК класу AT в середині 80-х. Останні реалізації можуть бути оптимізовані для більш багатих ресурсів середовищ, але є чіткі приклади схем, які працюють на тих, що нині "мінімізують" обчислювальні платформи.
Фотон

@ThePhoton я стою виправлений. Хоча мені було відомо про проект BIT, який націлений на процесори з десятками КБ пам’яті (більше того, що доступно для більшості невеликих мікроконтролерів), я щойно відкрив PICBIT , розроблений парою студентів на університетах Монреаль та Université Laval, що дозволяє реальним програмам Scheme запускатись на PIC-процесорах із всього 2К ОЗУ. Досить дивовижно.
tcrosley

3

Можна виконати деякі функціональні програми з мовою Lua. Дійсно, Луа - мова мулі-парадигми; Вікіпедія стверджує, що це "сценарій, імператив, функціонал, об'єктно-орієнтована, заснована на прототипі" мова. Мова не застосовує єдиної парадигми, але натомість є досить гнучкою, що дозволяє програмісту реалізувати будь-яку парадигму, застосовну до ситуації. На це вплинула схема.

Особливості Lua включають в себе першокласні функції , лексичне обстеження та закриття та супроводи , які корисні для функціонального програмування. Ви можете бачити, як ці функції використовуються на вікі користувачів Lua, на якій є сторінка, присвячена функціональному програмуванню . Я також натрапив на цей проект Google Code , але не використовував його (він, як стверджує, на нього впливає Haskell, інша мова, яку ви згадали).

eLua - це реалізація, яка доступна, налаштована для декількох плат розробок для архітектур ARM7TMDI, Cortex-M3, ARM966E-S та AVR32 і є відкритим кодом, щоб ви могли налаштувати її для власної платформи. Lua реалізований в ANSI C, і все джерело важить менше 200 кБ, тому ви повинні мати можливість створити його для більшості платформ із компілятором C. Рекомендується принаймні 128 кб Flash та 32 кб оперативної пам’яті. Я зараз працюю над портом PIC32 (все ще перебуваю на етапі "Отримати дошку PIC32").

Чудова річ у Lua полягає в тому, що вона була розроблена як клейова мова, тому писати розширення на C дуже просто (наприклад, переривання тощо), і використовувати динамічні, інтерпретовані функції мови, щоб робити це швидко розвиток у логіці програми.

Lua не є суто функціональною мовою, але ви можете робити багато функціональних програмувань на ній, це швидко і мало ( порівняно з іншими мовами сценаріїв ), і вам не потрібно переробляти свій пристрій, щоб спробувати програму. Є навіть інтерактивний перекладач!


1

"Чи існують способи зробити функціональне програмування з функціональною мовою на MCU для вирішення складних проблем?"

Так, є способи. Але недолік - вам потрібен 32-бітний процесор, MMU, 128 Мб оперативної пам'яті, SSD, RTOS та $$$.

Мікроконтролери відрізняються від мікропроцесорів. Мікроконтролер може бути лише 8-бітним процесором, 1К ОЗУ, 8К ПЗУ, але він має вбудовані UART, PWM, ADC тощо. І коштує він лише 1,30 долара.

Таким чином, ви можете працювати з усіма мовами високого рівня, але це коштує набагато більше.


2
Я думаю, вам потрібно переглянути своє визначення мікроконтролера. Зараз багато мікроконтролерів мають 128 КБ або більше флеш-пам’яті та 64 КБ або більше оперативної пам’яті, достатньо місця для роботи інтерпретатора для деяких малих мов. Схоже, ви даєте характеристики для вбудованого пристрою Linux; Я думаю, що ОП просили виділити спеціальний порт.
Кевін Вермер

1
Якщо ви платите 1,30 долара за 8-бітний MCU, то є кілька 32-бітних MCU, які дешевші. Крім того, врахуйте, що більшість 8-бітних MCU на ринку - жахливо неефективні архітектури, дизайни, успадковані з початку 80-х.
Лундін

0

Ця книга пропонує певний спосіб програмування з легким відчуттям FP. http://www.state-machine.com/psicc2/

Але справжні FP вимагають можливості конструювати функції під час виконання та передавати їх у вашу програму. Тут у нас є проблема: як ми можемо представити цю побудовану функцію? і як ми можемо ефективно виконувати цю функцію? У великій системі ми можемо використовувати динамічну компіляцію, яка генерує реальний машинний код на першому додатку функції. У MCU у нас є лише оперативна пам'ять, яка реалізує дуже примітивні компілятори, такі як ядро ​​Forth.

Єдиний спосіб використовувати FP або OOP, якщо ви віддаєте перевагу, це метапрограмування : записуйте складні функціональні / OOP програми, які генерують програми для MCU (наприклад, вихідний код C або LLVM IL). У цьому варіанті ви не обмежуєтесь складністю парадигми чи методів програмування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.