# 02 - Thiết lập môi trường phát triển dự án nhúng sử dụng Rust

## Vài điều cần làm rõ

Mình muốn series này sẽ có sự rõ ràng cần thiết, để tránh người mới làm quen với Rust cảm thấy bối rối. Dưới đây là những thông tin về thành phần và công cụ mình sẽ sử dụng xuyên suốt series, cũng như là những nguồn tài liệu tham khảo cho bạn để làm quen với ngôn ngữ mới này.

* MCU: **ESP32-C3** (được hỗ trợ bởi Espressif trong dự án esp-rs)
    
* OS: Ubuntu
    
* IDE: Visual Code
    
* Rust environment: no-std
    
* Reference book 📗: [The Rust on ESP Book](https://docs.espressif.com/projects/rust/book/preface.html), [The Embedded Rust Book](https://doc.rust-lang.org/beta/embedded-book/intro/index.html), [The Rust Programming Language](https://rust-book.cs.brown.edu/)
    
* Others: [Series của RustDev Vietnam](https://www.youtube.com/watch?v=xcOIagx0CT0&list=PLdR1IsYSj-j8gm3DpfxPVmOrmF54qbvPr), [rustlings](https://rustlings.rust-lang.org/)
    

## Cài đặt môi trường

### Dependencies

Trước hết, bạn cần đảm bảo có đủ các công cụ cần thiết để cài đặt Rust

```bash
sudo apt update -y
sudo apt install -y curl build-essential
```

### Rust Toolchain

Để cài đặt Rust, chúng ta sẽ sử dụng công cụ `rustup`. Tất nhiên bạn vẫn có thể cài Rust standalone, tuy nhiên mình khuyến khích bạn sử dụng `rustup` vì sự đơn giản trong quản lý phiên bản Rust.

Mở Terminal lên và chạy lệnh sau:

```bash
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
```

Nếu xuất hiện bảng chọn các tùy chọn cài đặt, hãy chọn `1) Proceed with installation (default)` bằng cách gõ `1` và Enter nhé.

Cargo là package manager và build system của Rust, nó sẽ được tự động cài đặt sau khi bạn chạy lệnh trên, còn giờ thì hãy thêm `cargo` vào PATH enviroment variable. Ở đây mình sử dụng shell `bash` mặc định

```bash
nano ~/.bashrc
```

Thêm dòng này vào cuối file và lưu lại

```bash
export PATH="$HOME/.cargo/bin:$PATH"
```

Khởi động một terminal session mới, hoặc đơn giản chạy lệnh `source ~/.bashrc` là được

Okay giờ thì kiểm tra phiên bản bằng lệnh `rustup -V`, kết quả sẽ tương tự sau

```bash
rek@RekPC:~$ rustup -V
rustup 1.27.1 (2025-03-14)
info: This is the version for the rustup toolchain manager, not the rustc compiler.
info: The currently active `rustc` version is `rustc 1.91.1 (ed61e7d7e 2025-11-07)`
```

Tuy nhiên, một vài feature của esp-rs yêu cầu bạn cần sử dụng phiên bản `nightly` của Rust toolchain, vì vậy chúng ta sẽ cài đặt nó bằng cách dùng lệnh sau

```bash
rustup install nightly
```

Mình sử dụng ESP32-C3 với kiến trúc tập lệnh là RV32IMC, vì vậy mình muốn file sau khi compile sẽ phù hợp với kiến trúc này. Cài đặt `target` bằng lệnh

```bash
rustup target add riscv32imc-unknown-none-elf
```

**(Nếu bạn dự định sử dụng ESP32 / ESP32-S2 / ESP32-S3 sử dụng Xtensa)**

```bash
# Cài đặt espup để quản lý toolchain cho target này
cargo install espup --lockednày
# Cài đặt toolchain cần thiết
espup install
# Tự động thiết đặt môi trường mỗi khi mở shell mới
cat $HOME/export-esp.sh >> ~/.bashrc
# Khởi động lại terminal session
source ~/.bashrc
```

## Cài đặt công cụ phát triển

### esp-generate

Công cụ này giúp chúng ta khởi tạo dự án với các cấu hình mong muốn một cách nhanh chóng, cài đặt với lệnh sau

```bash
cargo install esp-generate --locked
```

### espflash

Bộ công cụ dùng để flash các Espressif SoCs

```bash
cargo install espflash --locked
```

### probe-rs (khuyến khích dùng)

**Probe-rs** là một bộ công cụ hiện đại được viết bằng Rust, dùng để flash và debug cho MCU. Nếu bạn đã dùng qua `OpenOCD`, mình nghĩ trải nghiệm với `probe-rs` sẽ khiến bạn thích Rust hơn.

```bash
# Download udev rules từ probe.rs
curl -O https://probe.rs/files/69-probe-rs.rules
# Chuyển file rules vào /etc/udev/rules.d
sudo mv 69-probe-rs.rules /etc/udev/rules.d
# Load rules
sudo udevadm control --reload && sudo udevadm trigger
# Thêm user của bạn vào plugdev group
sudo groupadd --system plugdev && sudo usermod -a -G plugdev $USER
# Cài đặt probe-rs
cargo binstall probe-rs-tools
# Hoàn tất cài đặt
probe-rs complete install
```

### esp-config (tùy chọn)

Công cụ hỗ trợ chỉnh sửa tùy chọn cấu hình thông qua Terminal UI, tất nhiên nếu không dùng thì bạn hoàn toàn có thể thay đổi thủ công thông qua file `.cargo/config.toml`

```bash
cargo install esp-config --features=tui --locked
```

## Extension cho VS Code

Để thuận tiện cho việc phát triển với Rust, bạn có thể cài một số extension sau:

* Rust Syntax
    
* Dependi
    
* Debugger for probe-rs
    
* rust-analyzer
    
* Even Better TOML
    
* CodeLLDB
    

Để nhanh chóng cài đủ các extension trên, mình đã đóng gói tất cả vào cùng 1 extension pack, bạn chỉ cần cài extension pack [ESP SoCs firmware developing with Rust](https://marketplace.visualstudio.com/items?itemName=rek.esp-socs-firmware-developing-with-rust)

Trong VS Code, nhấn tổ hợp Ctrl + P và paste dòng sau rồi Enter là đủ

```bash
https://marketplace.visualstudio.com/items?itemName=rek.esp-socs-firmware-developing-with-rust
```

## Kết luận

Với việc thực hiện các bước trên, bạn đã thiết lập môi trường để phát triển dự án nhúng sử dụng Rust một cách hiệu quả 😉  
Ở bài viết tiếp theo, chúng ta sẽ làm quen với việc sử dụng Rust trong phát triển dự án nhúng. Tuy nhiên vì Rust là một ngôn ngữ hơi khó học đối với người bắt đầu, **minh khuyến khích các bạn tìm hiểu trước trong** [**“Rust Book”**](https://rust-book.cs.brown.edu/) **và tự làm quen với Rust qua** [**rustlings**](https://rustlings.rust-lang.org/)**, ngoài ra** [**series về Rust của RustDev Vietnam**](https://www.youtube.com/watch?v=xcOIagx0CT0&list=PLdR1IsYSj-j8gm3DpfxPVmOrmF54qbvPr) **cũng rất đáng tham khảo.**

[Bài viết trước: 01 - Rust là gì và tại sao dùng nó cho hệ thống nhúng?](https://blog.hybr.id.vn/01-rust-la-gi-va-tai-sao-dung-no-cho-he-thong-nhung)
