- Framework thế hệ mới được thiết kế để phát triển nhanh các ứng dụng nhúng an toàn và hiệu quả
- Đảm bảo an toàn bộ nhớ và luồng ở thời điểm biên dịch mà không cần runtime hay garbage collector, đồng thời đa nhiệm ngay cả khi không có RTOS
- Hỗ trợ nhiều vi điều khiển khác nhau với các chức năng chính như HAL, mạng, Bluetooth, USB, bootloader
- Tính đến cả xử lý thời gian thực lẫn thời lượng pin nhờ thiết kế tiết kiệm điện và executor dựa trên mức ưu tiên
- Đang trở thành nền tảng tiêu biểu cho phát triển nhúng bất đồng bộ kết hợp với hệ sinh thái Rust
Tổng quan về Embassy
- Embassy là framework thế hệ mới cho phép viết ứng dụng nhúng an toàn và hiệu quả bằng Rust và tính năng async
- Hoạt động không cần runtime, garbage collector hay hệ điều hành
- Đảm bảo an toàn bộ nhớ và luồng ngay tại thời điểm biên dịch
Kiến trúc dựa trên Rust + async
- Triển khai đa nhiệm hiệu quả trong môi trường nhúng thông qua tính năng async/await của Rust
- Các tác vụ được chuyển thành máy trạng thái (state machine) ở thời điểm biên dịch và chạy theo kiểu hợp tác
- Không cần cấp phát bộ nhớ động, chạy trên một stack duy nhất
- Đạt tốc độ cao hơn và kích thước mã nhỏ hơn ngay cả khi không cần context switching của RTOS
- Tài liệu được liên kết có đề cập đến lợi thế hiệu năng so với RTOS
Các thành phần chính (Batteries Included)
- Lớp trừu tượng hóa phần cứng (HAL)
- Điều khiển các chức năng phần cứng bằng API Rust an toàn
- Các nền tảng hỗ trợ chính: STM32, nRF, RP2040, MSPM0, ESP32, CH32, PolarFire SoC, PY32
- Quản lý thời gian (embassy-time)
- Cung cấp các kiểu Instant, Duration, Timer có thể dùng toàn cục, không bị overflow
- Hỗ trợ thời gian thực và tiết kiệm điện
- Có thể tạo nhiều executor để chạy tác vụ dựa trên mức ưu tiên
- Tự động chuyển lõi sang chế độ tiết kiệm điện khi rảnh, đánh thức bằng ngắt
- Mạng (embassy-net)
- Hỗ trợ Ethernet, IP, TCP, UDP, ICMP, DHCP
- Cấu trúc bất đồng bộ giúp đơn giản hóa quản lý timeout và xử lý nhiều kết nối
- Bluetooth
- Hỗ trợ nhiều stack BLE như
trouble, nrf-softdevice, embassy-stm32-wpan
- LoRa, USB, Bootloader
- Hỗ trợ stack LoRaWAN qua
lora-rs
embassy-usb triển khai USB CDC, lớp HID
embassy-boot hỗ trợ cập nhật firmware an toàn ngay cả khi mất điện
Thông số kỹ thuật và giấy phép
- Phiên bản Rust tối thiểu được hỗ trợ (MSRV): từ 1.75 trở lên
- Giấy phép: có thể chọn Apache-2.0 hoặc MIT
- Tên dự án là viết tắt của “** EMBedded ASYnc**”
2 bình luận
Tôi đã dùng
embassy-rsđể phát triển sản phẩm với STM32G030C8T6 đến cả giai đoạn sản xuất hàng loạt, và khi dùng thì có một vài nhược điểm.Khi cần truy cập vào những HAL không phổ biến, cuối cùng vẫn phải dùng cách tiếp cận kiểu framework RTIC.
Vì
asynccó khả năng dẫn đến việc sử dụng bộ nhớ kém hiệu quả nên cần phải cẩn thận.Trong môi trường có flash memory dưới 32KB thì việc phát triển bị hạn chế rất nhiều. (
log+ debug symbol, v.v.)Khi muốn phát triển trong hệ sinh thái ngoài NRF/STM/ESP/RP thì trên thực tế là rất khó.
Dùng
embassy-rsđể nếm thử Rust embedded thì tốt, nhưng nếu về sau muốn cải thiện theo hướng sản xuất hàng loạt và sự nghiệp thì có lẽ nên trải nghiệm RTIC nhiều hơn.Mặt khác, tôi cũng lo rằng việc nó trở thành kiểu advanced Rust Arduino với tính tiếp cận tốt có thể lại gây ra những tình huống khó xử khi làm các phát triển có độ khó cao.
Ý kiến trên Hacker News
Tôi là fan lớn của dự án Embassy. Đây là ví dụ hoàn hảo cho thấy async Rust tuyệt vời đến mức nào
Nó chạy không cần heap, và nhờ zero-cost abstraction nên có thể thực hiện đồng thời ngay cả trên chip đơn lõi. Cũng không có sự phức tạp của RTOS
Thật sự đáng kinh ngạc khi đội ngũ Embassy đã phát triển được đến mức này.
Ngoài ra, tôi cũng muốn giới thiệu reqwless, một HTTP client cho Embassy-net. Nó còn hỗ trợ cả HTTPS
Trước đây tôi không nghĩ Rust embedded tốt hơn C/C++, nhưng giờ thì tôi đánh giá quyết định mua MCU dựa trên việc nó có hỗ trợ Rust hay không
Nhưng đến giờ tôi vẫn chưa thực sự hiểu watchdog là gì
Điều tôi thích nhất ở Embassy là ở lớp pattern ứng dụng
Cấu trúc này để các tác vụ thiết bị sống lâu che giấu việc canh thời gian và phối hợp phía sau các API async nhỏ gọn
Ví dụ, với đoạn mã như
loop { let btn = ir.wait_for_press().await; }, trình biên dịch sẽ tự động tạo state machineTôi nghĩ phong cách này là kết quả tự nhiên của async + no-std
Tôi muốn thấy nhiều thảo luận hơn về cấu trúc ứng dụng kiểu này, thay vì chỉ nói về HAL hay executor
Bài viết miễn phí tôi viết cùng Brad Gibson cũng nói về ý tưởng này
Ngoài ra, tôi đã mở repo device-kit để thử nghiệm và ghi chép các pattern như vậy. Tôi cũng muốn biết thêm các repo khác đang thử điều tương tự
Hồi trước khi còn viết firmware NIC bằng state machine, nếu khi đó có thứ gì như async của Rust thì đã tuyệt biết bao
Trong C cũng có thể giả lập coroutine, nhưng nó quá hacky
Khi đó người ta tin rằng thread của RTOS là đắt đỏ, nhưng giờ nghĩ lại thì có lẽ không hẳn vậy
Nếu có async cho việc xử lý các giao thức như 802.11 thì mã nguồn hẳn đã nhỏ hơn và đơn giản hơn rất nhiều
Tôi thực sự rất thích Embassy
Tôi chuyển từ bare metal C và FreeRTOS sang, và cuối cùng cũng có cảm giác embedded đã có một toolchain hiện đại
Đặc biệt là hệ sinh thái xung quanh rất tuyệt — tích hợp probe-rs + cargo run, logging với defmt, embedded_hal, stm32-rs, v.v.
Tôi cũng đã dùng RTIC, nhưng cuối cùng gắn bó với Embassy vì ergonomics của cú pháp async
Tôi ngạc nhiên vì nó có thể build và chạy ngay trên macOS. Trước đây lúc nào cũng phải dùng Linux, còn giờ thì chạy thẳng trên chip M cũng được
Tôi mất một chút thời gian để hiểu khái niệm chia sẻ quyền truy cập ngoại vi, nhưng vì quy tắc khóa được ép buộc ở compile time nên hầu như không có bug
Chất lượng của USB và networking stack cũng rất cao. Tôi đang dùng PLDM over USB và Ethernet TCP stack, và mọi thứ hoạt động hoàn hảo
Điểm trừ là khó onboarding những người đã quen với ví dụ của vendor, và nếu vendor không biết Rust thì việc phối hợp debug sẽ khó khăn
Dù vậy, nếu ở trong hệ sinh thái STM thì tôi cực kỳ khuyến nghị
embassy_syncEmbassy và async Rust là đổi mới lớn nhất đã xảy ra với thế giới embedded trong 10 năm qua
RTOS dựa trên C có ý tưởng hay, nhưng dùng thực tế thì rất đau đầu. Một framework nhẹ như Embassy là bước tiến hóa rất tự nhiên
Trên thực tế, Embassy cũng có thể được xem như một hệ điều hành thời gian thực. Xem thêm bài này
Tôi đang viết lại Glicol sang no-std, và tổ hợp embassy-rs + 2350 là tốt nhất
Nếu bạn định bắt đầu phát triển embedded vào năm 2026, tôi rất khuyến nghị stack này
Hơi lạc đề một chút, nhưng tôi muốn hỏi nên bắt đầu từ đâu nếu mới làm quen với phát triển embedded
Tôi đã làm web hơn 10 năm và đang học sách Rust. Tôi vừa đặt Raspberry Pi, nhưng liệu nó có thực sự được xem là embedded không?
Một mẫu như NUCLEO-F767ZI có cổng USB là lựa chọn tốt
Nó có Wi‑Fi, BLE, cảm biến 6 trục, và còn chạy được demo C ngay lập tức. LVGL cũng rất tuyệt
Tôi chưa thử Rust trên đó, nhưng vì nó dựa trên RISC-V nên khá thú vị. Elecrow hay Makerfabs cũng là lựa chọn tốt cho người mới
Nếu dùng Rust thì rp-hal rất phù hợp để nhập môn, còn Embassy thì nên thử sau một chút
Nếu muốn tiến gần hơn đến kiểu bare metal thì tôi khuyên dùng bo ESP32. Nó rẻ, và có nhiều form factor khác nhau kèm sạc pin hoặc màn hình
Tôi đã làm một relay LoRa bằng Embassy để dùng với ứng dụng Bitchat (dựa trên nrf52)
Phần lớn mọi thứ chạy rất mượt, còn panic thì là do phía Nordic SoftDevice
Tôi từng làm một bộ điều khiển pedal amp guitar modeling Spark bằng Embassy
Nó điều khiển amp qua BLE, và tôi thấy khá thú vị vì BLE stack của Rust là mã nguồn mở hoàn toàn
Tuy vậy, nó vẫn còn ở giai đoạn đầu nên API thay đổi thường xuyên và tôi phải cố định git revision trong Cargo
Dù sao thì tương lai của dự án vẫn rất đáng kỳ vọng
Ngay cả Microsoft cũng đang dùng Embassy cho EC (Embedded Controller)
Xem thêm tại Open Device Partnership
Ariel OS là một hệ điều hành được xây dựng trên Embassy. Cũng đáng tham khảo