เหตุใดเราจึงต้องใช้ bootloader แยกจากแอปพลิเคชันโปรแกรมของเราในไมโครคอนโทรลเลอร์


28

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

มีอะไรพิเศษเกี่ยวกับมันเพื่อแยกมันออกจากโปรแกรมแอปพลิเคชันหลัก?

โดยทั่วไปแล้ว bootloader ของระบบที่ใช้ไมโครโปรเซสเซอร์ (พูดว่า PowerPC MPC8270) ทำหน้าที่เหมือนกับของไมโครคอนโทรลเลอร์ (พูดกับ ARM STM32F103) หรือพวกเขากำลังทำงานที่แตกต่างกันโดยพื้นฐานและทั้งคู่ก็เรียกว่า 'bootloader' ?


2
เหตุผลเดียวกับที่คุณมีชิปและชิ้นส่วนแยกต่างหากและไม่ใช่โครงสร้างเสาหินยักษ์หนึ่งอัน
Emobe

คุณทำไม่ได้ เพียงเข้าสู่โปรแกรมของคุณด้วยสวิตช์และไฟที่คอนโซลคอมพิวเตอร์
Hot Licks

1
การพูดอย่างเคร่งครัดคุณไม่จำเป็นต้องใช้โปรแกรม bootloader แยกต่างหากในไมโครคอนโทรลเลอร์ แต่เรามักเลือกที่จะมีหนึ่งสำหรับฟังก์ชั่นยูทิลิตี้เพิ่มเติมที่มีให้ หากไม่จำเป็นต้องใช้ฟังก์ชั่นเหล่านี้คุณไม่จำเป็นต้องถอด bootloader โดยทั่วไป bootloader ของไมโครคอนโทรลเลอร์จะใช้เพื่อเขียนโปรแกรมใหม่ลงในแฟลช บางครั้งมันสามารถใช้สำหรับฟังก์ชั่นการดีบักจุดพักสนับสนุนบางส่วนและฟังก์ชั่นที่ดีอื่น ๆ บนไมโครคอมพิวเตอร์โดยทั่วไปแล้ว bootloader จะโหลดโปรแกรมจากหน่วยความจำขนาดใหญ่และจำเป็นต้องมี
ghellquist

คำตอบ:


55

bootloader บนไมโครคอนโทรลเลอร์ทำหน้าที่อัพเดตเฟิร์มแวร์หลักผ่านช่องทางการสื่อสารอื่นที่ไม่ใช่ส่วนหัวของโปรแกรมมิง สิ่งนี้มีประโยชน์สำหรับการอัปเดตเฟิร์มแวร์ในฟิลด์เหนือ BLE, UART, I2C, การ์ด SD, USB และอื่น ๆ มันไม่สะดวกอย่างยิ่งที่จะต้องให้ลูกค้าซื้อโปรแกรมเมอร์เพื่ออัพเดตเฟิร์มแวร์บนอุปกรณ์ของพวกเขา

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

หาก bootloader และแอปพลิเคชันถูกเก็บไว้พร้อมกันดังนั้นรหัส bootloader จะต้องถูกคัดลอกไปยัง RAM ก่อนที่จะสามารถทำงานได้เนื่องจากการอัปเดตเฟิร์มแวร์ใด ๆ จะลบรหัส bootloader ในแฟลช หากไฟถูกตัดด้วยรหัส bootloader ใน RAM และแฟลชถูกลบอุปกรณ์จะถูกปิดกั้น


3
เราเป็นเหตุผลเดียวกัน มันอยู่ในแฟลชเดียวกัน แต่ bootloader อยู่ในแนวขอบลบแฟลชและฉลาดพอที่จะลบแฟลชได้สูงกว่าที่อยู่ของมัน
Joshua

3
ในบางกรณีส่วนหัวการเขียนโปรแกรมของไมโครโปรเซสเซอร์อาจไม่สามารถเข้าถึงได้จริงโดยไม่ต้องถอดประกอบแชสซีของผลิตภัณฑ์ดังนั้นการสามารถทำโปรแกรมซ้ำผ่านบัส comms โดยไม่มีฮาร์ดแวร์เพิ่มเติมเป็นปัจจัยสำคัญสำหรับความน่าเชื่อถือ
John Go-Soco

