使用MCU进行功能编程


12

诸如Haskell,LISP或Scheme之类的功能语言使程序员可以使用功能编程范例来快速工作。它们确实有效率低下的问题,但是我的应用程序比程序本身的效率更加强调程序员的效率。

我想在微控制器上使用函数式编程来进行机器控制等。

有哪些限制,例如最少的系统资源?
这些语言有哪些示例实现?


1
如果您的问题是“ 用您可以使用的功能最强大的编程语言对任何机器进行编程是否值得”,则建议阅读C ++Java问题(关于OOP而不是函数式编程)。
凯文·维米尔

1
您的第一段是有争议的,这使您获得了几票成功。考虑改写更被动的内容(“我对使用函数式编程进行机器控制感兴趣,对于嵌入式系统,Haskell / LISP / Scheme实现有哪些示例”)或将其完全删除。
凯文·维米尔

2
我不买你的“无效”声明。您似乎对爱好者/原型方面表现出极大的偏见-低音量(aka:1)。C / C ++ / asm可以产生更小,更快的代码,当您可以以足够的速度和空间使用处理器时,它们可以放大数千或数百万倍。嵌入式是嵌入式的。您不是在通用操作系统上编程。
尼克T

4
@Nick T-“ C / C ++ / asm导致更小,更快的代码,当您可以以足够的速度和空间使用处理器时,这些代码将放大数千或数百万次”-维护又如何呢?功能语言通常可以单行完成C程序需要10秒钟才能完成的工作,这意味着较小的bug空间。另外,它们可以被编译(即Haskell),并可以在目标上运行,这比解释器要快。我想稍微探讨一下这个话题,因为经过编译的Haskell可能和C应用程序一样快,但是开发起来更快。想质疑现状。
J. Polfer 2011年

1
@Sheepsimulator不幸的是,像您上一个这样的评论使诸如此类的话题成为问题。
Kellenjb

Answers:


11

ARMPIT SCHEME是Scheme语言(Lisp的词法范围的方言)的解释器,该语言在具有ARM内核的RISC微控制器上运行。它基于对算法语言方案(r5rs)的修订报告中的描述,具有一些扩展名(用于I / O)和一些省略项(以适合MCU内存)。它被进一步设计为支持多任务和多处理。腋窝计划预计将非常适合教育环境,包括控制和仪器课程的学生项目,或需要微控制器的顶点设计课程。它旨在丰富可用于MCU(例如BASIC和FORTH)的解释语言的范围,并且可以替代基于MCU的字节码解释器(例如,用于Scheme或Java)和编译语言(例如,C)。

http://armpit.sourceforge.net/

你说:

与Haskell,LISP或Scheme之类的语言相比,使用C,C ++,汇编等的效率很低

使用高级语言可以更有效地利用程序员的时间,但通常可能不那么有效地利用计算资源。对于批量生产的嵌入式系统,成本和性能通常比开发工作具有更高的优先级。



5

C,C ++和Assembly都非常接近于机器语言。通过使用高级语言,您将增加额外的开销,以换取更快/更容易的/ etc开发。


3
-1:我不太同意这个答案。尽管您关于汇编的权利接近机器语言,但是C和C ++是非常不同的高级语言。
BG100 2011年

1
@ BG100,我实际上是在C内某处绘制“高/低级”线,而不是将其称为高级语言。在执行算术,指针(字符串)操作和其他常见的基本任务时,编译器通常生成的指令使CPU直接操作数据而无需任何抽象层。
尼克T

@Nick T:我明白你的意思,但是请考虑一下:如果编写一个通常需要尽快执行的中断例程,则在C中您将不知道要花多长时间才能运行,但是在汇编器中您可以只需计算说明即可。我认为,低水平知道到底是在你的程序正在进行中,如果您使用C.你不知道这是肯定的
BG100

@ BG100:同一汇编程序指令可以根据操作数及其寻址方式执行不同数量的循环来执行。尽管在C语言中,一旦编译,您将获得不会(无法)更改的静态代码。没错,这是一个有点微不足道的论点,但是如果我们要争论细节要画一条大的红线……
Nick T

3

我最近一直在用Python对ARM板进行编程,我认为这很棒。它是实时控制不好,但我做更多的网络相关的东西,这是远远更舒适的高级语言比C.


3

