Lập trình chức năng với MCU (s)


12

Các ngôn ngữ chức năng như Haskell, LISP hoặc Scheme cho phép lập trình viên làm việc nhanh chóng bằng cách sử dụng mô hình lập trình chức năng . Họ không có hiệu quả , nhưng ứng dụng của tôi chú trọng nhiều hơn đến hiệu quả lập trình viên hơn là hiệu quả của chính chương trình.

Tôi muốn sử dụng lập trình chức năng trên một vi điều khiển để điều khiển máy, v.v.

Những hạn chế là gì, chẳng hạn như tài nguyên hệ thống tối thiểu?
Những ví dụ triển khai của các ngôn ngữ này có sẵn?


1
Nếu câu hỏi của bạn là "Không đáng để lập trình cho bất kỳ máy nào có ngôn ngữ lập trình mạnh nhất mà bạn có thể sử dụng được", thì các câu hỏi C ++Java được khuyến nghị đọc (về OOP thay vì lập trình chức năng).
Kevin Vermeer

1
Đoạn đầu tiên của bạn xuất hiện dưới dạng tranh luận, đã thu được cho bạn một vài phiếu gần. Xem xét viết lại một cái gì đó thụ động hơn ("Tôi quan tâm đến việc sử dụng lập trình chức năng để điều khiển máy, ví dụ nào về việc triển khai Haskell / LISP / Scheme cho các hệ thống nhúng") hoặc xóa hoàn toàn.
Kevin Vermeer

2
Tôi không mua tuyên bố "không hiệu quả" của bạn. Bạn dường như thể hiện sự thiên vị cực đoan đối với người có sở thích / nguyên mẫu - âm lượng thấp (hay còn gọi là: 1). C / C ++ / asm dẫn đến mã nhỏ hơn, nhanh hơn được khuếch đại hàng nghìn hoặc hàng triệu lần khi bạn có thể sử dụng bộ xử lý với tốc độ và không gian vừa đủ. Nhúng được nhúng. Bạn không lập trình trên HĐH đa năng.
Nick T

4
@Nick T - "C / C ++ / asm dẫn đến mã nhỏ hơn, nhanh hơn được khuếch đại hàng nghìn hoặc hàng triệu lần khi bạn có thể sử dụng bộ xử lý với tốc độ và không gian vừa đủ" - còn bảo trì thì sao? Một ngôn ngữ chức năng có thể thường xuyên thực hiện trong một dòng duy nhất mà chương trình C yêu cầu 10 giây phải làm, nghĩa là ít chỗ hơn cho các lỗi. Ngoài ra, chúng có thể được tuân thủ (tức là Haskell) và được thực hiện để chạy trên mục tiêu, nhanh hơn trình thông dịch. Tôi muốn khám phá chủ đề này một chút vì Haskell đã được biên dịch có thể nhanh như vậy, nhưng phát triển nhanh hơn so với ứng dụng C nói. Muốn đặt câu hỏi về hiện trạng một chút.
J. Polfer

1
@Sheepsimulator Thật không may, các bình luận như người cuối cùng của bạn đưa ra các câu hỏi như tranh luận này.
Kellenjb

Câu trả lời:


11

ARMPIT SCHEME là một trình thông dịch cho ngôn ngữ Scheme (phương ngữ có phạm vi từ vựng của Lisp) chạy trên các bộ vi điều khiển RISC với lõi ARM. Nó dựa trên mô tả trong Báo cáo sửa đổi về Lược đồ ngôn ngữ thuật toán (r5rs), với một số phần mở rộng (cho I / O) và một số thiếu sót (để phù hợp với bộ nhớ MCU). Nó được thiết kế thêm để hỗ trợ đa nhiệm và đa xử lý. Dự án Armpit dự kiến ​​sẽ rất phù hợp với các môi trường giáo dục, bao gồm các dự án của sinh viên trong các khóa học về kiểm soát và thiết bị, hoặc các khóa học thiết kế capstone nơi cần đến vi điều khiển. Nó có nghĩa là làm phong phú phổ tần của các ngôn ngữ được dịch cho MCU (ví dụ BASIC và FORTH) và có thể thay thế cho các trình thông dịch mã byte dựa trên MCU (ví dụ: đối với Scheme hoặc Java) và các ngôn ngữ được biên dịch (ví dụ: C).

http://armpit.sourceforge.net/

Bạn nói:

Sử dụng C, C ++, lắp ráp, v.v ... khá kém hiệu quả so với các ngôn ngữ như Haskell, LISP hoặc Scheme

Sử dụng các ngôn ngữ cấp cao là việc sử dụng thời gian lập trình viên hiệu quả hơn, nhưng thường có thể là việc sử dụng tài nguyên máy tính kém hiệu quả hơn. Đối với các hệ thống nhúng được sản xuất về khối lượng, chi phí và hiệu suất thường được ưu tiên cao hơn nỗ lực phát triển.



5

