การเขียนโปรแกรมไมโครคอนโทรลเลอร์กับการเขียนโปรแกรมเชิงวัตถุ


11

ฉันได้เขียนโปรแกรมพื้นฐานเชิงวัตถุด้วย C ++ (การสร้าง B-Tree, Hashing Algorithms, Double Linked Lists) และฉันได้ทำโครงการเล็ก ๆ ใน C (เช่นการทำเครื่องคิดเลขวิทยาศาสตร์เป็นต้น)

ความแตกต่างของการเขียนโปรแกรมฮาร์ดแวร์ (โดยเฉพาะสำหรับไมโครคอนโทรลเลอร์) จากการเขียนโปรแกรมซอฟต์แวร์ / เชิงวัตถุในแง่ของความคิดและ "การคิด" ที่โปรแกรมเมอร์ต้องมีคืออะไร?

ปกติแล้วฉันจะถือว่ายากกว่าคนอื่น ๆ

ด้วยพื้นหลังของฉัน (ตามที่อธิบายไว้ข้างต้น) ฉันจะต้องมีการเตรียมตัวมากมายสำหรับการเขียนโปรแกรมฮาร์ดแวร์หรือฉันสามารถดำดิ่งเข้าได้โดยไม่ต้องเตรียมตัวมากเกินไป?


4
เส้นโค้งการเรียนรู้ที่ยิ่งใหญ่ที่สุดคือวิธีการขับฮาร์ดแวร์เฉพาะในไมโครของคุณ ที่จะเกี่ยวข้องกับการ poring มากกว่าแผ่นข้อมูลสำหรับชั่วโมง น่าเสียดายที่ไม่มีทางออกที่ง่าย
drxzcl

@rrazd ฉันสังเกตเห็นว่าคุณได้ใส่แท็ก arduino เป็นเพราะคุณต้องการที่จะใช้ภาษาและห้องสมุดการเดินสาย arduino? หรือคุณจะเขียนแอพพลิเคชั่นที่ฝังไว้ใน C บริสุทธิ์ หากคุณตั้งใจที่จะยึดติดกับสภาพแวดล้อมของอาร์ดิโน่มันค่อนข้างปลอดภัยและง่ายต่อการเล่นเพราะพวกมันได้สร้างสิ่งที่แยกออกจากฮาร์ดแวร์
Jon L

@ จอนฉันวางแผนที่จะใช้บอร์ด Arduino สำหรับการเริ่ม มันไม่คล้ายกับภาษา C? ฉันคิดว่ามันเกี่ยวข้องกับแนวความคิดพื้นฐานที่เหมือนกัน ....
rrazd

1
ฉันสงสัยว่าคุณหมายถึงสิ่งที่หลายคนจะเรียกว่า 'การเขียนโปรแกรม I / O' หรือถ้าคุณคาดว่าจะจัดฮาร์ดแวร์ใหม่ด้วยรหัส อาร์ดิโนนั้นเป็นอดีตอย่างแน่นอน หลังจะเป็นโดเมนของ FPGA
JustJeff

1
@rrazd - ฉันเปลี่ยนชื่อ; "การเขียนโปรแกรมฮาร์ดแวร์" ฟังดูคล้ายกับ HDL (ภาษาคำอธิบายฮาร์ดแวร์) เช่น VHDL และ Verilog ซึ่งใช้สำหรับโปรแกรม FPGA และ CPLD
stevenvh

คำตอบ:


10

คุณจะต้องละทิ้งกระบวนทัศน์เชิงวัตถุเมื่อจัดการกับไมโครคอนโทรลเลอร์ส่วนใหญ่

โดยทั่วไปแล้ว Microcontrollers จะลงทะเบียนและ จำกัด RAM ด้วยอัตราสัญญาณนาฬิกาที่ช้าและไม่มีเส้นทางรหัส pipelining / ขนาน คุณสามารถลืมเกี่ยวกับ Java บน PIC ตัวอย่างเช่น

คุณต้องมีความคิดภาษาแอสเซมบลีและเขียนขั้นตอน

