- เฟรมเวิร์กรุ่นถัดไป ที่ออกแบบมาเพื่อให้พัฒนาแอปพลิเคชันแบบฝังตัวที่ปลอดภัยและมีประสิทธิภาพได้อย่างรวดเร็ว
- มอบ ความปลอดภัยของหน่วยความจำและเธรดตั้งแต่คอมไพล์ไทม์ โดยไม่ต้องมีรันไทม์หรือ garbage collector และทำ มัลติทาสก์ได้โดยไม่ต้องใช้ RTOS
- รองรับไมโครคอนโทรลเลอร์หลากหลายรุ่น พร้อมฟังก์ชันหลักอย่าง HAL, networking, Bluetooth, USB, bootloader
- คำนึงถึงทั้งการประมวลผลแบบเรียลไทม์และอายุแบตเตอรี่ ด้วย การออกแบบประหยัดพลังงาน และ executor แบบอิงลำดับความสำคัญ
- กำลังก้าวขึ้นเป็น แพลตฟอร์มหลักของการพัฒนา embedded แบบ asynchronous ที่ผสานเข้ากับ ecosystem ของ Rust
ภาพรวมของ Embassy
- Embassy คือ เฟรมเวิร์กรุ่นถัดไป ที่ใช้ Rust และความสามารถ async เพื่อเขียนแอปพลิเคชันแบบฝังตัวได้อย่างปลอดภัยและมีประสิทธิภาพ
- ทำงานได้โดยไม่ต้องมีรันไทม์, garbage collector หรือระบบปฏิบัติการ
- รับประกัน ความปลอดภัยของหน่วยความจำและเธรด ได้ตั้งแต่คอมไพล์ไทม์
สถาปัตยกรรมบนพื้นฐาน Rust + async
- ใช้ความสามารถ async/await ของ Rust เพื่อทำ มัลติทาสก์ อย่างมีประสิทธิภาพในสภาพแวดล้อมแบบฝังตัว
- ทาสก์จะถูกแปลงเป็น state machine ตั้งแต่คอมไพล์ไทม์ และทำงานแบบร่วมมือกัน
- ไม่ต้องจัดสรรหน่วยความจำแบบไดนามิก และทำงานบนสแตกเดียว
- ทำให้ได้โค้ดที่เร็วกว่าและมีขนาดเล็กกว่า โดยไม่ต้องมี context switching ของ RTOS
- ในเอกสารที่ลิงก์ไว้มีการกล่าวถึงประสิทธิภาพที่เหนือกว่าเมื่อเทียบกับ RTOS
องค์ประกอบหลัก (Batteries Included)
- Hardware Abstraction Layer (HAL)
- ควบคุมความสามารถของฮาร์ดแวร์ผ่าน Rust API ที่ปลอดภัย
- รองรับหลัก ได้แก่ STM32, nRF, RP2040, MSPM0, ESP32, CH32, PolarFire SoC, PY32
- การจัดการเวลา (embassy-time)
- มี type อย่าง Instant, Duration, Timer ที่ใช้งานได้แบบ global และไม่มีปัญหา overflow
- รองรับเรียลไทม์และการใช้พลังงานต่ำ
- สร้าง executor ได้หลายตัวเพื่อรัน ทาสก์ตามลำดับความสำคัญ
- เมื่อว่าง ระบบจะสลับคอร์เข้าสู่โหมดประหยัดพลังงานโดยอัตโนมัติ พร้อม ปลุกด้วย interrupt
- เครือข่าย (embassy-net)
- รองรับ Ethernet, IP, TCP, UDP, ICMP, DHCP
- ด้วยโครงสร้าง asynchronous จึงทำให้ การจัดการ timeout และการรองรับหลายการเชื่อมต่อ เป็นเรื่องง่าย
- Bluetooth
- รองรับ BLE stack หลายแบบ เช่น
trouble, nrf-softdevice, embassy-stm32-wpan
- LoRa, USB, Bootloader
- รองรับ LoRaWAN stack ผ่าน
lora-rs
embassy-usb รองรับการทำงานของ USB CDC, HID class
embassy-boot รองรับ การอัปเดตเฟิร์มแวร์ที่ปลอดภัยแม้เกิดไฟดับ
ข้อมูลทางเทคนิคและไลเซนส์
- Rust เวอร์ชันต่ำสุดที่รองรับ (MSRV) : 1.75 ขึ้นไป
- ไลเซนส์: เลือกใช้ได้ระหว่าง Apache-2.0 หรือ MIT
- ชื่อโปรเจกต์ เป็นตัวย่อของ “** EMBedded ASYnc**”
2 ความคิดเห็น
ผมเคยใช้ embassy-rs กับ STM32G030C8T6 พัฒนาสินค้าจนถึงขั้นผลิตจริงมาแล้ว แต่พอใช้ก็มีข้อเสียอยู่บ้าง
เวลาต้องเข้าถึง HAL ที่ไม่ใช่มาตรฐาน สุดท้ายก็ยังต้องใช้แนวทางแบบเดียวกับตอนใช้เฟรมเวิร์ก RTIC
ต้องระวังเพราะ
asyncมีโอกาสทำให้การใช้หน่วยความจำไม่มีประสิทธิภาพถ้าจะพัฒนาในสภาพแวดล้อมที่มีแฟลชเมมโมรีต่ำกว่า 32KB จะค่อนข้างมีข้อจำกัดมาก (
log+ debug symbol ฯลฯ)หากอยากพัฒนาบนระบบนิเวศที่อยู่นอกเหนือจาก NRF/STM/ESP/RP ก็แทบจะยากมากในทางปฏิบัติ
การลองใช้ Rust embedded ผ่าน embassy-rs ถือว่าเป็นเรื่องดี แต่ถ้าต่อไปอยากพัฒนาให้ดีขึ้นทั้งในแง่การผลิตจริงและเส้นทางอาชีพ ก็น่าจะลอง RTIC ให้มากขึ้นหน่อย
อีกด้านหนึ่งก็มีความกังวลว่า การที่มันกลายเป็นเหมือน advanced rust arduino จนเข้าถึงได้ง่าย อาจกลับทำให้เวลาเจองานพัฒนาที่ยากขึ้นจริง ๆ กลายเป็นสถานการณ์ที่น่าลำบากก็ได้
ความคิดเห็นจาก Hacker News
ฉันเป็นแฟนตัวยงของโปรเจกต์ Embassy นี่เป็นตัวอย่างที่สมบูรณ์แบบว่าทำไม async Rust ถึงยอดเยี่ยม
มันทำงานได้โดยไม่ต้องใช้ heap และด้วยzero-cost abstraction จึงทำงานพร้อมกันได้แม้บนชิปคอร์เดียว โดยไม่มีความซับซ้อนของ RTOS
น่าทึ่งมากที่ทีม Embassy เติบโตมาได้ไกลขนาดนี้
อีกอย่าง อยากแนะนำ reqwless ซึ่งเป็น HTTP client สำหรับ Embassy-net รองรับ HTTPS ด้วย
เมื่อก่อนฉันไม่คิดว่า Rust embedded จะดีกว่า C/C++ แต่ตอนนี้ฉันตัดสินใจซื้อ MCU จากการรองรับ Rust แล้ว
แต่ฉันก็ยังไม่ค่อยเข้าใจว่า watchdog คืออะไร
สำหรับฉัน สิ่งที่ชอบที่สุดใน Embassy คือที่ชั้นรูปแบบแอปพลิเคชัน
งานของอุปกรณ์ที่มีอายุยาวจะซ่อนเรื่อง timing และการประสานงานไว้หลัง async API เล็ก ๆ
ตัวอย่างเช่นในโค้ดอย่าง
loop { let btn = ir.wait_for_press().await; }คอมไพเลอร์จะสร้าง state machine ให้โดยอัตโนมัติฉันคิดว่าสไตล์แบบนี้คือผลลัพธ์ตามธรรมชาติของ async + no-std
ฉันอยากเห็นการพูดคุยเรื่องโครงสร้างแอปพลิเคชันแบบนี้มากขึ้น มากกว่าเรื่อง HAL หรือ executor
บทความฟรี ที่ฉันเขียนร่วมกับ Brad Gibson ก็พูดถึงแนวคิดนี้
และฉันยังเปิดรีโป device-kit เพื่อทดลองและทำเอกสารรูปแบบพวกนี้ด้วย อยากรู้เหมือนกันว่ามีรีโปอื่นที่ลองแนวคล้าย ๆ กันไหม
ตอนที่เคยเขียนเฟิร์มแวร์ NIC เป็น state machine ถ้ามีอะไรแบบ async ของ Rust ตอนนั้นคงดีมาก
ใน C ก็พอเลียนแบบ coroutine ได้ แต่แฮ็กมาก
ตอนนั้นเราเชื่อว่า RTOS thread มีต้นทุนสูง แต่พอมาคิดตอนนี้ก็อาจไม่ได้เป็นแบบนั้นเสมอไป
ถ้ามี async สำหรับจัดการโปรโตคอลอย่าง 802.11 ด้วย โค้ดคงเล็กลงและเรียบง่ายกว่านี้มาก
ฉันชอบ Embassy มากจริง ๆ
ย้ายมาจากBare metal Cและ FreeRTOS แล้วรู้สึกว่าในที่สุด embedded ก็มี toolchain ที่ทันสมัยสักที
โดยเฉพาะ ecosystem รอบ ๆ นั้นยอดเยี่ยมมาก — probe-rs + การรวมกับ cargo run, การล็อกด้วย defmt, embedded_hal, stm32-rs ฯลฯ
ฉันเคยใช้ RTIC ด้วย แต่สุดท้ายก็ลงเอยกับ Embassy เพราะergonomicsของ syntax แบบ async
ฉันยังแปลกใจที่มัน build และรันบน macOS ได้ทันที เมื่อก่อนต้องใช้ Linux ตลอด แต่ตอนนี้ทำได้บนชิป M โดยตรงแล้ว
ฉันใช้เวลาพอสมควรกว่าจะเข้าใจแนวคิดเรื่องการแชร์การเข้าถึงอุปกรณ์ต่อพ่วง แต่เมื่อกฎของlockถูกบังคับตั้งแต่คอมไพล์ Bug ก็แทบไม่มีเลย
คุณภาพของสแตก USB และเครือข่ายก็ดีมาก ฉันใช้ PLDM over USB และ Ethernet TCP stack ซึ่งทำงานได้สมบูรณ์แบบ
ข้อเสียคือ การ onboard คนที่คุ้นกับตัวอย่างจาก vendor เดิม ๆ ทำได้ยาก และถ้า vendor ไม่รู้ Rust การดีบักร่วมกันก็ลำบาก
แต่ถ้าอยู่ใน ecosystem ของ STM ก็แนะนำอย่างยิ่ง
embassy_syncEmbassy และ async Rust คือนวัตกรรมที่ยิ่งใหญ่ที่สุดที่เกิดขึ้นในโลก embedded ในช่วง 10 ปีที่ผ่านมา
RTOS ฝั่ง C แม้แนวคิดจะดี แต่ตอนใช้งานจริงกลับทรมานมาก เฟรมเวิร์กเบา ๆ อย่าง Embassy คือวิวัฒนาการที่เป็นธรรมชาติ
จริง ๆ แล้ว Embassy อาจมองได้ว่าเป็นระบบปฏิบัติการเรียลไทม์ด้วยซ้ำ ดูรายละเอียดได้ในบทความนี้
ฉันกำลังเขียน Glicol ใหม่ให้เป็น no-std และคู่ผสมembassy-rs + 2350นี่ดีที่สุดมาก
ถ้าคุณวางแผนจะเริ่มพัฒนา embedded ในปี 2026 ก็แนะนำสแตกนี้อย่างมาก
ออกนอกประเด็นนิดหน่อย แต่ถ้าอยากเริ่มต้นพัฒนา embedded ควรเริ่มยังไงดี
ฉันทำเว็บดีเวลอปเมนต์มาเกิน 10 ปี ตอนนี้กำลังอ่านหนังสือ Rust อยู่ และเพิ่งสั่ง Raspberry Pi มา แบบนี้ถือว่าเป็น embedded จริงไหม?
รุ่นอย่าง NUCLEO-F767ZI ที่มีพอร์ต USB ก็ดีมาก
มีทั้ง Wi-Fi, BLE และเซ็นเซอร์ 6 แกน แถมยังรันเดโม C ได้ทันทีด้วย LVGL ก็ยอดเยี่ยม
ฉันยังไม่ได้ลอง Rust กับมัน แต่เพราะมันเป็น RISC-V เลยรู้สึกน่าสนใจ Elecrow กับ Makerfabs ก็ดีสำหรับมือใหม่
ถ้าใช้ Rust rp-hal เหมาะสำหรับเริ่มต้น และค่อยไปลอง Embassy ทีหลัง
ถ้าอยากเข้าใกล้bare metalมากขึ้น ฉันแนะนำบอร์ด ESP32 เพราะราคาถูก และมีหลายฟอร์มแฟกเตอร์ที่มาพร้อมที่ชาร์จแบตหรือหน้าจอ
ฉันสร้างLoRa relayด้วย Embassy เพื่อใช้กับแอป Bitchat (บน nrf52)
ส่วนใหญ่ทำงานได้ลื่นมาก และ panic ที่เจอเป็นปัญหาฝั่ง Nordic SoftDevice
ฉันเคยทำคอนโทรลเลอร์สำหรับแป้นเหยียบแอมป์กีตาร์โมเดล Sparkด้วย Embassy
ควบคุมแอมป์ผ่าน BLE และสิ่งที่น่าสนใจคือ Rust BLE stack เป็นโอเพนซอร์สทั้งหมด
แต่ตอนนี้มันยังอยู่ช่วงเริ่มต้น API เปลี่ยนบ่อย และต้อง pin git revision ใน Cargo
ถึงอย่างนั้นก็คาดหวังกับอนาคตของโปรเจกต์นี้มาก
Microsoft เองก็ใช้ Embassy กับงานEC (Embedded Controller) เช่นกัน
รายละเอียดดูได้ที่ Open Device Partnership
Ariel OS เป็นระบบปฏิบัติการที่สร้างอยู่บน Embassy น่าลองดู