6
@ alt-rose โปรแกรม bootloader และแอปพลิเคชั่นเป็นโปรแกรมที่คอมไพล์แยกต่างหากแต่ละตัวมีรหัสเริ่มต้นและmain()ฟังก์ชั่นของตัวเอง ที่กำลังขึ้น bootloader main()เริ่มต้นรหัสวิ่งและเรียกร้องของบูต ตรวจสอบโปรแกรม bootloader main()สำหรับโปรแกรมที่ถูกต้องแล้วกระโดดไปรหัสเริ่มต้นโปรแกรมนั้นซึ่งเรียกร้องของโปรแกรมประยุกต์ รหัสเริ่มต้นของแต่ละโปรแกรมจะเริ่มต้นสภาพแวดล้อมแบบรันไทม์ C สำหรับโปรแกรมที่เกี่ยวข้อง (เช่นเริ่มต้นตัวแปรสแต็ก ฯลฯ ) และโดยทั่วไปแล้วโปรแกรมจะmain()ไม่กลับไปเป็นรหัสเริ่มต้น
kkrambo

1
@ alt-rose: ในทำนองเดียวกับที่ CPU ได้รับที่อยู่เริ่มต้นของ bootloader - ไม่ทำเช่นนั้น แต่ CPU จะระบุว่าจะใช้อะไรเป็นที่อยู่เริ่มต้นของ bootloader และ bootloader จะระบุสิ่งที่จะใช้เป็นที่อยู่เริ่มต้นของโปรแกรมแอปพลิเคชัน
MSalters

4
@kkrambo ในขณะที่โดยทั่วไปความจริงไม่มีข้อกำหนด (หรือความจริงที่แท้จริงในระดับสากล) ว่า bootloader จะเขียนใน C หรือภาษา C-มาด้วยmainตลอด
Yakk

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

  2. ไมโครคอนโทรลเลอร์บางตัวไม่สามารถเรียกใช้รหัสจาก RAM หากบูตโหลดเดอร์ผสมกับซอฟต์แวร์ส่วนที่เหลือคุณจะไม่สามารถอัปเกรดซอฟต์แวร์ได้เพราะคุณไม่สามารถลบหน้าแฟลชที่คุณกำลังเรียกใช้งานอยู่ การทำงานรอบ ๆ คือการเขียนรหัสใหม่ไปที่ครึ่งหลังของแฟลชจากนั้นข้ามไปที่รหัสนั้น รหัสใหม่จะคัดลอกตัวเองไปยังแฟลชครึ่งแรก แน่นอนว่าข้อเสียคือแฟลชการเบิร์นช้าและตอนนี้คุณต้องทำสองครั้งขั้นตอนการโหลดอาจใช้เวลานานถึงสองเท่า นอกจากนี้วิธีแก้ไขปัญหานี้ จำกัด ขนาดแอปพลิเคชันของคุณไม่ให้ใหญ่กว่าครึ่งของแฟลชทั้งหมด

  3. ตัวตักสำหรับบูตที่เขียนมาเป็นอย่างดีพยายามตรวจสอบว่ามีรหัสที่ถูกต้องอยู่ในอุปกรณ์ก่อนที่จะพยายามเรียกใช้งาน หากตัวโหลดการบูตและรหัสอื่นผสมกันแล้วคุณจะมั่นใจได้อย่างไรว่ารูทีนการตรวจสอบของคุณจะทำงานหากรหัสทั้งหมดไม่โหลด

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


4
เป็นตัวอย่างของจุด 2 ไมโครคอนโทรลเลอร์บางคนอาจจะไม่ได้มี RAM เข้าถึงที่เริ่มต้น: ตัวอย่างเช่นราสเบอร์รี่ Piใช้ GPU ในการโหลด bootloader จากการ์ด SD ซึ่งจะช่วยให้การประมวลผล ARM และหน่วยความจำ
ErikF

11

โดยทั่วไปจะมีเพื่อให้คุณสามารถอัปเดตโปรแกรมหลักของคุณ

คุณต้องมีโค้ดที่รู้วิธีลบและสร้างโปรแกรมแฟลชภายในบางตัวซึ่งไม่สามารถเป็นโปรแกรมหลักได้เมื่อมันลบตัวมันเองมันจะไม่สามารถทำการโปรแกรมใหม่ได้


9

bootloader อนุญาตให้ MCU สื่อสารกับสิ่งอื่นเพื่อยอมรับโปรแกรมใหม่จัดเก็บและเรียกใช้หลังจากรีเซ็ต หากคุณไม่มี bootloader จำเป็นต้องมีโปรแกรมเมอร์เพื่อเข้าถึงหน่วยความจำและวางโปรแกรมไว้ในตำแหน่ง