คุณต้องทำให้โค้ดของคุณค่อนข้างแบนและหลีกเลี่ยงการเรียกซ้ำเนื่องจากข้อ จำกัด ของ RAM มักจะทำให้เกิดปัญหาสแต็ก

คุณต้องเรียนรู้วิธีเขียนรูทีนการบริการขัดจังหวะซึ่งมีประสิทธิภาพ (โดยปกติจะเป็นภาษาแอสเซมบลี)

คุณอาจต้อง refactor บางส่วนของรหัสด้วยตนเองในภาษาแอสเซมบลีเพื่อใช้งานฟังก์ชันที่คอมไพเลอร์ไม่สนับสนุน (หรือสนับสนุนไม่ดี)

คุณต้องเขียนโค้ดทางคณิตศาสตร์ที่คำนึงถึงขนาดคำและการขาดความสามารถของ FPU ของไมโครคอนโทรลเลอร์ส่วนใหญ่ (เช่นทำการคูณ 32 บิตบน 8 บิต micro = evil)

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


1
คุณไม่จำเป็นต้องละทิ้งกระบวนทัศน์ที่มุ่งเน้นวัตถุทั้งหมด แต่ในไมโครไซต์ขนาดเล็กคุณอาจจำเป็นต้องละทิ้งการนำไปใช้งานวัตถุหนาและคิดเกี่ยวกับวิธีที่ดีที่สุดในการแก้ปัญหาแต่ละอย่าง บ่อยครั้งที่เป็นขั้นตอน แต่วัตถุที่มีน้ำหนักเบาซึ่งถูกนำมาใช้อย่างดี (โดยทั่วไปมักใช้มือ) ในบางครั้งอาจลดขนาดของโครงการไมโครคอนโทรลเลอร์ที่ซับซ้อนได้
Chris Stratton

6
ทั้งหมดนี้เป็นจริงยกเว้นการวางแนววัตถุ คุณอาจจะไม่ใช้ภาษาที่มีคุณสมบัติ OO แต่ไม่ได้ออกกฎการวางแนวของวัตถุ สำหรับไมโครคอนโทรลเลอร์คุณจะต้องเขียนไดรเวอร์สำหรับอุปกรณ์ต่อพ่วงฮาร์ดแวร์ทั้งหมด (ADCs ตัวควบคุมบัสอนุกรม PWM ฯลฯ ) โปรแกรมควบคุมดังกล่าวควรเขียนในลักษณะที่เป็นวัตถุเพื่อให้เป็น 1) อัตโนมัติและไม่รู้ / ดูแลเกี่ยวกับส่วนที่เหลือของโปรแกรมและ 2) ใช้การห่อหุ้มส่วนตัวเพื่อให้โปรแกรมที่เหลือไม่สามารถ เข้าไปข้างในและเล่นกับมัน นี่เป็นไปได้ 100% ใน C และจะไม่ส่งผลกระทบต่อประสิทธิภาพ
Lundin

1
ฉันไม่เห็นด้วยอย่างยิ่งกับประโยคแรกโครงการไมโครคอนโทรลเลอร์ทั้งหมดของฉันถูกสร้างขึ้นด้วย C ++ และวิธีการเชิงวัตถุและไมโครสโคปที่เราใช้นั้นไม่ใหญ่มาก (32kB ของ ROM) และ bootloader เชิงวัตถุนั้นมีขนาดน้อยกว่า 2kB ไม่เห็นข้อ จำกัด จริงๆ คุณไม่สามารถทำสิ่งบ้า ๆ บอ ๆ ได้ แต่การออกแบบนั้นสามารถมุ่งวัตถุได้โดยไม่มีปัญหา
Arsenal

@Arsenal Note ฉันพูดว่า 'Most' และโปรดทราบว่าคุณกำลังแสดงความคิดเห็นในกระทู้สี่ปี :)
Adam Lawrence

