bootloader เป็นโปรแกรมที่ทำงานในไมโครคอนโทรลเลอร์ที่จะตั้งโปรแกรม ได้รับข้อมูลโปรแกรมใหม่จากภายนอกผ่านวิธีการสื่อสารบางอย่างและเขียนข้อมูลนั้นไปยังหน่วยความจำโปรแกรมของโปรเซสเซอร์
ตรงกันข้ามกับวิธีปกติในการทำให้โปรแกรมเข้าสู่ไมโครคอนโทรลเลอร์ซึ่งผ่านฮาร์ดแวร์พิเศษที่สร้างขึ้นในไมโครเพื่อจุดประสงค์นั้น บน PIC นี่เป็นอินเตอร์เฟสที่คล้าย SPI ถ้าฉันจำได้ถูกต้อง AVRs ใช้ Jtag หรืออย่างน้อยก็บางคนทำ ไม่ว่าจะด้วยวิธีใดก็ต้องใช้ฮาร์ดแวร์ภายนอกบางตัวที่ดึงหมุดการตั้งโปรแกรมออกมาเพื่อเขียนข้อมูลลงในหน่วยความจำของโปรแกรม ไฟล์ HEX ที่อธิบายเนื้อหาหน่วยความจำของโปรแกรมนั้นมาจากคอมพิวเตอร์ที่มีวัตถุประสงค์ทั่วไปดังนั้นฮาร์ดแวร์นี้จะเชื่อมต่อกับคอมพิวเตอร์ในด้านหนึ่งและหมุดโปรแกรมพิเศษของไมโครที่อีกด้านหนึ่ง บริษัท ของฉันสร้างโปรแกรมเมอร์ PICให้เป็นงานอดิเรกดังนั้นฉันค่อนข้างคุ้นเคยกับกระบวนการนี้กับ PIC
จุดสำคัญของการเขียนโปรแกรมภายนอกผ่านฮาร์ดแวร์พิเศษคือมันทำงานได้โดยไม่คำนึงถึงเนื้อหาที่มีอยู่ของหน่วยความจำโปรแกรม ไมโครคอนโทรลเลอร์เริ่มต้นด้วยหน่วยความจำของโปรแกรมที่ถูกลบหรืออยู่ในสถานะที่ไม่รู้จักดังนั้นการเขียนโปรแกรมภายนอกจึงเป็นวิธีเดียวที่จะทำให้โปรแกรมแรกเข้าสู่ไมโคร
หากคุณแน่ใจเกี่ยวกับโปรแกรมที่คุณต้องการโหลดลงในผลิตภัณฑ์ของคุณและไดรฟ์ข้อมูลของคุณสูงพอคุณสามารถมีผู้ผลิตหรือผู้จัดจำหน่ายโปรแกรมชิปสำหรับคุณ ชิปจะถูกบัดกรีเข้ากับบอร์ดเหมือนกับชิปอื่น ๆ และเครื่องก็พร้อมที่จะไป สิ่งนี้อาจเหมาะสมกับบางสิ่งเช่นของเล่นเป็นต้น เมื่อเฟิร์มแวร์เสร็จสิ้นมันก็ทำออกมาได้สวยมากและมันจะผลิตในปริมาณมาก
หากโวลุ่มของคุณต่ำกว่าหรือที่สำคัญกว่านั้นคุณคาดหวังว่าจะมีการพัฒนาเฟิร์มแวร์และแก้ไขข้อผิดพลาดอย่างต่อเนื่องคุณไม่ต้องการซื้อชิปที่ตั้งโปรแกรมไว้ล่วงหน้า ในกรณีนี้ชิปเปล่าจะถูกติดตั้งบนบอร์ดและเฟิร์มแวร์จะต้องทำการโหลดเข้าสู่ชิปซึ่งเป็นส่วนหนึ่งของกระบวนการผลิต ในกรณีดังกล่าวจะต้องมีการตั้งโปรแกรมบรรทัดฮาร์ดแวร์อย่างใด สิ่งนี้สามารถผ่านตัวเชื่อมต่อที่ชัดเจนหรือ pogo pin pads หากคุณยินดีที่จะสร้างฟิกซ์เจอร์ทดสอบการผลิต บ่อยครั้งที่ผลิตภัณฑ์ดังกล่าวต้องได้รับการทดสอบและอาจสอบเทียบแล้วดังนั้นค่าใช้จ่ายเพิ่มเติมในการเขียนโปรแกรมไปยังโปรเซสเซอร์จึงมักจะน้อยที่สุด บางครั้งเมื่อมีการใช้โปรเซสเซอร์ขนาดเล็กเฟิร์มแวร์ทดสอบการผลิตพิเศษจะถูกโหลดลงในโปรเซสเซอร์เป็นครั้งแรก สิ่งนี้ใช้เพื่ออำนวยความสะดวกในการทดสอบและสอบเทียบเครื่อง จากนั้นจะทำการโหลดเฟิร์มแวร์จริงหลังจากฮาร์ดแวร์รู้ว่าดี ในกรณีนี้มีข้อควรพิจารณาในการออกแบบวงจรบางอย่างเพื่อให้สามารถเข้าถึงบรรทัดการเขียนโปรแกรมได้อย่างเพียงพอเพื่อให้กระบวนการเขียนโปรแกรมทำงานได้ แต่ยังไม่สะดวกในวงจรมากเกินไป สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับเรื่องนี้โปรดดูของฉันในวงจรการเขียนโปรแกรมเขียนขึ้น
จนถึงตอนนี้ดีมากและไม่จำเป็นต้องใช้ bootloader อย่างไรก็ตามพิจารณาผลิตภัณฑ์ที่มีเฟิร์มแวร์ที่ค่อนข้างซับซ้อนซึ่งคุณต้องการอัปเกรดฟิลด์หรืออนุญาตให้ลูกค้าปลายทางอัปเกรดได้ คุณไม่สามารถคาดหวังให้ลูกค้าปลายทางมีแกดเจ็ตโปรแกรมเมอร์หรือรู้วิธีการใช้งานอย่างถูกต้องแม้ว่าคุณจะให้ไว้ จริงๆแล้วหนึ่งในลูกค้าของฉันทำสิ่งนี้ หากคุณซื้อตัวเลือกการปรับแต่งฟิลด์พิเศษของพวกเขาคุณจะได้รับหนึ่งในโปรแกรมเมอร์ของฉันกับผลิตภัณฑ์
อย่างไรก็ตามในกรณีส่วนใหญ่คุณเพียงต้องการให้ลูกค้าเรียกใช้โปรแกรมบนพีซีและมีการอัปเดตเฟิร์มแวร์อย่างน่าอัศจรรย์ นี่คือที่ bootloader เข้ามาโดยเฉพาะอย่างยิ่งหากผลิตภัณฑ์ของคุณมีพอร์ตการสื่อสารที่สามารถเชื่อมต่อกับพีซีเช่น USB, RS-232 หรืออีเธอร์เน็ต ลูกค้าใช้งานโปรแกรม PC ซึ่งพูดคุยกับ bootloader ในไมโครแล้ว สิ่งนี้จะส่งไบนารีใหม่ไปยัง bootloader ซึ่งจะเขียนไปยังหน่วยความจำของโปรแกรมจากนั้นทำให้รหัสใหม่ถูกเรียกใช้
ฟังดูง่าย แต่ก็ไม่ใช่อย่างน้อยถ้าคุณต้องการให้กระบวนการนี้มีความสมบูรณ์ จะเกิดอะไรขึ้นถ้ามีข้อผิดพลาดในการสื่อสารเกิดขึ้นและเฟิร์มแวร์ใหม่นั้นเสียหายเมื่อถึงที่ bootloader? จะเกิดอะไรขึ้นถ้ากระแสไฟถูกขัดจังหวะในระหว่างกระบวนการบู๊ต เกิดอะไรขึ้นถ้า bootloader มีข้อผิดพลาดและเล่นลูกเต๋าชนิดหนึ่งในตัวเอง?
สถานการณ์ง่าย ๆ คือ bootloader จะเรียกใช้จากการรีเซ็ตเสมอ พยายามสื่อสารกับโฮสต์ หากโฮสต์ตอบสนองมันจะบอก bootloader ว่าไม่มีอะไรใหม่หรือส่งรหัสใหม่ เมื่อรหัสใหม่มาถึงรหัสเก่าจะถูกเขียนทับ คุณรวมการตรวจสอบด้วยรหัสที่อัปโหลดไว้เสมอเพื่อให้ bootloader สามารถบอกได้ว่าแอพใหม่นั้นไม่เสียหายหรือไม่ มิฉะนั้นไฟล์นั้นจะยังคงอยู่ใน bootloader เพื่อร้องขอการอัปโหลดอย่างต่อเนื่องจนกว่าสิ่งที่มีการตรวจสอบที่ถูกต้องจะถูกโหลดเข้าสู่หน่วยความจำ นี่อาจเป็นที่ยอมรับได้สำหรับอุปกรณ์ที่เชื่อมต่ออยู่เสมอและอาจเป็นที่ที่ทำงานพื้นหลังบนโฮสต์ที่ตอบสนองต่อคำขอ bootloader แบบแผนนี้ไม่ดีสำหรับหน่วยที่ส่วนใหญ่เป็นอิสระและบางครั้งก็เชื่อมต่อกับคอมพิวเตอร์โฮสต์
โดยทั่วไปแล้ว bootloader อย่างง่าย ๆ ตามที่อธิบายไว้ข้างต้นจะไม่ได้รับการยอมรับเนื่องจากไม่มีความล้มเหลวที่ปลอดภัย หากไม่ได้รับรูปภาพแอพใหม่เหมือนเดิมคุณต้องการให้อุปกรณ์ดำเนินการต่อเพื่อเรียกใช้ภาพเก่าไม่ให้ตายจนกว่าจะอัปโหลดสำเร็จ ด้วยเหตุผลนี้โดยปกติจะมีสองโมดูลพิเศษในเฟิร์มแวร์ผู้อัปโหลดและ bootloader ผู้อัปโหลดเป็นส่วนหนึ่งของแอพหลัก ในฐานะที่เป็นส่วนหนึ่งของการสื่อสารกับโฮสต์เป็นประจำคุณสามารถอัปโหลดรูปภาพแอปใหม่ได้ สิ่งนี้ต้องการหน่วยความจำแยกต่างหากจากอิมเมจหลักเช่น EEPROM ภายนอกหรือใช้ตัวประมวลผลที่ใหญ่กว่าดังนั้นครึ่งหนึ่งของพื้นที่หน่วยความจำของโปรแกรมสามารถจัดสรรเพื่อจัดเก็บอิมเมจแอพใหม่ได้ ผู้อัปโหลดเพิ่งเขียนภาพแอพใหม่ที่ได้รับที่ไหนสักแห่ง แต่ไม่ได้เรียกใช้ เมื่อโปรเซสเซอร์ถูกรีเซ็ตซึ่งอาจเกิดขึ้นกับคำสั่งจากโฮสต์หลังจากอัปโหลด bootloader ทำงาน ตอนนี้เป็นโปรแกรมแบบครบวงจรที่ไม่ต้องการความสามารถในการสื่อสารภายนอก มันเปรียบเทียบเวอร์ชันแอปปัจจุบันและที่อัปโหลดตรวจสอบ checksums ของพวกเขาและคัดลอกรูปภาพใหม่ไปยังพื้นที่แอปหากเวอร์ชันต่างกันและตรวจสอบภาพเช็คซัมใหม่ หากภาพใหม่เสียหายเพียงแค่เรียกใช้แอพเก่าเหมือนเดิม
ฉันทำ bootloaders มากมายและไม่มีสองอันเดียวกัน ไม่มี bootloader สำหรับใช้งานทั่วไปแม้ บริษัท ไมโครคอนโทรลเลอร์บางรายต้องการให้คุณเชื่อก็ตาม อุปกรณ์ทุกชิ้นมีข้อกำหนดของตัวเองและสถานการณ์พิเศษในการจัดการกับโฮสต์ นี่เป็นเพียงบางส่วนของ bootloader และบางครั้งการกำหนดค่าอัพโหลดที่ฉันใช้:
- bootloader พื้นฐาน อุปกรณ์นี้มีสายอนุกรมและจะเชื่อมต่อกับโฮสต์และเปิดตามต้องการ bootloader วิ่งจากรีเซ็ตและส่งคำขอตอบกลับการอัพโหลดไปยังโฮสต์ หากโปรแกรมอัพโหลดทำงานมันจะตอบสนองและส่งภาพแอพใหม่ หากไม่ตอบสนองภายใน 500 มิลลิวินาที bootloader จะยอมแพ้และเรียกใช้แอพที่มีอยู่ ในการอัปเดตเฟิร์มแวร์คุณต้องเปิดแอพ updater บนโฮสต์ก่อนจากนั้นจึงเชื่อมต่อและเปิดอุปกรณ์
- โปรแกรมอัพโหลดหน่วยความจำ ที่นี่เราใช้ขนาดต่อไปของ PIC ที่มีหน่วยความจำโปรแกรมมากเป็นสองเท่า หน่วยความจำของโปรแกรมแบ่งออกเป็นแอพหลัก 49% อิมเมจแอปใหม่ 49% และ bootloader 2% bootloader จะเรียกใช้จากการรีเซ็ตและคัดลอกอิมเมจแอพใหม่ไปยังอิมเมจแอพปัจจุบันภายใต้เงื่อนไขที่ถูกต้อง
- รูปภาพ EEPROM ภายนอก เช่น # 2 ยกเว้นว่าใช้ EEPROM ภายนอกเพื่อจัดเก็บภาพแอปใหม่ ในกรณีนี้โปรเซสเซอร์ที่มีหน่วยความจำมากขึ้นก็จะมีขนาดใหญ่ขึ้นเช่นกันและในตระกูลย่อยอื่นที่ไม่มีอุปกรณ์ต่อพ่วงที่เราต้องการ
- TCP bootloader นี่คือสิ่งที่ซับซ้อนที่สุดของพวกเขาทั้งหมด ใช้ PIC 18F ขนาดใหญ่ หน่วยความจำ 1/4 สุดท้ายของ bootloader ซึ่งมีสำเนาของเครือข่าย TCP ที่สมบูรณ์ bootloader รันจากการรีเซ็ตและพยายามเชื่อมต่อกับเซิร์ฟเวอร์อัพโหลดพิเศษที่พอร์ตที่รู้จักที่อยู่ IP ที่กำหนดค่าไว้ก่อนหน้านี้ นี่คือการติดตั้งขนาดใหญ่ที่มีเครื่องเซิร์ฟเวอร์เฉพาะสำหรับระบบทั้งหมด อุปกรณ์ขนาดเล็กแต่ละชิ้นจะเช็คอินกับเซิร์ฟเวอร์อัปโหลดหลังจากรีเซ็ตและจะได้รับสำเนาแอปใหม่ตามความเหมาะสม bootloader จะเขียนทับแอพที่มีอยู่ด้วยสำเนาใหม่ แต่จะรันเฉพาะเมื่อเช็คซัมถูกตรวจสอบ มิฉะนั้นจะกลับไปที่เซิร์ฟเวอร์อัพโหลดแล้วลองอีกครั้ง
เนื่องจาก bootloader นั้นเป็นโค้ดที่ซับซ้อนซึ่งมีเครือข่าย TCP เต็มสแต็กจึงต้องมีการอัพเกรดฟิลด์ด้วย วิธีที่เราทำก็คือให้เซิร์ฟเวอร์อัพโหลดฟีดเป็นแอพพิเศษที่มีวัตถุประสงค์เพียงเพื่อเขียนทับ bootloader เมื่อมันถูกดำเนินการจากนั้นรีเซ็ตเครื่องเพื่อให้ bootloader ใหม่ทำงานซึ่งจะทำให้เซิร์ฟเวอร์อัพโหลดส่ง รูปภาพแอปหลักล่าสุด ในทางเทคนิคไฟดับในช่วงไม่กี่มิลลิวินาทีใช้แอพพิเศษเพื่อคัดลอกอิมเมจใหม่เหนือ bootloader จะเป็นความล้มเหลวที่ไม่สามารถกู้คืนได้ ในทางปฏิบัติสิ่งนี้ไม่เคยเกิดขึ้น เราก็โอเคกับโอกาสที่ไม่น่าเป็นไปได้เพราะอุปกรณ์เหล่านี้เป็นส่วนหนึ่งของการติดตั้งขนาดใหญ่ซึ่งมีคนที่จะทำการบำรุงรักษาในระบบอยู่แล้วซึ่งหมายถึงการเปลี่ยนอุปกรณ์ฝังตัวเป็นครั้งคราวด้วยเหตุผลอื่น ๆ
หวังว่าคุณจะเห็นว่ามีความเป็นไปได้อื่น ๆ อีกมากมายแต่ละแบบมีความเสี่ยงความเร็วความเร็วต้นทุนความง่ายในการใช้งานการหยุดทำงาน ฯลฯ