2
นั่นมันสวยมาก MCU สามารถรับรหัสผ่านระบบย่อยการตั้งโปรแกรมพิเศษ (เช่น AVRICE หรือ JTAG) หรือโดยมี bootloader ในแฟลชอยู่แล้ว มันเป็นการตัดสินใจของแอพพลิเคชั่นว่า bootloader ซับซ้อนอย่างไรเช่นบางระบบสามารถโหลดโค้ดจาก WiFi ใน MCU ที่มีระดับต่ำมากเช่น ATTiny bootloader (และพินอนุกรม) เป็นโอเวอร์เฮดขนาดใหญ่ดังนั้นคุณจึงควรใช้โปรแกรมเมอร์เสมอ
รวย

7

นอกเหนือจากคำตอบที่ถูกต้องอื่น ๆ เกี่ยวกับการอนุญาตให้ reprogramming ของเฟิร์มแวร์หลักจาก bootloader อีกประโยชน์ของการมี bootloader จะแยกกันคือคุณสามารถแยกงาน "ทำครั้งเดียวในการบูต" จากตรรกะที่คุณต้องการระหว่างรันไทม์ จากนั้นหลังจากที่ bootloader เสร็จสิ้นภารกิจการกำหนดค่าเริ่มต้นเฟิร์มแวร์หลักสามารถขับ bootloader ด้วยรหัสที่ไม่ต้องการอีกต่อไปจากหน่วยความจำช่วยประหยัดพื้นที่ RAM ที่สำคัญ เป็นไปได้ที่จะประสบความสำเร็จในวิธีอื่น ๆ แต่ตัวแบ่ง bootloader / เฟิร์มแวร์ทำให้ง่ายขึ้นในหลาย ๆ สถาปัตยกรรม


1
บนไมโครคอนโทรลเลอร์รหัสส่วนใหญ่ไม่เคยอยู่ใน RAM ดังนั้นจึงไม่สามารถขับไล่ได้ คุณสามารถละทิ้งข้อมูล bootloader จาก RAM แน่นอน
Ben Voigt

@ BenVoigt ขึ้นอยู่กับไมโครคอนโทรลเลอร์ บางคน (ส่วนใหญ่เป็นผู้ที่มีแฟลช NOR) จะช่วยให้คุณสามารถเรียกใช้โดยตรงจากแฟลช แต่คนอื่น ๆ (มักจะมีแฟลช NAND ซึ่งกำลังกลายเป็นเรื่องธรรมดามากขึ้น) ต้องการให้คุณเรียกใช้แรม บางครั้งไม่มีแม้แต่แฟลชออนบอร์ดและคุณต้องคัดลอกรหัสจากชิปแฟลชภายนอกลงใน SRAM ท้องถิ่นก่อนจึงจะสามารถดำเนินการใด ๆ ได้
Nate S - Reinstate Monica

2

คำตอบสั้น ๆ ก็คือซอฟต์แวร์นั้นยอดเยี่ยม

คุณสามารถมีทุกอย่างที่ bootloader ไม่ได้เป็น "ฮาร์ดแวร์บริสุทธิ์" แต่มันอยู่ไกลมากง่ายกว่าที่จะมีงานที่ bootloader เขียนเป็นซอฟต์แวร์แล้วตีความโดยฮาร์ดแวร์

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

สำหรับซอฟต์แวร์ระดับไมโครที่น้อยกว่าเมื่อคุณรันโปรแกรมปฏิบัติการตัวโหลดแอพพลิเคชั่นจะทำสิ่งต่าง ๆ เช่นการโหลดบางส่วนของข้อมูลลงในหน่วยความจำบางครั้งจะแก้ไขที่อยู่ตั้งค่าการขัดแย้งกับสิ่งหลัก จากนั้นข้ามไปที่จุดเริ่มต้นของ_mainรหัส บางสิ่งเหล่านี้สามารถทำได้โดย bootloader

ในไมโครคอนโทรลเลอร์งานบางอย่างที่ bootloader สามารถแบ่งออกเป็นโปรแกรมได้ คอมไพเลอร์สำหรับแพลตฟอร์มของคุณสามารถฉีดรหัส "ตั้งค่า" ลงในทุกไฟล์ที่เรียกใช้งานได้โดยอัตโนมัติ

แต่การมีไว้ใน bootloader หมายความว่าคอมไพเลอร์เดียวกันอาจทำงานบนฮาร์ดแวร์ที่แตกต่างกันเนื่องจาก bootloader สามารถ "ซ่อน" ความแตกต่างระหว่างแพลตฟอร์ม

ด้านบนที่ปิดด้วยความจริงที่ว่าแฟลชของโปรแกรมหลักไม่ได้เสี่ยงต่อ bootloader (และความสามารถในการ reflash โปรแกรมหลัก) และการมี bootloader ที่ไม่สำคัญนั้นเป็นสิ่งที่ยอดเยี่ยม