C, C ++ và hội đều rất gần với ngôn ngữ máy. Bằng cách sử dụng ngôn ngữ cấp cao hơn, bạn sẽ thêm chi phí bổ sung để đổi lấy sự phát triển nhanh hơn / dễ dàng hơn / vv.


3
-1: Tôi không thực sự đồng ý với câu trả lời này. Mặc dù quyền của bạn về hội gần với ngôn ngữ máy, C và C ++ là các ngôn ngữ cấp cao rất khác nhau.
BG100

1
@ BG100, tôi thực sự vẽ đường "mức cao / mức thấp" ở đâu đó trong C thay vì chỉ gọi nó là ngôn ngữ cấp cao. Khi thực hiện các phép toán số học, con trỏ (chuỗi) và các tác vụ cơ bản phổ biến khác, các lệnh mà trình biên dịch thường tạo ra có CPU trực tiếp thao tác dữ liệu mà không có bất kỳ lớp trừu tượng nào.
Nick T

@Nick T: Tôi thấy quan điểm của bạn, nhưng hãy xem xét điều này: nếu bạn viết một thói quen ngắt thường cần thực hiện càng nhanh càng tốt, trong C bạn sẽ không biết sẽ mất bao lâu để chạy, nhưng trong trình biên dịch chương trình, bạn có thể Chỉ cần đếm hướng dẫn. Tôi nghĩ mức độ thấp là biết CHÍNH XÁC đang diễn ra trong chương trình của bạn, bạn không biết điều này chắc chắn nếu bạn sử dụng C.
BG100

@ BG100: cùng một lệnh trình biên dịch chương trình biên dịch có thể thực hiện các số chu kỳ khác nhau để thực hiện dựa trên toán hạng và chế độ địa chỉ của chúng. Mặc dù trong C, một khi bạn biên dịch, bạn nhận được mã tĩnh không (không thể) thay đổi. Đúng, đây là một cuộc tranh luận có phần khó hiểu, nhưng nếu chúng ta sẽ tranh luận về những chi tiết vụn vặt để cố vẽ một đường màu đỏ lớn ...
Nick T

3

Gần đây tôi đã lập trình một bảng ARM trong Python và tôi nghĩ nó thật tuyệt. Không có gì tốt để kiểm soát thời gian thực, nhưng tôi đang làm nhiều thứ liên quan đến web, đó là xa dễ chịu hơn trong một ngôn ngữ cấp cao hơn trong C.


3

Phần lớn các bộ vi điều khiển vẫn là các thiết bị 8 và 16 bit (mặc dù điều này đang dần thay đổi). Hai trường hợp ngôn ngữ cấp cao hơn (Scheme và Python) được đề cập trong các câu trả lời khác cho đến nay đều chạy trên lõi ARM 32 bit. Các thiết bị 8 và 16 bit nhỏ hơn (có thể chỉ tốn một vài đô la) không có đủ RAM để hỗ trợ các ngôn ngữ được đề cập - thông thường chúng chỉ có vài KB RAM.

Ngoài ra, các ngôn ngữ cấp cao hơn này không được thiết kế để viết các trình xử lý ngắt có độ trễ thấp và tương tự. Không có gì lạ khi trình xử lý ngắt vi điều khiển được gọi hàng trăm hoặc hàng nghìn lần mỗi giây và mỗi lần cần để thực hiện nhiệm vụ của mình trong hàng chục micro giây hoặc ít hơn.


1
Lược đồ được phát triển vào giữa cuối thập niên 70 và đầu thập niên 80. Scheme không yêu cầu bộ xử lý 32 bit hoặc bộ nhớ megabyte. Đề án đã có sẵn cho các PC loại AT vào giữa những năm 80. Các triển khai gần đây có thể được tối ưu hóa cho các môi trường giàu tài nguyên hơn, nhưng có các ví dụ rõ ràng về các Lược đồ chạy trên nền tảng điện toán "miniscule" ngày nay.
Photon

@ThePhoton tôi đứng sửa. Mặc dù tôi biết về dự án BIT, nhắm vào các bộ xử lý có hàng chục KB bộ nhớ (nhiều hơn những gì có sẵn trên hầu hết các bộ vi điều khiển nhỏ), tôi mới phát hiện ra PICBIT , được thiết kế bởi một vài sinh viên tại Đại học Montréal và Đại học Laval, cho phép các chương trình Scheme thực chạy trên bộ xử lý PIC chỉ với 2K RAM. Khá tuyệt vời.
tcrosley

3

Có thể thực hiện một số chương trình chức năng với ngôn ngữ Lua. Thực sự, Lua là một ngôn ngữ mutli-paradigm; Wikipedia tuyên bố rằng đó là ngôn ngữ 'kịch bản, bắt buộc, chức năng, hướng đối tượng, dựa trên nguyên mẫu'. Ngôn ngữ không thực thi một mô hình duy nhất, nhưng thay vào đó, đủ linh hoạt để cho phép lập trình viên thực hiện bất kỳ mô hình nào có thể áp dụng cho tình huống. Nó bị ảnh hưởng bởi Đề án.