ฉันไม่เห็นด้วยกับประโยคแรกและประโยคสุดท้ายอย่างสมบูรณ์ และแอสเซมบลียังใช้ค่อนข้างน้อยและส่วนใหญ่เป็นเพียง 8 บิต MCU (เพียงตรวจสอบฟอรั่มนี้คุณสามารถค้นหาโพสต์ด้วยแอสเซมบลีจำนวนเท่าไร?) แน่นอนคุณสามารถและ (IMHO) ควรเขียนในลักษณะ OO สำหรับ 32bit MCUs
Andrejs Gasilovs

10

คุณต้องคิดหลายสิ่ง:

  • คุณจะใช้ C เป็นภาษา
  • คุณยังสามารถสร้างความรู้สึกของการวางแนววัตถุโดยใช้ตัวชี้ฟังก์ชั่นเพื่อให้คุณสามารถแทนที่ฟังก์ชั่นอื่น ๆ ได้ฉันใช้วิธีนี้ในโครงการในอดีตและปัจจุบันและทำงานได้ดีมาก ดังนั้น OO จึงอยู่ที่นั่นเพียงบางส่วน แต่ไม่ใช่ในภาษา C ++

มีข้อ จำกัด อื่น ๆ ที่จะเข้ามาเล่นเช่นความเร็วที่ จำกัด และหน่วยความจำ ดังนั้นตามแนวทางทั่วไปฉันหลีกเลี่ยง:

  • ใช้ heap หากมีวิธีการแก้ปัญหาโดยไม่ต้อง Malloc ฉันทำอย่างนั้น ตัวอย่างเช่นฉัน preallocate บัฟเฟอร์และใช้มัน
  • ฉันตั้งใจลดขนาดสแต็กในการตั้งค่าคอมไพเลอร์เพื่อเผชิญหน้ากับปัญหาขนาดสแต็กตั้งแต่ต้น
  • ฉันคิดว่ารหัสทุกบรรทัดเดียวจะถูกขัดจังหวะโดยเหตุการณ์ดังนั้นฉันจึงหลีกเลี่ยงโค้ดที่ไม่ใช่ reentrant
  • ฉันคิดว่าแม้การขัดจังหวะจะซ้อนกันดังนั้นฉันจึงเขียนรหัสนั้น
  • ฉันหลีกเลี่ยงการใช้ระบบปฏิบัติการเว้นแต่จำเป็น 70% ของโครงการฝังตัวไม่จำเป็นต้องใช้ระบบปฏิบัติการ หากฉันต้องใช้ระบบปฏิบัติการฉันจะใช้เฉพาะสิ่งที่มีซอร์สโค้ดให้เท่านั้น (Freertos ฯลฯ )
  • ถ้าฉันใช้ระบบปฏิบัติการฉันเกือบจะเป็นนามธรรมอยู่เสมอเพื่อให้ฉันสามารถเปลี่ยนระบบปฏิบัติการในเวลาไม่กี่ชั่วโมง
  • สำหรับไดรเวอร์และอื่น ๆ ฉันจะใช้ไลบรารีที่จัดทำโดยผู้จัดจำหน่ายเท่านั้นฉันไม่เคยทำซ้ำบิตเลยเว้นเสียแต่ว่าฉันไม่มีทางเลือกอื่น ทำให้โค้ดสามารถอ่านได้และปรับปรุงการดีบัก
  • ฉันดูลูปและสิ่งอื่น ๆ โดยเฉพาะใน ISR เพื่อให้แน่ใจว่าเร็วพอ
  • ฉันใช้ GPIOs สองสามอันในการวัดสิ่งต่างๆการสลับบริบทเวลาทำงานของ ISR เป็นต้น

รายการไปที่ฉันอาจต่ำกว่าค่าเฉลี่ยในแง่ของการเขียนโปรแกรมซอฟต์แวร์ผมมั่นใจว่ามีแนวทางปฏิบัติที่ดีกว่า


