ฟังก์ชั่นการเขียนโปรแกรมด้วย MCU


12

ภาษาที่ใช้งานได้เช่น Haskell, LISP หรือ Scheme ช่วยให้โปรแกรมเมอร์ทำงานได้อย่างรวดเร็วโดยใช้กระบวนทัศน์การเขียนโปรแกรมเชิงฟังก์ชัน พวกเขามีความไร้ประสิทธิภาพแต่แอปพลิเคชันของฉันให้ความสำคัญกับประสิทธิภาพของโปรแกรมเมอร์มากกว่าประสิทธิภาพของโปรแกรม

ฉันต้องการใช้การเขียนโปรแกรมใช้งานได้บนไมโครคอนโทรลเลอร์เพื่อควบคุมเครื่อง ฯลฯ

มีข้อ จำกัด อะไรบ้างเช่นทรัพยากรระบบขั้นต่ำ
มีตัวอย่างการใช้งานภาษาเหล่านี้บ้าง


1
หากคำถามของคุณคือ "มันจะไม่คุ้มค่าที่จะเขียนโปรแกรมใด ๆเครื่องกับภาษาการเขียนโปรแกรมที่มีประสิทธิภาพมากที่สุดที่คุณจะได้รับในมือของคุณว่า" C ++และJavaคำถามมีการแนะนำการอ่าน (ประมาณ OOP มากกว่าโปรแกรมการทำงาน)
Kevin Vermeer

1
ย่อหน้าแรกของคุณมาในฐานะที่เป็นข้อโต้แย้งซึ่งทำให้คุณโหวตไม่กี่คน พิจารณาการอ้างถึงบางสิ่งที่แฝงมากกว่าเดิม ("ฉันสนใจที่จะใช้การเขียนโปรแกรมเชิงหน้าที่สำหรับการควบคุมเครื่องตัวอย่างของการใช้งาน Haskell / LISP / Scheme สำหรับระบบฝังตัว") หรือลบออกทั้งหมด
Kevin Vermeer

2
ฉันไม่ซื้อคำสั่ง "ไม่มีประสิทธิภาพ" ของคุณ ดูเหมือนว่าคุณมีอคติอย่างมากต่อฝ่ายอดิเรก / ต้นแบบ - ปริมาณน้อย (aka: 1) C / C ++ / asm ส่งผลให้โค้ดมีขนาดเล็กลงและเร็วขึ้นซึ่งจะขยายเป็นพัน ๆ ล้านครั้งเมื่อคุณสามารถใช้โปรเซสเซอร์ที่มีความเร็วและพื้นที่เพียงพอ ฝังตัวจะถูกฝัง คุณไม่ได้เขียนโปรแกรมบนระบบปฏิบัติการทั่วไป
Nick T

4
@Nick T - "C / C ++ / asm ให้ผลลัพธ์มีขนาดเล็กลงและเร็วขึ้นซึ่งมีการขยายเป็นพัน ๆ ล้านครั้งเมื่อคุณสามารถใช้โปรเซสเซอร์ที่มีความเร็วและพื้นที่เพียงพอ" - การบำรุงรักษาเป็นอย่างไร? ภาษาที่ใช้งานได้มักจะทำในบรรทัดเดียวสิ่งที่โปรแกรม C ต้องใช้ 10 วินาทีในการทำซึ่งหมายถึงพื้นที่น้อยกว่าสำหรับข้อบกพร่อง นอกจากนี้พวกเขาสามารถปฏิบัติตาม (เช่น Haskell) และทำให้ทำงานบนเป้าหมายซึ่งเร็วกว่าล่าม ฉันต้องการสำรวจหัวข้อนี้สักหน่อยเพราะคอมไพล์ -Haskell อาจจะเร็ว แต่ก็เร็วกว่าที่จะพัฒนามากกว่าพูดแอป C ต้องการถามคำถามเกี่ยวกับสถานะเล็กน้อย
J. Polfer