-1

คำตอบหนึ่งที่ไม่ได้รับการคุ้มครองคือความจำเป็นในการแยกข้อกังวลออกเนื่องจากข้อ จำกัด ของภาษา C

โดยทั่วไป bootloaders เขียนในชุดของการประกอบและ C กับขั้นตอนการบูตในช่วงต้น

ทำการตั้งค่าบางอย่างเช่น:

  • การจัดสรรสแต็ก C
  • การอ่านตัวชี้สแต็กเข้าสู่รีจิสเตอร์
  • อ่านตัวนับโปรแกรมลงในทะเบียน
  • ประกาศเวกเตอร์รีเซ็ต
  • โหลดสเตจที่สอง (initramfs) ลงใน RAM

นี่เป็นการประมาณคร่าวๆของขั้นตอนที่ดำเนินการและฉันกำลังอธิบายกระบวนการบูต ARM มันแตกต่างกันอีกครั้งสำหรับ x86 และสถาปัตยกรรมอื่น ๆ

อย่างไรก็ตามเหตุผลหลักยังคงเหมือนเดิม: การจัดสรร C stack ต้องทำจากชุดประกอบ


ทำไมต้องลงคะแนน นี่คือทั้งที่เกี่ยวข้องและถูกต้อง
BitShift

-1

ส่วนหนึ่งของคำถามที่ยังไม่ได้รับคำตอบจนถึงขณะนี้คือความแตกต่างระหว่าง bootloaders บนไมโครคอนโทรลเลอร์และระบบไมโครโปรเซสเซอร์

ไมโครคอนโทรลเลอร์

ไมโครคอนโทรลเลอร์ส่วนใหญ่มีหน่วยความจำ ROM ในตัวที่มีรหัสโปรแกรม การเปลี่ยนรหัสนี้มักจะต้องใช้อุปกรณ์โปรแกรมเมอร์ที่เชื่อมต่อกับอินเตอร์เฟสการเขียนโปรแกรมของไมโครคอนโทรลเลอร์ (เช่น ISP บน ATMega) แต่อินเตอร์เฟสการเขียนโปรแกรมเหล่านี้มักจะไม่ค่อยสะดวกในการใช้งานเมื่อเทียบกับอินเตอร์เฟสอื่น ๆ เนื่องจากอาจไม่พร้อมใช้งานในบริบทที่กำหนด ตัวอย่างเช่นในขณะที่คอมพิวเตอร์เกือบทุกเครื่องมีพอร์ต USB อินเทอร์เฟซ SPI ที่จำเป็นสำหรับ ISP นั้นค่อนข้างหายากและอินเทอร์เฟซอื่น ๆ เช่นอินเทอร์เฟซ PID ที่ใช้บน ATXMega นั้นรองรับฮาร์ดแวร์การเขียนโปรแกรมเฉพาะเท่านั้น

ดังนั้นหากคุณต้องการอัปเดตซอฟต์แวร์จากคอมพิวเตอร์ทั่วไปโดยไม่มีฮาร์ดแวร์ภายนอกคุณสามารถใช้ bootloader ที่อ่านจากอินเทอร์เฟซชนิดต่าง ๆ (เช่น RS232, USB หรือ RS232 ผ่าน USB เช่น Arduino) เพื่อตั้งโปรแกรมอุปกรณ์ ผ่านอินเตอร์เฟสทั่วไป

ที่กล่าวว่าถ้าคุณไม่ต้องการฟังก์ชั่นนี้ bootloader เป็นตัวเลือกที่สมบูรณ์ ไมโครคอนโทรลเลอร์ยังคงสามารถเรียกใช้รหัสได้อย่างสมบูรณ์โดยไม่ต้อง bootloader

ไมโครโปรเซสเซอร์

ในไมโครโปรเซสเซอร์สิ่งต่าง ๆ เล็กน้อย ในขณะที่ไมโครโปรเซสเซอร์ส่วนใหญ่มี ROM ที่มีขนาดใหญ่พอสำหรับ bootloader แต่ ROM นั้นไม่ใหญ่พอที่จะใช้กับระบบปฏิบัติการแบบเต็ม ดังนั้นวัตถุประสงค์ของ bootloader คือการเริ่มต้นฮาร์ดแวร์ค้นหา OS ที่สามารถบู๊ตได้โหลดและเรียกใช้ ดังนั้น bootloader จึงมีความสำคัญสำหรับการบู๊ตทุกครั้ง

ในระบบ x86 / x64 bootloader นี้เป็นไบออสหรือ UEFI (โดยทั่วไปคือไบออสเวอร์ชั่นใหม่กว่า)