3
+1 สำหรับ "คุณสามารถใช้กระบวนทัศน์ OO หากคุณต้องการ" สิ่งที่คุณต้องตรวจสอบที่ประตูไม่ใช่การออกแบบ OO OOD เป็นเพียงปรัชญาที่กระตุ้นให้คุณเก็บรหัสและข้อมูลที่เกี่ยวข้องไว้ด้วยกัน สิ่งที่คุณต้องทิ้งไว้เบื้องหลังคือวิธีการนำ OO มาใช้ในระบบขององค์กรที่มีสิ่งที่เป็นนามธรรมหลายชั้นการผกผันของการควบคุมและแจ๊สทั้งหมดนั้น งานของเฟิร์มแวร์ของคุณคือการขับฮาร์ดแวร์นั่นแหละ
drxzcl

7

ฉันทำทั้งสองอย่างดังนั้นนี่คือมุมมองของฉัน

ฉันคิดว่าทักษะที่สำคัญที่สุดในการฝังตัวคือความสามารถในการดีบักของคุณ ความคิดที่ต้องการนั้นแตกต่างกันมากซึ่งอาจผิดพลาดได้และคุณต้องเปิดกว้างในการพิจารณาวิธีต่าง ๆ ทั้งหมดที่คุณพยายามทำผิดไป

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

คนฝังตัวที่มีประสบการณ์มักจะทำการดีบั๊กเพื่อให้ได้รับ ... คนส่วนใหญ่ที่ไม่สามารถทำได้ดีไม่นาน (หรือทำงานใน บริษัท ขนาดใหญ่ที่ยอมรับ "เฟิร์มแวร์ยาก" เป็นคำตอบว่าทำไมคุณสมบัติบางอย่าง สายปี)

คุณกำลังทำงานกับโค้ดที่ทำงานบนระบบภายนอกกับระบบการพัฒนาของคุณโดยมีองศาการมองเห็นที่แตกต่างกันในเป้าหมายของคุณจากแพลตฟอร์มหนึ่งไปอีกแพลตฟอร์มหนึ่ง หากอยู่ภายใต้การควบคุมของคุณให้กดเพื่อขอความช่วยเหลือในการพัฒนาเพื่อช่วยเพิ่มการมองเห็นนี้ในระบบเป้าหมายของคุณ ใช้พอร์ตอนุกรม debug, บิตการดีบักเอาต์พุต, แสงกะพริบที่มีชื่อเสียง, ฯลฯ อย่างน้อยที่สุดเรียนรู้วิธีการใช้ออสซิลโลสโคปและใช้ pin I / O กับขอบเขต 'เพื่อดูว่าฟังก์ชันบางอย่างเข้า / ออก, ไฟ ISRs ฯลฯ ฉันได้เฝ้าดูผู้คนต่อสู้กันนานเกินความจำเป็นอย่างแท้จริงเพียงเพราะพวกเขาไม่เคยใส่ใจที่จะตั้งค่า / เรียนรู้วิธีใช้ลิงก์ดีบักเกอร์ JTAG ที่เหมาะสม

มันสำคัญมากที่คุณต้องตระหนักว่าทรัพยากรใดที่คุณมีเมื่อเทียบกับพีซี อ่านเอกสารข้อมูลอย่างละเอียด พิจารณาทรัพยากร 'ต้นทุน' ของสิ่งที่คุณพยายามทำ เรียนรู้เทคนิคการดีบักเชิงทรัพยากรเช่นการเติมพื้นที่สแต็กด้วยค่าเวทย์มนตร์เพื่อติดตามการใช้สแต็ก

ในขณะที่ต้องใช้ทักษะการดีบักในระดับหนึ่งสำหรับพีซีและซอฟต์แวร์ฝังตัวมันมีความสำคัญยิ่งกว่ากับการฝังตัว


5

ฉันสันนิษฐานว่าประสบการณ์ C ++ ของคุณนั้นขึ้นกับพีซี