1
@Sheepsimulator แต่น่าเสียดายที่ความคิดเห็นเช่นเดียวกับคนสุดท้ายของคุณทำให้คำถามเช่นอาร์กิวเมนต์นี้
Kellenjb

คำตอบ:


11

ARMPIT SCHEME เป็นล่ามสำหรับภาษา Scheme (ภาษาถิ่นที่ จำกัด ขอบเขตของเสียงกระเพื่อม) ที่ทำงานบนไมโครคอนโทรลเลอร์ RISC ด้วย ARM core มันขึ้นอยู่กับคำอธิบายในรายงานฉบับแก้ไขเกี่ยวกับโครงการภาษาอัลกอริทึม (r5rs) โดยมีส่วนขยายบางส่วน (สำหรับ I / O) และการละเว้นบางอย่าง (เพื่อให้พอดีกับหน่วยความจำ MCU) มันถูกออกแบบเพิ่มเติมเพื่อรองรับมัลติทาสกิ้งและมัลติโปรเซสเซอร์ โครงการ Armpit คาดว่าจะเหมาะสมกับการตั้งค่าทางการศึกษารวมถึงโครงการนักเรียนในหลักสูตรเกี่ยวกับการควบคุมและการใช้เครื่องมือหรือหลักสูตรการออกแบบสุดที่ต้องการไมโครคอนโทรลเลอร์ มันมีจุดมุ่งหมายเพื่อเสริมสร้างสเปกตรัมของภาษาที่แปลแล้วสำหรับ MCUs (เช่น BASIC และ FORTH) และสามารถเป็นทางเลือกแทนล่าม bytecode ที่อิงกับ MCU (เช่นสำหรับ Scheme หรือ Java) และเพื่อรวบรวมภาษา (เช่น C)

http://armpit.sourceforge.net/

คุณพูด:

การใช้ C, C ++, ชุดประกอบและอื่น ๆ ค่อนข้างไม่มีประสิทธิภาพเมื่อเทียบกับภาษาเช่น Haskell, LISP หรือ Scheme

การใช้ภาษาระดับสูงเป็นการใช้เวลาโปรแกรมเมอร์อย่างมีประสิทธิภาพมากขึ้น แต่บ่อยครั้งอาจเป็นการใช้ทรัพยากรคอมพิวเตอร์อย่างมีประสิทธิภาพน้อยลง สำหรับระบบฝังตัวที่ผลิตในปริมาณมากค่าใช้จ่ายและประสิทธิภาพมักจะมีความสำคัญสูงกว่าความพยายามในการพัฒนา



5

C, C ++ และชุดประกอบทั้งหมดใกล้เคียงกับภาษาเครื่องมาก ด้วยการใช้ภาษาระดับสูงกว่าคุณจะเพิ่มค่าใช้จ่ายเพิ่มเติมในการแลกเปลี่ยนสำหรับการพัฒนาที่เร็วขึ้น / ง่ายขึ้น / ฯลฯ


3
-1: ฉันไม่เห็นด้วยกับคำตอบนี้จริงๆ แม้ว่าสิทธิของคุณในการประกอบจะใกล้เคียงกับภาษาเครื่อง C และ C ++ เป็นภาษาระดับสูงที่แตกต่างกันมาก
BG100

1
@ BG100 ฉันวาดเส้น "ระดับสูง / ระดับต่ำ" ที่ใดที่หนึ่งใน C แทนแล้วก็เรียกมันว่าเป็นภาษาระดับสูง เมื่อดำเนินการทางคณิตศาสตร์ตัวชี้ (สตริง) และงานพื้นฐานทั่วไปอื่น ๆ คำแนะนำที่คอมไพเลอร์โดยทั่วไปสร้างจะมี CPU ที่จัดการข้อมูลโดยตรงโดยไม่มีเลเยอร์นามธรรม
Nick T