Các tính năng của Lua bao gồm các chức năng hạng nhất , phạm vi từ vựng và các bao đóngcoroutines , rất hữu ích cho lập trình chức năng. Bạn có thể thấy các tính năng này được sử dụng như thế nào trên wiki người dùng Lua, có một trang dành riêng cho lập trình chức năng . Tôi cũng đã xem qua dự án Google Code này , nhưng tôi chưa sử dụng nó (nó tuyên bố bị ảnh hưởng bởi Haskell, một ngôn ngữ khác mà bạn đã đề cập).

eLua là một triển khai có sẵn được cấu hình cho một số bảng phát triển cho các kiến ​​trúc ARM7TMDI, Cortex-M3, ARM966E-S và AVR32 và là nguồn mở để bạn có thể định cấu hình cho nền tảng của riêng mình. Lua được triển khai trong ANSI C và toàn bộ nguồn có trọng lượng dưới 200kB, vì vậy bạn có thể xây dựng nó cho hầu hết các nền tảng với trình biên dịch C. Nên sử dụng ít nhất 128k Flash và 32k RAM. Tôi đang làm việc trên một cổng PIC32 cho nó (vẫn đang trong giai đoạn 'Nhận bảng PIC32').

Điều tuyệt vời ở Lua là nó được thiết kế như một ngôn ngữ keo, do đó, rất dễ dàng để viết các phần mở rộng C cho những thứ cần nhanh chóng (như ngắt, v.v.) và sử dụng các tính năng động, diễn giải của ngôn ngữ để thực hiện nhanh chóng phát triển trong logic chương trình.

Lua không phải là ngôn ngữ chức năng thuần túy, nhưng bạn có thể thực hiện nhiều chương trình chức năng trong đó, nó nhanh và nhỏ ( so với các ngôn ngữ kịch bản khác ) và bạn không cần phải khởi động lại thiết bị của mình để thử chương trình. Thậm chí còn có một thông dịch viên tương tác!


1

"Có cách nào để lập trình chức năng với ngôn ngữ chức năng trên MCU để giải quyết các vấn đề khó khăn không?"

Vâng, có nhiều cách. Nhưng nhược điểm là bạn cần bộ xử lý 32 bit, MMU, RAM 128 MB, SSD, RTOS và $$$.

Vi điều khiển khác với vi xử lý. Bộ vi điều khiển có thể chỉ là CPU 8 bit, RAM 1K, ROM 8K, nhưng nó có tích hợp sẵn trong UART, PWM, ADC, v.v. Và nó chỉ có giá $ 1,30.

Vì vậy, bạn có thể có tất cả các ngôn ngữ cấp cao đang chạy, nhưng nó tốn nhiều chi phí hơn để thực hiện.


2
Tôi nghĩ bạn cần xem lại định nghĩa của bạn về vi điều khiển. Nhiều bộ vi điều khiển hiện có Flash từ 128kB trở lên và RAM 64kB trở lên, có nhiều không gian để chạy trình thông dịch cho một số ngôn ngữ nhỏ. Có vẻ như bạn đang cung cấp thông số kỹ thuật cho một thiết bị Linux nhúng; Tôi nghĩ rằng OP đã yêu cầu một cổng chuyên dụng.
Kevin Vermeer

1
Nếu bạn đang trả $ 1,30 cho MCU 8 bit, thì có một số MCU 32 bit rẻ hơn. Ngoài ra, hãy lưu ý rằng hầu hết các MCU 8 bit trên thị trường là các kiến ​​trúc không hiệu quả mã khủng khiếp, với các thiết kế được kế thừa từ đầu những năm 80.
Lundin

0

Cuốn sách này cung cấp một số cách để lập trình với cảm giác nhẹ nhàng về FP. http://www.state-machine.com/psicc2/

Nhưng FP thực sự đòi hỏi phải có khả năng xây dựng các chức năng trong thời gian chạy và chuyển chúng qua chương trình của bạn. Ở đây chúng ta có một vấn đề: làm thế nào chúng ta có thể biểu diễn chức năng được xây dựng này? và làm thế nào chúng ta có thể thực hiện hiệu quả chức năng này? Trên một hệ thống lớn, chúng ta có thể sử dụng trình biên dịch động tạo mã máy thực trên ứng dụng chức năng đầu tiên. Trên MCU, chúng tôi chỉ có RAM để thực hiện các trình biên dịch rất nguyên thủy như lõi ngôn ngữ Forth.

Cách duy nhất bạn có thể sử dụng FP hoặc OOP nếu bạn thích đó là siêu lập trình : viết các chương trình chức năng / OOP phức tạp tạo chương trình cho MCU (ví dụ mã nguồn C hoặc LLVM IL). Trong biến thể này, bạn không bị giới hạn bởi mô hình hoặc phương pháp lập trình phức tạp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.