คำตอบมากมายที่นี่ ... ส่วนใหญ่แก้ไขปัญหาได้หลายวิธี
ฉันเขียนซอฟต์แวร์และเฟิร์มแวร์ระดับล่างที่ฝังมานานกว่า 25 ปีในหลากหลายภาษา - ส่วนใหญ่เป็น C (แต่ด้วยความหลากหลายใน Ada, Occam2, PL / M และแอสเซมเบลอร์ที่หลากหลาย)
หลังจากความคิดและการลองผิดลองถูกมาเป็นเวลานานฉันได้ตัดสินวิธีการที่ได้ผลลัพธ์ค่อนข้างเร็วและค่อนข้างง่ายในการสร้างชุดทดสอบและชุดสายรัด (ที่พวกเขาเพิ่มค่า!)
วิธีการบางอย่างเช่นนี้:
เขียนหน่วยรหัสนามธรรมของไดรเวอร์หรือฮาร์ดแวร์สำหรับอุปกรณ์ต่อพ่วงที่สำคัญแต่ละรายการที่คุณต้องการใช้ เขียนหนึ่งเพื่อเริ่มต้นตัวประมวลผลและตั้งค่าทุกอย่าง (ทำให้สภาพแวดล้อมเป็นมิตร) โดยทั่วไปแล้วในโปรเซสเซอร์แบบฝังตัวขนาดเล็ก - AVR ของคุณเป็นตัวอย่าง - อาจมี 10 - 20 ยูนิตเช่นขนาดเล็กทั้งหมด เหล่านี้อาจเป็นหน่วยสำหรับการเริ่มต้นการแปลง A / D เป็นบัฟเฟอร์หน่วยความจำที่ไม่ได้ปรับขนาดเอาต์พุตบิตพุทอินพุตปุ่มกด (ไม่มีตัวอย่างเพียงแค่ debounce) ไดรเวอร์การปรับความกว้างพัลส์พัลส์ UART / ไดรเวอร์อนุกรมธรรมดา อาจมีอีกสองสาม - เช่นไดรเวอร์ I2C หรือ SPI สำหรับ EEPROM, EPROM หรืออุปกรณ์ I2C / SPI อื่น ๆ
สำหรับแต่ละฮาร์ดแวร์นามธรรม (HAL) / ไดรเวอร์ยูนิตฉันจะเขียนโปรแกรมทดสอบ สิ่งนี้อาศัยพอร์ตอนุกรม (UART) และตัวประมวลผล init - ดังนั้นโปรแกรมทดสอบแรกใช้ 2 หน่วยเหล่านั้นเท่านั้นและทำอินพุตและเอาต์พุตพื้นฐานบางส่วนเท่านั้น สิ่งนี้ให้ฉันทดสอบว่าฉันสามารถเริ่มโปรเซสเซอร์และฉันมีการดีบักการสนับสนุนพื้นฐาน I / O อนุกรมทำงาน เมื่อใช้งานได้ (และหลังจากนั้น) ฉันจะพัฒนาโปรแกรมทดสอบ HAL อื่น ๆ แล้วสร้างสิ่งเหล่านี้ขึ้นบนหน่วย UART และ INIT ที่รู้จักกันดี ดังนั้นฉันอาจมีโปรแกรมทดสอบสำหรับอ่านอินพุต bitwise และแสดงสิ่งเหล่านี้ในรูปแบบที่ดี (hex, ทศนิยม, อะไรก็ตาม) ใน terminal debug ของฉัน จากนั้นฉันสามารถเลื่อนไปยังสิ่งที่ใหญ่กว่าและซับซ้อนกว่าเช่นโปรแกรมทดสอบ EEPROM หรือ EPROM ฉันใช้ประโยชน์จากเมนูเหล่านี้เป็นส่วนใหญ่ดังนั้นฉันจึงสามารถเลือกการทดสอบเพื่อเรียกใช้รันและดูผลลัพธ์ ฉันไม่สามารถคัดลอกมันได้ แต่โดยปกติฉันจะไม่ '
เมื่อฉันได้ HAL ของฉันทำงานทั้งหมดแล้วฉันจะหาวิธีที่จะได้รับเห็บตัวจับเวลาปกติ โดยทั่วไปจะมีอัตราอยู่ระหว่าง 4 ถึง 20 มิลลิวินาที สิ่งนี้จะต้องเป็นปกติสร้างขึ้นในการขัดจังหวะ ปกติการโรลโอเวอร์ / โอเวอร์โฟลว์ของเคาน์เตอร์สามารถทำได้ ตัวจัดการขัดจังหวะแล้ว INCREMENTS ขนาดไบต์ "สัญญาณ" ณ จุดนี้คุณสามารถเล่นซอกับการจัดการพลังงานได้หากคุณต้องการ แนวคิดของเซมาฟอร์คือถ้าค่าเป็น> 0 คุณต้องเรียกใช้ "main loop"
ผู้บริหารทำงานวนรอบหลัก มันก็แค่รอสัญญาณที่จะกลายเป็นไม่ใช่ 0 (ฉันสรุปรายละเอียดนี้ออกไป) ณ จุดนี้คุณสามารถเล่นกับตัวนับเพื่อนับเห็บเหล่านี้ (เพราะคุณรู้อัตราเห็บ) และเพื่อให้คุณสามารถตั้งค่าสถานะที่แสดงว่าเห็บผู้บริหารปัจจุบันสำหรับช่วงเวลา 1 วินาที, 1 นาทีและช่วงเวลาทั่วไปอื่น ๆ ที่คุณ อาจต้องการใช้ เมื่อผู้บริหารรู้ว่าสัญญาณคือ> 0 มันจะส่งผ่านเดียวผ่านทุกฟังก์ชั่น "การประยุกต์ใช้" กระบวนการ "ปรับปรุง"
กระบวนการแอปพลิเคชันจะทำงานร่วมกันอย่างมีประสิทธิภาพและเรียกใช้เป็นประจำด้วยการทำเครื่องหมาย "อัปเดต" นี่เป็นเพียงฟังก์ชั่นที่ผู้บริหารเรียกว่า นี่เป็นการทำงานแบบมัลติทาสกิ้งที่ไม่ดีกับ RTOS ที่ปลูกเองในบ้านง่าย ๆ ที่ต้องอาศัยแอพพลิเคชั่นทั้งหมดที่เข้ามาทำงานชิ้นเล็ก ๆ และออกจากงาน แอปพลิเคชันจำเป็นต้องรักษาตัวแปรสถานะของตนเองและไม่สามารถทำการคำนวณเป็นเวลานานได้เนื่องจากไม่มีระบบปฏิบัติการที่ว่างเปล่าเพื่อบังคับให้เกิดความเป็นธรรม โดยปกติแล้วเวลาทำงานของแอปพลิเคชั่น (รวมกัน) ควรมีขนาดเล็กกว่าช่วงเวลาที่เกิดเห็บหลัก
วิธีการด้านบนนั้นขยายได้อย่างง่ายดายดังนั้นคุณสามารถมีสิ่งต่าง ๆ เช่นสแต็คการสื่อสารที่เพิ่มขึ้นทำงานแบบอะซิงโครนัสและสามารถส่งข้อความ comms ไปยังแอปพลิเคชัน (คุณเพิ่มฟังก์ชั่นใหม่ แอปพลิเคชันใดที่จะส่งไป)
วิธีนี้ใช้ได้กับระบบการสื่อสารที่คุณสนใจตั้งชื่อ - มันสามารถ (และทำไปแล้ว) ทำงานกับระบบที่เป็นกรรมสิทธิ์หลายระบบมาตรฐานเปิดระบบ comms มันใช้งานได้กับ TCP / IP สแต็ค
นอกจากนี้ยังมีข้อได้เปรียบของการสร้างขึ้นในชิ้นส่วนแบบแยกส่วนที่มีอินเตอร์เฟซที่กำหนดไว้อย่างดี คุณสามารถดึงชิ้นส่วนเข้า ๆ ออกได้ทุกเวลาแทนที่ชิ้นส่วนต่าง ๆ ในแต่ละจุดตามวิธีที่คุณสามารถเพิ่มสายรัดทดสอบหรือตัวจัดการซึ่งสร้างจากชิ้นส่วนชั้นล่างที่รู้จักกันดี (สิ่งต่าง ๆ ด้านล่าง) ฉันพบว่าประมาณ 30% ถึง 50% ของการออกแบบสามารถได้รับประโยชน์จากการเพิ่มการทดสอบหน่วยการเขียนพิเศษซึ่งมักจะเพิ่มได้อย่างง่ายดาย
ฉันได้ดำเนินการนี้ไปอีกขั้นหนึ่ง (ความคิดที่ฉันได้รับจากคนอื่นที่ทำสิ่งนี้) และแทนที่ HAL layer ด้วยพีซีที่เทียบเท่า ตัวอย่างเช่นคุณสามารถใช้ C / C ++ และ winforms หรือคล้ายกันบนพีซีและโดยการเขียนรหัสอย่างละเอียดคุณสามารถเลียนแบบแต่ละอินเตอร์เฟส (เช่น EEPROM = ไฟล์ดิสก์ที่อ่านเข้าไปในหน่วยความจำพีซี) จากนั้นเรียกใช้แอปพลิเคชันฝังตัวทั้งหมดบนพีซี ความสามารถในการใช้สภาพแวดล้อมการดีบักที่เป็นมิตรสามารถประหยัดเวลาและความพยายามได้อย่างมากมาย เฉพาะโครงการขนาดใหญ่จริงๆเท่านั้นที่สามารถพิสูจน์ความพยายามนี้ได้
คำอธิบายข้างต้นเป็นสิ่งที่ไม่ซ้ำกับวิธีที่ฉันทำสิ่งต่าง ๆ บนแพลตฟอร์มแบบฝังตัว - ฉันเจอองค์กรการค้าจำนวนมากที่ทำสิ่งเดียวกัน วิธีการที่ทำมักจะแตกต่างกันอย่างมากในการนำไปใช้ แต่หลักการก็เหมือนกันมาก
ฉันหวังว่าข้างต้นให้รสชาติเล็กน้อย ... วิธีนี้ใช้ได้กับระบบฝังตัวเล็ก ๆ ที่ทำงานในไม่กี่ kB ด้วยการจัดการแบตเตอรี่ที่ก้าวร้าวผ่านมอนสเตอร์ที่มี 100K หรือมากกว่านั้นซึ่งเป็นแหล่งพลังงานที่ทำงานอย่างถาวร หากคุณเรียกใช้ "ฝังตัว" ในระบบปฏิบัติการขนาดใหญ่เช่น Windows CE หรืออื่น ๆ ทั้งหมดที่กล่าวมาข้างต้นนั้นไม่มีความหมายอย่างสมบูรณ์ แต่นั่นไม่ใช่การเขียนโปรแกรมแบบฝังตัวจริง แต่อย่างใด