大多数微控制器仍然是8位和16位设备(尽管这种情况正在慢慢改变)。到目前为止,其他答案中提到的两种高级语言实例(Scheme和Python)都在32位ARM内核上运行。较小的8位和16位设备(可能只需要花费几美元)就没有足够的RAM来支持所提到的语言-通常,它们只有几KB的RAM。

同样,这些高级语言也不是为编写低延迟中断处理程序等而设计的。微控制器的中断处理程序每​​秒被调用数百次或数千次,每次执行任务所需的时间都在数十微秒或更短的时间内,这种情况并不罕见。


1
该计划是在70年代中期和80年代初期开发的。Scheme绝对不要求32位处理器或兆字节的内存。该方案可在80年代中期用于AT级PC。最近的实现可能针对资源丰富的环境进行了优化,但是有明显的Scheme实例可以在当今的“微型”计算平台上运行。
Photon

@ThePhoton我纠正了。尽管我知道BIT项目的目标是具有数十KB内存的处理器(比大多数小型微控制器所能提供的更多),但我还是发现了PICBIT,它是由蒙特利尔大学和拉瓦尔大学的几个学生设计的,它允许真正的Scheme程序在仅2K RAM的PIC处理器上运行。相当了不起。
tcrosley

3

可以使用Lua语言进行一些功能编程。实际上,Lua是一种多范式语言。维基百科声称它是一种“脚本,命令式,功能性,面向对象,基于原型的”语言。该语言不执行单一范例,而是足够灵活以允许程序员实施适用于该情况的任何范例。受方案影响。

Lua的功能包括 一流的函数词法作用域,闭包协程,这些对函数式编程很有用。您可以在Lua用户Wiki上看到如何使用这些功能,该页面一个专门介绍函数式编程的页面。我也遇到了这个Google Code项目,但是我没有使用过它(它确实受到了您提到的另一种语言Haskell的影响)。

eLua是一种实现,可以为许多用于ARM7TMDI,Cortex-M3,ARM966E-S和AVR32架构的开发板进行配置,并且是开源的,因此您可以针对自己的平台进行配置。Lua是在ANSI C中实现的,整个源的重量不到200kB,因此您应该能够使用C编译器为大多数平台构建它。建议至少使用128k Flash和32k RAM。目前,我正在为此使用PIC32端口(尽管仍处于“获取PIC32电路板”阶段)。

Lua的伟大之处在于它被设计为一种粘合语言,因此为需要快速处理的东西(如中断等)编写C扩展非常容易,并使用该语言的动态,解释功能来快速完成在程序逻辑中发展。

Lua并不是一种纯粹的功能语言,但是您可以使用它进行大量的功能编程,它既快速又小巧(与其他脚本语言相比),并且您无需重新刷新设备即可试用程序。甚至还有一个互动翻译!


1

“有没有办法在MCU上使用功能语言进行功能编程来解决难题?”

是的,有办法。但缺点是您需要32位处理器,MMU,128MB RAM,SSD,RTOS和$$$。

微控制器不同于微处理器。该微控制器可能只是一个8位CPU,1K RAM,8K ROM,但是它具有内置的UART,PWM,ADC等。它的价格仅为1.30美元。

因此,您可以运行所有这些高级语言,但制作成本要高得多。


2
我认为您需要重新审视微控制器的定义。现在,许多微控制器具有128kB或以上的Flash,以及64kB或以上的RAM,还有足够的空间来运行一些较小的语言的解释器。看起来您正在提供嵌入式Linux设备的规格。我认为OP正在要求专用端口。
凯文·维米尔

1
如果您为一台8位MCU支付1.30美元,则有几款便宜的32位MCU。此外,还要考虑到市场上大多数8位MCU都是可怕的代码无效架构,其设计是从80年代初期继承而来的。
伦丁

0

本书提供了一些在FP的情况下进行编程的方法。 http://www.state-machine.com/psicc2/

但是,真正的FP需要具有在运行时构造函数并将其传递给整个程序的能力。这里有一个问题:我们如何表示此构造函数?以及我们如何有效执行此功能?在大型系统上,我们可以使用动态编译在第一功能应用程序上生成真实的机器代码。在MCU上,我们只有RAM来实现非常原始的编译器,例如Forth语言内核。

如果愿意,可以使用FP或OOP的唯一方法是元编程编写复杂的功能/ OOP 程序,这些程序会为MCU生成程序(例如C源代码或LLVM IL)。在此变体中,您不受范式或编程方法复杂性的限制。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.