Programación funcional con MCU (s)

12

Idiomas funcionales como Haskell, LISP o Scheme permiten que un programador trabaje rápidamente usando programación funcional paradigma. Tienen sus ineficiencias , pero mi aplicación hace mayor hincapié en la eficiencia del programador que en la eficiencia del programa en sí.

Me gustaría usar la programación funcional en un microcontrolador para hacer el control de la máquina, etc.

¿Qué limitaciones existen, como los recursos mínimos del sistema?
¿Qué ejemplos de implementaciones de estos lenguajes están disponibles?

    
pregunta J. Polfer

7 respuestas

11
  

ARMPIT SCHEME es un intérprete para   El lenguaje del esquema (de ámbito léxico)   dialecto de Lisp) que se ejecuta en RISC   Microcontroladores con núcleo ARM. Es   basado en la descripción en el   Informe revisado sobre el algoritmo   Esquema de lenguaje (r5rs), con algunos   extensiones (para I / O) y algunas   omisiones (para encajar dentro de la memoria de MCU).   Además está diseñado para soportar   Multitarea y multiprocesamiento.   Se espera que el Armpit Scheme esté bien   adecuado para entornos educativos,   Incluyendo proyectos de estudiantes en cursos.   en control e instrumentación, o   cursos de diseño de piedra angular donde   Se necesitan microcontroladores. Es   destinado a enriquecer el espectro de   lenguajes interpretados disponibles para   MCUs (por ejemplo, BASIC y FORTH) y pueden ser   una alternativa al bytecode basado en MCU   intérpretes (por ejemplo, para Scheme o Java)   y para los lenguajes compilados (por ejemplo, C).

enlace

Usted dice:

  

Usar C, C ++, ensamblaje, etc. es bastante ineficiente en comparación con lenguajes como Haskell, LISP o Scheme

El uso de lenguajes de alto nivel es un uso más eficiente del tiempo del programador, pero a menudo puede ser un uso menos eficiente de los recursos informáticos. Para los sistemas integrados fabricados en volumen, el costo y el rendimiento son a menudo una prioridad más alta que el esfuerzo de desarrollo.

    
respondido por el Toby Jaffey
7

También puede programar controladores AVR con Haskell usando Atom / Copilot, por ejemplo enlace

    
respondido por el Peter
5

C, C ++ y Assembly están muy cerca del lenguaje de máquina. Al usar un lenguaje de nivel superior, está agregando una sobrecarga adicional a cambio de un desarrollo más rápido / más fácil / etc.

    
respondido por el pfyon
3

Recientemente he estado programando una placa ARM en Python, y creo que es genial. No es bueno para el control en tiempo real, pero estoy haciendo más cosas relacionadas con la web, que es mucho más agradable en un lenguaje de alto nivel que en C.

    
respondido por el pingswept
3

La mayoría de los microcontroladores son dispositivos de 8 y 16 bits (aunque esto está cambiando lentamente). Las dos instancias de lenguajes de nivel superior (Scheme y Python) mencionados en otras respuestas hasta ahora se ejecutan en núcleos ARM de 32 bits. Los dispositivos más pequeños de 8 y 16 bits (que pueden costar solo un par de dólares) no tienen suficiente RAM para admitir los idiomas mencionados, por lo general, solo tienen unos pocos KB de RAM.

Además, estos idiomas de nivel superior no están diseñados para escribir controladores de interrupción de baja latencia y similares. No es inusual que un controlador de interrupción de microcontrolador sea llamado cientos o miles de veces por segundo, y cada vez se requiere que realice su tarea en decenas de microsegundos o menos.

    
respondido por el tcrosley
3

Es posible hacer alguna programación funcional con el lenguaje Lua. Realmente, Lua es un lenguaje de paradigma múltiple; Wikipedia afirma que es un lenguaje de 'scripting, imperativo, funcional, orientado a objetos, basado en prototipos'. El lenguaje no impone un solo paradigma, sino que es lo suficientemente flexible para permitir que el programador implemente cualquier paradigma aplicable a la situación. Ha sido influenciado por Scheme.

Las funciones de Lua incluyen funciones de primera clase , alcance y cierres léxicos y coroutines , que son útiles para Programación funcional. Puede ver cómo se utilizan estas funciones en la wiki de usuarios de Lua, que tiene una página dedicada a la programación funcional . También me topé con este proyecto de Google Code , pero no lo he usado (reclamo estar influenciado por Haskell, otro idioma que mencionaste).

eLua es una implementación que está disponible configurada para una serie de placas de desarrollo para ARM7TMDI, Cortex-M3, ARM966E-S y Arquitecturas AVR32, y es de código abierto para que pueda configurarlo para su propia plataforma. Lua se implementa en ANSI C y la fuente completa pesa menos de 200 kB, por lo que debería poder compilarlo para la mayoría de las plataformas con un compilador de C. Se recomiendan al menos 128k de Flash y 32k de RAM. Estoy trabajando en un puerto PIC32 para eso (aunque todavía estoy en la etapa 'Obtener la placa PIC32') en este momento.

Lo bueno de Lua es que fue diseñado como un lenguaje de cola, por lo que es muy fácil escribir extensiones C para las cosas que deben ser rápidas (como interrupciones, etc.) y usar las funciones dinámicas e interpretadas del lenguaje. Hacer rápido desarrollo en la lógica del programa.

Lua no es un lenguaje puramente funcional, pero puedes hacer mucha programación funcional, es rápido y pequeño ( en comparación con otros lenguajes de scripting ), y no es necesario volver a instalar el dispositivo para probar un programa. ¡Incluso hay un intérprete interactivo!

    
respondido por el Kevin Vermeer
1

"¿Hay formas de realizar una programación funcional con un lenguaje funcional en una MCU para resolver problemas difíciles?"

Sí, hay maneras. Pero el inconveniente es que necesita un procesador de 32 bits, MMU, 128 MB de RAM, SSD, un RTOS y $$$.

Los microcontroladores son diferentes a los microprocesadores. El microcontrolador solo puede ser una CPU de 8 bits, 1K RAM, 8K ROM, pero tiene un UART, PWM, ADC, etc. integrados y solo cuesta $ 1.30.

Por lo tanto, podrías tener todos los lenguajes de alto nivel en ejecución, pero cuesta mucho más hacerlo.

    
respondido por el Robert

Lea otras preguntas en las etiquetas