@Nick T: ฉันเห็นประเด็นของคุณ แต่ให้พิจารณาสิ่งนี้: หากคุณเขียนชุดคำสั่งขัดจังหวะที่โดยทั่วไปจำเป็นต้องดำเนินการให้เร็วที่สุดเท่าที่จะเป็นไปได้ใน C คุณจะไม่รู้เลยว่าจะต้องใช้เวลานานแค่ไหน เพียงนับคำแนะนำ ฉันคิดว่าคนระดับต่ำรู้ว่ากำลังเกิดขึ้นในโปรแกรมของคุณคุณไม่รู้เรื่องนี้แน่นอนถ้าคุณใช้ C.
BG100

@ BG100: คำสั่งแอสเซมเบลอร์เดียวกันสามารถใช้จำนวนรอบที่แตกต่างกันในการดำเนินการตามตัวถูกดำเนินการและโหมดการกำหนดแอดเดรส แม้ว่าใน C เมื่อคุณรวบรวมคุณจะได้รับรหัสคงที่ที่ไม่ (ไม่สามารถ) เปลี่ยนแปลง ทรูนี้คืออาร์กิวเมนต์ที่ค่อนข้างผอมบาง แต่ถ้าเรากำลังจะไปเถียงข้อปลีกย่อยเพื่อพยายามที่จะวาดเส้นสีแดงขนาดใหญ่ ...
นิค T

3

ฉันเพิ่งเขียนโปรแกรมกระดาน ARM ใน Python และฉันคิดว่ามันยอดเยี่ยม มันไม่ดีสำหรับการควบคุมเวลาจริง แต่ฉันทำสิ่งที่เกี่ยวข้องกับเว็บมากขึ้นซึ่งเป็นไกลสบายมากขึ้นในภาษาระดับสูงกว่าใน C.


3

ไมโครคอนโทรลเลอร์ส่วนใหญ่ยังคงเป็นอุปกรณ์ 8 และ 16 บิต (แม้ว่าจะมีการเปลี่ยนแปลงอย่างช้าๆ) อินสแตนซ์ที่สองของภาษาระดับสูงกว่า (Scheme และ Python) ที่กล่าวถึงในคำตอบอื่น ๆ จนถึงขณะนี้ทั้งสองทำงานบนคอร์ ARM แบบ 32 บิต อุปกรณ์ขนาดเล็ก 8 และ 16 บิต (ซึ่งอาจมีค่าใช้จ่ายเพียงไม่กี่ดอลลาร์) ไม่มี RAM เพียงพอที่จะรองรับภาษาที่กล่าวถึง - โดยทั่วไปแล้วพวกเขามี RAM ไม่กี่ KB เท่านั้น

นอกจากนี้ภาษาระดับสูงเหล่านี้ไม่ได้ออกแบบมาสำหรับการเขียนตัวจัดการขัดจังหวะเวลาแฝงต่ำและสิ่งที่คล้ายกัน ไม่ใช่เรื่องผิดปกติสำหรับตัวจัดการขัดจังหวะของไมโครคอนโทรลเลอร์ที่จะได้รับการเรียกหลายร้อยหรือหลายพันครั้งต่อวินาทีและแต่ละครั้งที่จำเป็นในการปฏิบัติงานเป็นสิบไมโครวินาทีหรือน้อยกว่า


1
โครงการได้รับการพัฒนาในช่วงกลางยุคปลายยุค 70 และต้นยุค 80 Scheme ไม่ต้องการตัวประมวลผล 32 บิตหรือหน่วยความจำเมกะไบต์ โครงการมีให้สำหรับพีซีระดับ AT ในช่วงกลางทศวรรษที่ 80 การใช้งานล่าสุดอาจได้รับการปรับให้เหมาะสมสำหรับสภาพแวดล้อมที่มีทรัพยากรมากขึ้น แต่มีตัวอย่างที่ชัดเจนของแบบแผนที่ทำงานบนแพลตฟอร์มการคำนวณแบบ "miniscule" ในปัจจุบัน
โฟตอน