ข้อผิดพลาดที่มักจะทำโดยโปรแกรมเมอร์ที่ย้ายมาจากเครื่องคอมพิวเตอร์ไปยังไมโครคอนโทรลเลอร์คือการที่พวกเขาไม่ได้ตระหนักถึงวิธีการทรัพยากรที่ จำกัดสามารถ ในพีซีจะไม่มีใครหยุดคุณเมื่อคุณสร้างตารางที่มีรายการ 100,000 รายการหรือเขียนโปรแกรมที่รวบรวมรหัสเครื่องได้ 1MB
มีเป็นไมโครคอนโทรลเลอร์ที่มีความมั่งคั่งของทรัพยากรหน่วยความจำโดยเฉพาะอย่างยิ่งในระดับไฮเอนด์ แต่ก็ยังคงเป็นหนทางไกลจากสิ่งที่คุณจะใช้ในการ สำหรับโครงการงานอดิเรกที่คุณอาจจะสามารถไปได้สูงสุด แต่ในโครงการมืออาชีพที่คุณจะมักจะถูกบังคับให้ทำงานร่วมกับอุปกรณ์ขนาดเล็กเพราะมันถูกกว่า
ในโครงการหนึ่งฉันทำงานกับ TI MSP430F1101. หน่วยความจำของโปรแกรม 1KB, แฟลชการกำหนดค่า 128 ไบต์, RAM 128 ไบต์ โปรแกรมไม่พอดีใน 1K ดังนั้นฉันต้องเขียนฟังก์ชัน 23 ไบต์ใน Flash configuration กับตัวควบคุมขนาดเล็กเหล่านี้คุณคำนวณโดยไบต์ ในโอกาสอื่นหน่วยความจำของโปรแกรมมีขนาดเล็กเกินไป 4 ไบต์ เจ้านายจะไม่ให้ฉันใช้คอนโทรลเลอร์ที่มีหน่วยความจำมากขึ้น แต่ฉันต้องปรับรหัสเครื่องที่ได้รับการปรับให้เหมาะสมที่สุดแล้ว (มันถูกเขียนขึ้นในแอสเซมเบลอร์) เพื่อให้พอดีกับ 4 ไบต์พิเศษคุณจะได้ภาพ

ทั้งนี้ขึ้นอยู่กับแพลตฟอร์มที่คุณกำลังทำงานคุณจะต้องจัดการกับมากในระดับต่ำ I / O สภาพแวดล้อมการพัฒนาบางอย่างมีฟังก์ชั่นในการเขียนไปที่ LCD แต่สำหรับคนอื่น ๆ ที่คุณเป็นเจ้าของและต้องอ่านแผ่นข้อมูลของ LCD ตั้งแต่ต้นจนจบเพื่อที่จะรู้วิธีควบคุมมัน
คุณอาจต้องควบคุมรีเลย์นั่นง่ายกว่าจอ LCD แต่คุณจะต้องไปที่ระดับการลงทะเบียนของไมโครคอนโทรลเลอร์ แผ่นข้อมูลหรือคู่มือผู้ใช้อีกครั้ง คุณจะต้องรู้จักโครงสร้างของไมโครคอนโทรลเลอร์ซึ่งคุณจะพบในบล็อกไดอะแกรมอีกครั้งในแผ่นข้อมูล ในสมัยของไมโครโปรเซสเซอร์เราพูดถึงโมเดลการเขียนโปรแกรมซึ่งโดยทั่วไปเป็นกลุ่มผู้ลงทะเบียนของโปรเซสเซอร์ ไมโครคอนโทรลเลอร์ในปัจจุบันมีความซับซ้อนมากจนรายละเอียดของการลงทะเบียนทั้งหมดสามารถเป็นส่วนที่ดีที่สุดของแผ่นข้อมูล 100 หน้า IIRC เป็นเพียงคำอธิบายของโมดูลนาฬิกาสำหรับ MSP430 มีความยาว 25 หน้า

μ

