รายละเอียด Arduino Bootloader


11

ใครช่วยอธิบายวิธีการที่bootloader ของ Arduinoทำงานได้หรือไม่? ฉันไม่ได้มองหาคำตอบระดับสูงที่นี่ฉันอ่านรหัสและได้รับส่วนสำคัญของมัน ฉันได้อ่านข้อความอื่น ๆ ของโพสต์นี้ด้วย(ฉันยังเป็นหนึ่งในผู้ตอบคำถามด้วย)

มีการโต้ตอบโปรโตคอลจำนวนมากที่เกิดขึ้นระหว่าง Arduino IDE และรหัส bootloader ซึ่งส่งผลให้มีคำแนะนำในการประกอบแบบอินไลน์จำนวนมากซึ่งจะทำการตั้งโปรแกรมแฟลชเองด้วยโปรแกรมที่ส่งผ่านอินเตอร์เฟสแบบอนุกรม

สิ่งที่ฉันไม่ชัดเจนในบรรทัด 270:

void (*app_start)(void) = 0x0000; 

... ซึ่งฉันจำได้ว่าเป็นการประกาศและการเริ่มต้นเป็น NULL ของตัวชี้ฟังก์ชั่น มีการเรียก app_start ในลำดับต่อไปในตำแหน่งที่ bootloader มีวัตถุประสงค์เพื่อมอบหมายให้เรียกใช้งานโค้ดที่ผู้ใช้โหลด

แน่นอนว่าapp_startต้องมีค่าที่ไม่ใช่ค่า NULL ในบางจุดเพื่อให้ทุกคนมารวมกัน ฉันไม่เห็นว่าในรหัส bootloader ... มันเชื่อมโยงอย่างน่าอัศจรรย์โดยโปรแกรมที่โหลดโดย bootloader หรือไม่ ฉันสันนิษฐานว่า main ของ bootloader เป็นจุดเข้าสู่ซอฟต์แวร์หลังจากรีเซ็ตชิป

ห่อใน 70 หรือมากกว่านั้นสายการประกอบจะต้องเป็นแหวนถอดรหัสลับที่บอกโปรแกรมหลักที่ app_start เป็นจริง? หรืออาจเป็นเพราะความรู้โดยนัยที่นำมาใช้โดย Arduino IDE? สิ่งที่ฉันรู้ก็คือถ้ามีคนไม่เปลี่ยน app_start ให้ชี้ไปที่อื่นที่ไม่ใช่ 0 รหัส bootloader จะหมุนเองตลอดไป ... ดังนั้นเคล็ดลับคืออะไร?

ในบันทึกย่อที่แยกต่างหากมันเป็นไปได้ไหมที่รหัส bootloader จะขึ้นอยู่กับการขัดจังหวะหรือว่าไม่มีรหัส?

แก้ไข

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

ฉันคิดว่าฉันสามารถใช้งาน AVR307 เพื่อใช้ USI เป็น half-duplex UART (ใช้ Timer0 interrupt, และ pin-change interrupt) ใครสามารถให้คำแนะนำเกี่ยวกับวิธีการเกี่ยวกับการเขียน / การย้ายรหัส bootloader สำหรับชิปที่ไม่มีฮาร์ดแวร์รองรับ bootloaders?

ฉันคิดว่าฉันจะใส่รหัส bootloader ของฉันที่ตำแหน่งปกติสำหรับที่อยู่หลัก (เช่น 0x029e หรือที่ใดก็ตามที่คอมไพเลอร์วางหลัก) ฉันจะทำให้มันเป็น 'ที่อยู่' ในรหัส bootloader เพิ่มการชดเชยที่ทำให้ฉันเพิ่งผ่านจุดสิ้นสุดของหลักและมีการตั้งค่า 'app_start' ไปยังที่อยู่นั้น ฉันกำลังคิดเกี่ยวกับเรื่องนี้อย่างถูกต้องหรือฉันขาดอะไรบางอย่างโดยสิ้นเชิง? ขอบคุณ!

แก้ไข 2

FWIW ฉันพบกระบวนการจัดทำเอกสารเกี่ยวกับวิธีการโหลด Arduino สเก็ตช์ลง ATTiny85ซึ่งเป็นที่ที่ฉันไปกับคำถามนี้ในตอนแรก ... ค่อนข้างเรียบร้อยฉันคิดว่า


1
stackoverflow.com/questions/3652233/arduino-bootloader/...ถูกสงสัยว่าคำตอบของฉันไป ...
นิคที

คำตอบ:


12
void (*app_start)(void) = 0x0000; 

นี่ไม่ใช่ตัวชี้ NULL นี่คือที่อยู่ของรหัสแอปพลิเคชันเริ่มต้นซึ่ง bootloader ข้ามไป ตัวเชื่อมโยงจัดเรียงรหัสแอปพลิเคชันของคุณเพื่อเริ่มต้นที่ที่อยู่ 0 ดูตาราง 26-6 ในแผ่นข้อมูล ATMEGA168

รหัส bootloader เริ่มสูงขึ้นในแฟลช ตรงไหนขึ้นอยู่กับฟิวส์ bootloader


ที่ไม่ bootloader Reside รหัสหลักแล้ว ...
vicatcu

1
@Joby ไม่เป็นไร ... ดูการอัปเดตคำถามของฉัน - ฉันสนใจที่จะลองพอร์ต bootloader กับ Tiny AVR ซึ่งไม่มีพื้นที่หน่วยความจำแยกต่างหากสำหรับรหัสโหลดเดอร์
vicatcu

1
@Joby ดังนั้นรหัส bootloader อาศัย "... ฟิวส์การรีเซ็ตการบูตสามารถตั้งโปรแกรมเพื่อให้เวกเตอร์รีเซ็ตชี้ไปยังที่อยู่เริ่มต้น Boot Flash หลังจากรีเซ็ตในกรณีนี้ Boot Loader จะเริ่มหลังจากรีเซ็ต "
vicatcu

3
คุณต้องการ bootloader ของ Arduino โดยเฉพาะหรือไม่? มันจำลองโปรแกรมเมอร์ STK500 และเป็นเช่นนั้นค่อนข้างใหญ่ มีรุ่น atmega8 ใน bootloaders dir ที่คอมไพล์ภายใต้ 1K ด้วย gcc-3 แต่ถึงแม้จะทำให้คุณค่อนข้างสั้นในแฟลชที่มีอยู่
Peter Gibson

3
คุณต้องการแม้แต่บูตเดอร์จริงๆหรือไม่? แน่นอนว่า ATTiny น่าจะคุ้มค่ากับความพยายามของคุณในการเขียนโปรแกรมอุปกรณ์โดยใช้โปรแกรมเมอร์ ICSP (เช่น usbTinyISP)
SingleNegationElimination
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.