@ThePhoton ฉันยืนแก้ไข แม้ว่าฉันจะรับรู้ถึงโครงการ BIT ซึ่งกำหนดเป้าหมายโปรเซสเซอร์ด้วยหน่วยความจำหลายสิบ KB (มากกว่าสิ่งที่มีอยู่ในไมโครคอนโทรลเลอร์ขนาดเล็กส่วนใหญ่) ฉันเพิ่งค้นพบPICBITออกแบบโดยนักเรียนสองคนที่Université de MontréalและUniversité Laval ซึ่งช่วยให้โปรแกรม Scheme จริงสามารถทำงานบนโปรเซสเซอร์ PIC ที่มี RAM น้อยถึง 2K น่าทึ่งมาก
tcrosley

3

เป็นไปได้ที่จะทำการเขียนโปรแกรมการทำงานบางอย่างกับภาษา Lua ที่จริง Lua เป็นภาษาที่ใช้ในกระบวนทัศน์ วิกิพีเดียอ้างว่ามันเป็นภาษา 'การเขียนสคริปต์ความจำเป็นการทำงานเชิงวัตถุเชิงต้นแบบ' ภาษาไม่ได้บังคับใช้กระบวนทัศน์เดียว แต่มีความยืดหยุ่นเพียงพอที่จะอนุญาตให้โปรแกรมเมอร์ดำเนินการตามกระบวนทัศน์ที่เหมาะสมกับสถานการณ์ มันได้รับอิทธิพลจากโครงการ

คุณสมบัติ Lua รวมถึง ฟังก์ชั่นชั้นแรก , การกำหนดขอบเขตของคำศัพท์และฝาปิดและcoroutinesซึ่งมีประโยชน์สำหรับการเขียนโปรแกรมการทำงาน คุณสามารถดูวิธีการคุณสมบัติเหล่านี้จะใช้ในวิกิพีเดียผู้ใช้ Lua ซึ่งมีหน้าทุ่มเทให้กับการเขียนโปรแกรมการทำงาน ฉันเจอโครงการ Google Code นี้ด้วย แต่ฉันไม่ได้ใช้มัน (มันอ้างว่าได้รับอิทธิพลจาก Haskell ซึ่งเป็นภาษาอื่นที่คุณพูดถึง)

eLuaเป็นการใช้งานที่มีการกำหนดค่าสำหรับบอร์ดพัฒนาจำนวนหนึ่งสำหรับสถาปัตยกรรม ARM7TMDI, Cortex-M3, ARM966E-S และ AVR32 และเป็นโอเพ่นซอร์สเพื่อให้คุณสามารถกำหนดค่าสำหรับแพลตฟอร์มของคุณเอง Lua มีการใช้งานใน ANSI C และแหล่งที่มาทั้งหมดมีน้ำหนักไม่เกิน 200kB ดังนั้นคุณควรสร้างมันขึ้นมาสำหรับแพลตฟอร์มส่วนใหญ่ที่มีคอมไพเลอร์ C แนะนำอย่างน้อย 128k ของ Flash และ RAM 32k ฉันกำลังทำงานกับพอร์ต PIC32 สำหรับมัน (ยังอยู่ในขั้นตอน 'รับบอร์ด PIC32') ในขณะนี้

สิ่งที่ยอดเยี่ยมเกี่ยวกับ Lua คือมันได้รับการออกแบบเป็นภาษากาวดังนั้นจึงง่ายมากที่จะเขียนส่วนขยาย C สำหรับสิ่งที่ต้องรวดเร็ว (เช่นการขัดจังหวะ ฯลฯ ) และใช้คุณสมบัติการแปลแบบไดนามิกของภาษาเพื่อให้รวดเร็ว การพัฒนาในตรรกะของโปรแกรม