ไมโครคอนโทรลเลอร์มักจะมีโปรแกรมใน C C ++ ค่อนข้างเป็นทรัพยากรหิวดังนั้นจึงมักจะออก (การใช้งาน C ++ ส่วนใหญ่สำหรับไมโครคอนโทรลเลอร์ให้เซตย่อย C ++ ที่ จำกัด ) อย่างที่ฉันพูดขึ้นอยู่กับแพลตฟอร์มที่คุณอาจมีห้องสมุดที่มีฟังก์ชั่นมากมายซึ่งสามารถช่วยคุณประหยัดเวลาในการพัฒนา มันคุ้มค่าที่จะสละเวลาศึกษามันอาจช่วยให้คุณประหยัดเวลาได้มากในภายหลังถ้าคุณรู้ว่ามีอะไรให้บ้าง


ฉันเขียนเกมสำหรับ Atari 2600 ซึ่งเป็นแพลตฟอร์มที่ค่อนข้าง จำกัด เกมที่ตีพิมพ์ครั้งแรกของฉันคือรหัส 4K (ตั้งแต่ฉันมีรถเข็น 32K ฉันเพิ่มสินค้าพิเศษบางอย่าง แต่รุ่น 4K นั้นเล่นได้ทั้งหมด); RAM คือ 128 ไบต์ ฉันคิดว่ามันน่าสนใจที่จะไตร่ตรองว่าในปีที่ฉันเขียนเกมนั้น (2005) เกมอื่น ๆ ได้รับการตีพิมพ์ซึ่งมีขนาดใหญ่เป็นล้านเท่า
supercat

@supercat - ใช่ แต่คาดว่าจะเกิดขึ้นในปี 2005 Atari 2600 มีอายุ 200 ปีแล้ว! ฉันไม่เคยเล่นเกมแอ็คชั่นเช่น FPS แต่เมื่อฉันดูสิ่งที่จำเป็นในการเล่นเกม GPU ที่ทรงพลังกว่าซีพียูของคุณทั้งทางโปรแกรมและทางไฟฟ้าฉันไม่สามารถช่วย แต่สั่นหัว :-) ฉันเล่นหมากรุก (Sargon) ใน 16k TRS-80 IIRC Flight Simulator น้องชายของฉันไม่ต้องการอีก
stevenvh

ไม่ค่อนข้าง 200 ปี มันเปิดตัวครั้งแรกในปี 1977 ดังนั้นมันจึงไม่ใช่ 30 แม้ในขณะที่ฉันเห็นด้วยว่านั่นคือ aeons ที่ผ่านมาในแง่ของเทคโนโลยีฉันยังคงปลิวไปตามความจริงที่ว่าไม่เพียงเพิ่มขึ้นร้อยเท่าหรือเพิ่มขึ้นหนึ่งเท่า แต่ MILLION-fold เพิ่มขึ้นทั้ง RAM และขนาดรหัส ความเร็วยังไม่ได้รับการเพิ่มขึ้นมากนักเนื่องจากเครื่องรุ่น 2600 เป็น 1.19MHz และระบบรุ่นใหม่นั้นอยู่ในช่วง GHz ที่ต่ำเท่านั้น พวกเขาสามารถทำต่อวงจรได้มากกว่า 2600 (ซึ่งอาจ - และต้อง - สร้าง 1/76 ของบรรทัดวิดีโอแต่ละรอบ) แต่ฉันไม่คิดว่าพวกมันเร็ว 1,000,000 เท่า
supercat

3

"การเขียนโปรแกรมฮาร์ดแวร์" อาจมีความหมายหลายอย่าง การเขียนโปรแกรมชิปขนาดเล็กมาก (คิดว่า 10F200, 512 คำแนะนำ, RAM ไม่กี่ไบต์) อาจเหมือนกับการออกแบบวงจรอิเล็กทรอนิกส์ ในอีกด้านหนึ่งการเขียนโปรแกรมไมโครคอนโทรลเลอร์ Cortex ขนาดใหญ่ (1 Mb FLASH, 64 kB RAM) สามารถเป็นจำนวนมากเช่นการเขียนโปรแกรม PC / GUI โดยใช้ชุดเครื่องมือ GUI ขนาดใหญ่ IMHO โปรแกรมเมอร์ฝังตัว / เรียลไทม์ที่ดีต้องการทักษะทั้งจากซอฟต์แวร์เช่นด้านการออกแบบและจากด้านการออกแบบวงจร สำหรับ uC C ++ ที่ใหญ่กว่านั้นเป็นตัวเลือกภาษาที่ดีสำหรับ C ที่มีขนาดเล็กมากอาจเป็นตัวเลือกเดียว ความรู้ของ Assemby นั้นมีประโยชน์ แต่ฉันไม่แนะนำให้ทำโครงการที่จริงจังทั้งหมดในการชุมนุม