บางครั้งคุณอาจมี bootloaders หลายตัวทำงานในสายโซ่ ตัวอย่างเช่นหากคุณมีระบบดูอัลบูตด้วย Windows และ Linux คุณอาจต้องทำสิ่งต่อไปนี้:

  • BIOS / UEFI บูทขึ้นและพบว่า GRUB ได้รับการติดตั้ง จากนั้นโหลด GRUB (= Grand Unified Bootloader)
  • GRUB ค้นหา Linux และ Windows Bootloader บางประเภท ผู้ใช้เลือก Windows Bootloader
  • bootloader ของ Windows เริ่มทำงานและค้นหา Windows 7 และ Windows 10 ที่ติดตั้ง ผู้ใช้เลือก Windows 10
  • Windows 10 จะบู๊ตในที่สุด

ดังนั้นในกรณีนี้มีซอฟต์แวร์สามชิ้นที่สามารถพิจารณาเป็น bootloader ได้ ทั้ง GRUB และ Windows Bootloader ส่วนใหญ่อยู่ที่นั่นเพื่อให้ผู้ใช้ตัวเลือกการบูตที่สะดวกกว่า BIOS / UEFI จะให้พวกเขา นอกจากนี้ยังอนุญาตให้มีการเปิดตัวระบบปฏิบัติการหลายระบบจากฮาร์ดไดรฟ์เดียวกันหรือแม้แต่พาร์ติชันเดียวกัน

TLDR

ดังนั้นในขณะที่ทั้งสองระบบ bootloader ทำสิ่งที่คล้ายกัน (ช่วยให้ผู้ใช้เลือกรหัสที่จะบูต) พวกเขาทั้งสองต่างกันอย่างมากในวิธีที่พวกเขาบรรลุและสิ่งที่พวกเขาทำ


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

แน่นอนความแตกต่างระหว่างไมโครคอนโทรลเลอร์และไมโครโปรเซสเซอร์ไม่ใช่เส้นขอบแข็งและไมโครคอนโทรลเลอร์บางตัวทำงานเหมือนไมโครโปรเซสเซอร์และในทางกลับกัน นั่นเป็นเหตุผลที่ฉันนำ AtMega / Arduino และ x86 / x64 เป็นตัวอย่างเพราะพวกมันมีพฤติกรรมแบบนั้น
Dakkaron

"ไมโครโปรเซสเซอร์มี ROM ที่มีขนาดใหญ่พอสำหรับ bootloader ... ในระบบ x86 / x64 bootloader นี้เป็นไบออสหรือ UEFI" BIOS หรือ UEFI ถูกเก็บไว้ในหน่วยความจำแฟลชนอกชิป ROM บนชิปมีไว้สำหรับฟังก์ชั่นระดับล่างเช่นการกำหนดค่าเริ่มต้นของไมโครโค้ด
Ben Voigt

@ Dakkaron: ฉันจะวาดเส้นแบ่งระหว่างไมโครโปรเซสเซอร์และไมโครคอนโทรลเลอร์ตามว่าชิปนั้นถูกออกแบบมาให้สามารถใช้งานได้โดยไม่มีจุดประสงค์เล็กน้อยโดยไม่มีสิ่งใดบนบัสที่อยู่ 8031 จะไม่มีคุณสมบัติยกเว้นว่าเป็นหน้าที่ 8051 (ซึ่งแน่นอนว่าเป็นไมโครคอนโทรลเลอร์) ซึ่งไม่ได้ระบุว่ามีสิ่งใดที่มีประโยชน์ใน ROM ภายใน แต่จะถูกออกแบบมาให้สามารถใช้งานได้อย่างสมบูรณ์จากหน่วยความจำภายใน) บางอย่างเช่น RCA / CDP 1802 จะไม่ผ่านการรับรองถึงแม้ว่ามันจะสามารถใช้ในการขับเคลื่อนป้ายชื่อ LED ...
supercat

... ที่ไม่มี RAM และ ROM ภายนอกเนื่องจากการออกแบบ RAMless / ROMless จำกัด เฉพาะงานที่ไม่สำคัญ บางอย่างเช่น TMS 32050 ซึ่งถ้าฉันจำได้ว่ามี bootloader และคำสองสามพันคำของ RAM แบบบิตภายในจะมีคุณสมบัติเป็นไมโครคอนโทรลเลอร์อย่างไรก็ตาม แม้ว่าแอพพลิเคชั่นหลายตัวจะต้องการการเพิ่ม RAM มากขึ้นหากเชื่อมต่อผ่าน UART ไปยังระบบอื่น
supercat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.