Lua ไม่ใช่ภาษาที่ใช้งานได้จริง ๆ แต่คุณสามารถทำการเขียนโปรแกรมที่ใช้งานได้หลายอย่างมันเร็วและเล็ก ( เทียบกับภาษาสคริปต์อื่น ๆ ) และคุณไม่จำเป็นต้องรีเฟรชอุปกรณ์ของคุณเพื่อลองโปรแกรม แม้จะมีล่ามแบบโต้ตอบ!


1

"มีวิธีการทำโปรแกรมฟังก์ชั่นด้วยภาษาที่ใช้งานได้บน MCU เพื่อแก้ปัญหาที่ยากหรือไม่"

ใช่มีหลายวิธี แต่ข้อเสียคือคุณต้องการโปรเซสเซอร์ 32 บิต, MMU, RAM 128MB, SSD, RTOS และ $$$

ไมโครคอนโทรลเลอร์มีความแตกต่างจากไมโครโปรเซสเซอร์ ไมโครคอนโทรลเลอร์อาจเป็นเพียงซีพียู 8 บิต, 1K RAM, 8K ROM แต่มีในตัว UART, PWM, ADC ฯลฯ และมีราคาเพียง $ 1.30

ดังนั้นคุณอาจมีภาษาระดับสูงทั้งหมดที่ทำงาน แต่มันมีค่าใช้จ่ายมากขึ้นในการทำ


2
ฉันคิดว่าคุณต้องทบทวนนิยามของไมโครคอนโทรลเลอร์อีกครั้ง ไมโครคอนโทรลเลอร์หลายตัวในขณะนี้มีแฟลชขนาด 128kB หรือมากกว่าและ 64kB หรือมากกว่า RAM ซึ่งมีพื้นที่มากมายในการใช้ล่ามสำหรับภาษาขนาดเล็ก ดูเหมือนว่าคุณกำลังให้รายละเอียดสำหรับอุปกรณ์ Linux ที่ฝังอยู่ ฉันคิดว่า OP กำลังขอพอร์ตเฉพาะ
Kevin Vermeer

1
หากคุณจ่าย $ 1.30 สำหรับ MCU แบบ 8 บิตแสดงว่ามี MCU แบบ 32 บิตหลายตัวที่ถูกกว่า นอกจากนี้ให้คำนึงถึงว่า 8-bit MCUs ส่วนใหญ่ในตลาดเป็นสถาปัตยกรรมที่ไม่มีประสิทธิภาพของรหัสด้วยการออกแบบที่สืบทอดมาจากยุค 80 ต้น ๆ
Lundin

0

หนังสือเล่มนี้ให้วิธีการเขียนโปรแกรมด้วยความรู้สึกเบา ๆ ของ FP http://www.state-machine.com/psicc2/

แต่ FP ที่แท้จริงนั้นจำเป็นต้องมีความสามารถในการสร้างฟังก์ชั่นในการใช้งานจริงและส่งผ่านไปยังโปรแกรมของคุณ ที่นี่เรามีปัญหา: เราจะแสดงฟังก์ชันที่สร้างขึ้นนี้ได้อย่างไร และวิธีที่เราสามารถใช้งานฟังก์ชั่นนี้ได้อย่างมีประสิทธิภาพ ในระบบขนาดใหญ่เราสามารถใช้การรวบรวมแบบไดนามิกซึ่งสร้างรหัสเครื่องจริงในแอปพลิเคชันฟังก์ชั่นแรก บน MCU เรามี RAM เพียงตัวเดียวที่จะใช้คอมไพเลอร์แบบดั้งเดิมมากเช่น Core ภาษา Forth

วิธีเดียวที่คุณสามารถใช้ FP หรือ OOP หากคุณต้องการคือmetaprogramming : เขียนโปรแกรมการทำงาน / OOP ที่ซับซ้อนที่สร้างโปรแกรมสำหรับ MCU (ซอร์สโค้ด C เช่น C หรือ LLVM IL) ในตัวแปรนี้คุณไม่ได้ถูก จำกัด ด้วยกระบวนทัศน์หรือความซับซ้อนของวิธีการเขียนโปรแกรม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.