ฉันทำงานฝังตัวอย่างจริงจังกับผู้คนจากทั้งสองฝ่าย (SWI และ EE) โดยทั่วไปฉันชอบคน SWI โดยที่พวกเขามีประสบการณ์เกี่ยวกับการเขียนโปรแกรมแบบมัลติเธรด

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


1

สำหรับทุกวิธีไลบรารี arduino ที่คุณเรียกว่ามีรหัส C / C ++ ที่ทำให้เป็นไปได้มันเป็นแพคเกจที่ดีสำหรับคุณที่จะใช้เป็น API ดูซอร์สโค้ดของ arduino ภายใต้ไดเรคทอรีฮาร์ดแวร์ / arduino / * และคุณจะเห็น C / C ++ เขียนทั้งหมดสำหรับคุณซึ่งโต้ตอบโดยตรงกับรีจิสเตอร์ของ AVR microcontroller หากวัตถุประสงค์ของคุณคือการเรียนรู้วิธีการเขียนสิ่งต่าง ๆ เช่นนี้ (สำหรับฮาร์ดแวร์โดยตรง) มีหลายสิ่งที่จะครอบคลุม หากวัตถุประสงค์ของคุณคือการทำงานบางอย่างให้ใช้ห้องสมุดของพวกเขาก็อาจจะไม่ได้พูดอะไรมากนักเนื่องจากการทำงานหนักของคุณและห้องสมุดและสภาพแวดล้อมในการพัฒนานั้นใช้งานง่ายมาก

กฎบางอย่างของหัวแม่มือแม้ว่าเมื่อทำงานกับอุปกรณ์ที่ จำกัด ทรัพยากรที่สามารถนำไปใช้กับสภาพแวดล้อมของ Arduino หรืออื่น ๆ :

ระวังจำนวนหน่วยความจำที่คุณใช้ ทั้งขนาดรหัส (ซึ่งไปที่หน่วยความจำแฟลช) และการใช้ RAM แบบคงที่ (ค่าคงที่ในรหัสของคุณที่จะมีอยู่เสมอใน RAM) ฉันจะยืนยันว่าการใช้ RAM แบบคงที่นั้นสำคัญกว่าสำหรับการเริ่มต้นเนื่องจากง่ายต่อการดูมากกว่า ไม่ใช่เรื่องแปลกที่คุณจะมี 1,000 ไบต์เท่านั้นที่จะทำงานกับสแต็กกองและค่าคงที่ของคุณ จงฉลาดในการใช้จ่ายของคุณดังนั้นหลีกเลี่ยงสิ่งต่าง ๆ เช่นอาร์เรย์จำนวนเต็มยาว (4 ไบต์แต่ละตัว) เมื่อไบต์หรือถ่านที่ไม่ได้ลงชื่อ (1 ไบต์แต่ละตัว) จะพอเพียง คำตอบอื่นที่นี่ครอบคลุมประเด็นสำคัญอื่น ๆ ได้เป็นอย่างดีดังนั้นฉันจะหยุดที่นี่ส่วนใหญ่ฉันต้องการที่จะได้รับตรงข้ามว่ามีมากมายที่จะครอบคลุมหากคุณไม่ได้ใช้ห้องสมุด arduino และเขียนห้องสมุด C ของคุณเอง


0

เกี่ยวกับการเขียนโปรแกรมไมโครคอนโทรลเลอร์กับ OOP พวกมันไม่ใช่สิ่งที่ตรงกันข้าม มันเป็นความจริงที่ไลบรารีผู้ขายทั้งหมดอยู่ใน C ธรรมดา แต่ทุกแพลตฟอร์มรองรับ C ++ OOP เช่นกัน นักพัฒนาสามารถสร้างและสร้างไลบรารีระดับสูงของ C ++ และเฟิร์มแวร์อุปกรณ์ที่อยู่ด้านบน ตัวอย่างที่ดีคือห้องสมุด Arduino, เป็นทางการและผู้ใช้สร้างขึ้น - คลาส C ++ ส่วนใหญ่ อาจไม่ใช่ข้อดีของ OOP ทั้งหมดที่สามารถนำมาใช้ประโยชน์ได้อย่างเต็มที่ในสภาพแวดล้อมแบบฝังตัว

เกี่ยวกับความคิดและการคิดตามที่ระบุไว้ในคำตอบอื่น ๆ ไมโครคอนโทรลเลอร์เป็นแพลตฟอร์มที่ จำกัด ทรัพยากร (โดยเฉพาะใน RAM ความเร็วน้อยกว่า) - สิ่งต่าง ๆ เช่นการจัดสรรหน่วยความจำแบบไดนามิกข้อยกเว้น C ++ มักจะถูกตัดออก ด้วยการเลือกฮาร์ดแวร์ที่เหมาะสมจึงเป็นเรื่องง่ายที่จะนำมาใช้กับข้อ จำกัด เหล่านี้และใช้เทคนิคอื่น ๆ (ยังใช้กันอย่างแพร่หลายในแพลตฟอร์มอื่น ๆ )

ในมุมมองของฉันความท้าทายที่ยากขึ้นอาจเป็นอีกมิติหนึ่งที่เพิ่มเติมในการเขียนโปรแกรมแบบฝัง - เวลา นี่เป็นเพราะโดยปกติแล้วซอฟต์แวร์ฝังตัวจะจัดการกับเหตุการณ์แบบเรียลไทม์มากโปรโตคอลที่กำหนดเวลาอย่างเคร่งครัดในการขับเคลื่อนฮาร์ดแวร์ต่อพ่วงและงานทั่วไปเอง (นี่เป็นสิ่งที่คล้ายคลึงกันในแพลตฟอร์ม "ระดับสูง" อื่น ๆ

เตรียมพร้อมที่จะอ่านเอกสารข้อมูลจำนวนมากเมื่อต้องรับมือกับฮาร์ดแวร์ใหม่ - ฉันคิดว่ามันอาจเกี่ยวข้องกับส่วนของคำถาม "mindset" :) แน่นอนว่า EE และฮาร์ดแวร์จำเป็นต้องมีความรู้บางอย่าง

นอกจากนี้ฉันต้องการที่จะทราบว่าวันนี้การพัฒนาซอฟต์แวร์ฝังตัวไม่จำเป็นต้องมีภาษาแอสเซมบลี ในความเป็นจริง Java (BTW เป็น OOP ตามค่าเริ่มต้น) อยู่ที่นี่แล้วและกำลังเพิ่มขึ้น (อย่างน้อยสำหรับอุปกรณ์ฝังตัวบางคลาสเช่นอุปกรณ์ IoT มันอาจมีอนาคตที่สดใสมาก)


ในแง่ของความกังวลคนรอบหน่วยความจำแบบไดนามิก (อีกครั้ง) การจัดสรรมีแนวโน้มที่จะเป็นอุปสรรคมากขึ้นเพื่อ OO ดั้งเดิมกว่าระยะเวลา
Chris Stratton

บางทีคุณพูดถูก แต่มีคนที่ตั้งโปรแกรมใน 80-90s สำหรับซอฟต์แวร์โหมดจริงของ MSDOS โดยมีพื้นที่ RAM 64K (หน่วยความจำข้อมูล) และสำหรับพวกเขามันเป็น "ธรรมชาติ" บางที MSDOS พีซีมากขึ้น "ฝัง" สภาพแวดล้อมในปัจจุบันกว่า STM32F4 :)
Flanker

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