From c7f7eb52d3b2df3ce8850333f084f5b2e525a984 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9C=A4=EC=88=98?= Date: Mon, 8 Apr 2024 22:38:47 +0900 Subject: [PATCH] =?UTF-8?q?riscv-xtensa=20=EB=B6=88=EB=AA=85=ED=99=95?= =?UTF-8?q?=ED=95=9C=20=EB=B2=88=EC=97=AD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/installation/riscv-and-xtensa.md | 154 ++++++++++++------------ src/installation/std-requirements.md | 54 ++++----- src/installation/using-containers.md | 49 ++++---- src/writing-your-own-application/std.md | 80 ++++++------ 4 files changed, 166 insertions(+), 171 deletions(-) diff --git a/src/installation/riscv-and-xtensa.md b/src/installation/riscv-and-xtensa.md index 336b5d4..ed41fba 100644 --- a/src/installation/riscv-and-xtensa.md +++ b/src/installation/riscv-and-xtensa.md @@ -1,77 +1,77 @@ -# `RISC-V` 와 `Xtensa` 타겟 - -[`espup`][espup-github] 는 `Xtensa` 및 `RISC-V` 아키텍처를 위한 Rust 어플리케이션을 개발하는 데 필요한 구성 요소의 설치 및 유지 관리를 단순화하는 도구입니다.. - -### 1. `espup`설치 - - `espup`를 설치하려면, 아래 명령어를 터미널에 실행하세요: -```shell -cargo install espup -``` - -미리 컴파일된 [릴리스 바이너리][release-binaries]를 직접 다운로드하거나 [`cargo-binstall`][cargo-binstall]을 사용할 수도 있습니다. - -[espup-github]: https://github.com/esp-rs/espup -[release-binaries]: https://github.com/esp-rs/espup/releases -[cargo-binstall]: https://github.com/cargo-bins/cargo-binstall - -### 2. 필수 툴체인 설치 - -다음을 실행하여 지원되는 모든 Espressif 대상에 대한 Rust 애플리케이션을 개발하는 데 필요한 모든 도구를 설치하십시오: -```shell -espup install -``` - -> ⚠️ **참고**: `std` 애플리케이션은 [`std` 개발 요구사항][rust-esp-book-std-requirements]에서 다루는 추가 소프트웨어를 설치해야 합니다. - -[rust-esp-book-std-requirements]: ./std-requirements.md - -### 3. 환경 변수 설정하기 -`espup`은 프로젝트를 구축하는 데 필요한 몇 가지 환경 변수가 포함된 내보내기 파일을 만들 것이다. - -Windows (`%USERPROFILE%\export-esp.ps1`) - - 이 파일을 실행할 **필요가 없습니다**. 수정된 환경변수를 보여주는 용도로 만든것입니다. - -유닉스 기반 운영체제 - (`$HOME/export-esp.sh`). 파일을 sourcing하기위한 다른 방법들이 있습니다: -- 매 터미널에서 이 파일을 source하기: - 1. 해당 파일을 source하기: `. $HOME/export-esp.sh` - - 이 방식은 매 새 쉘을 열때마ㅏ 실행해줘야합니다. - -- `export-esp.sh`를 실행하는 alias 만들기: - - 1. 쉘 프로파일 (`.profile`, `.bashrc`, `.zprofile`, 등.)에 다음 명령어를 복사 붙여넣기 하세요: `alias get_esprs='. $HOME/export-esp.sh'` - 2. 터미널 세션을 재시작하시거나 `source [프로파일 경로]` 명령어를 실행하세요, 예를 들면, `source ~/.bashrc`. - - 이 방식은 매 쉘마다 sourcing을 안해도됩니다, `export-esp.sh`스크립트는 새로운 쉘이 실행될때 자동으로 실행됩니다. - -### `espup`는 무엇을 설치하나요? - -Espressif 대상을 지원하기위해, `espup` 다음과 같은 도구를 설치합니다. - -- Espressif 대상 지원을 위한 Espressif Rust fork -- `RISC-V` 대상을 위한 `nightly` 툴체인 -- `Xtensa`대상을 위한 `LLVM` [fork][llvm-github-fork] -- final binary를 링크하는 [GCC 툴체인][gcc-toolchain-github-fork] - -fork 컴파일러는 표준 Rust 컴파일러와 공존할 수 있으며, 둘 다 시스템에 설치할 수 있습니다. fork 컴파일러는 [오버로딩 메소드][rustup-overrides]를 사용할 때 호출됩니다. - -> ⚠️ **참고**: 우리는 fork를 업스트림하기위해 노력을 하고있습니다 -> 1. `LLVM` fork에 변화는 이미 진행중입니다, [tracking issue][llvm-github-fork-upstream issue]를 확인하세요. -> 2. Rust 컴파일러 Fork들에 대해, LLVM 변경이 수락되면, 우리는 Rust 컴파일러 변경을 진행할 것입니다. - -오류가 발생하면, [문제 해결][troubleshooting] 장을 확인하세요. - -[llvm-github-fork]: https://github.com/espressif/llvm-project -[gcc-toolchain-github-fork]: https://github.com/espressif/crosstool-NG/ -[rustup-overrides]: https://rust-lang.github.io/rustup/overrides.html -[llvm-github-fork-upstream issue]: https://github.com/espressif/llvm-project/issues/4 -[troubleshooting]: ../troubleshooting/index.md - -### `Xtensa` Targets를 위한 다른 설치 방법 - -- [`rust-build`][rust-build] 설치 스크립트 사용. 이것은 과거에 권장되는 방법이었지만, 이제 설치 스크립트는 기능이 frozen되었다., 모든 새로운 기능은 `espup`에만 포함될 것이다. 원본 Repository [README][https://github.com/esp-rs/rust-build.git]를 참조하십시오. -- 소스에서 `Xtensa` Rust 컴파일러를 구축하세요. 이 과정은 계산 비용이 많이 들고 시스템에 따라 완료하는 데 한 시간 이상이 걸릴 수 있습니다. 이 접근 방식을 취할 주요 이유가 없다면 권장되지 않습니다. 여기 소스에서 빌드할 리포지토리가 있습니다: [`esp-rs/rust` repository][esp-rs-rust]. - -[rust-build]: https://github.com/esp-rs/rust-build#download-installer-in-bash -[esp-rs-rust]: https://github.com/esp-rs/rust +# `RISC-V` 와 `Xtensa` 타겟 + +[`espup`][espup-github] 는 `Xtensa` 및 `RISC-V` 아키텍처를 위한 Rust 어플리케이션을 개발하는 데 필요한 구성 요소의 설치 및 유지 관리를 단순화하는 도구입니다.. + +### 1. `espup`설치 + + `espup`를 설치하려면, 아래 명령어를 터미널에 실행하세요: +```shell +cargo install espup +``` + +미리 컴파일된 [릴리스 바이너리][release-binaries]를 직접 다운로드하거나 [`cargo-binstall`][cargo-binstall]을 사용할 수도 있습니다. + +[espup-github]: https://github.com/esp-rs/espup +[release-binaries]: https://github.com/esp-rs/espup/releases +[cargo-binstall]: https://github.com/cargo-bins/cargo-binstall + +### 2. 필수 툴체인 설치 + +다음을 실행하여 지원되는 모든 Espressif 대상에 대한 Rust 애플리케이션을 개발하는 데 필요한 모든 도구를 설치하십시오: +```shell +espup install +``` + +> ⚠️ **참고**: `std` 애플리케이션은 [`std` 개발 요구사항][rust-esp-book-std-requirements]에서 다루는 추가 소프트웨어를 설치해야 합니다. + +[rust-esp-book-std-requirements]: ./std-requirements.md + +### 3. 환경 변수 설정하기 +`espup`은 프로젝트를 구축하는 데 필요한 몇 가지 환경 변수가 포함된 내보내기 파일을 만들 것이다. + +Windows (`%USERPROFILE%\export-esp.ps1`) + - 이 파일을 실행할 **필요가 없습니다**. 수정된 환경변수를 보여주는 용도로 만든것입니다. + +유닉스 기반 운영체제 - (`$HOME/export-esp.sh`). 파일을 sourcing하기위한 다른 방법들이 있습니다: +- 매 터미널에서 이 파일을 source하기: + 1. 해당 파일을 source하기: `. $HOME/export-esp.sh` + + 이 방식은 매 새 쉘을 열때마ㅏ 실행해줘야합니다. + +- `export-esp.sh`를 실행하는 alias 만들기: + + 1. 쉘 프로파일 (`.profile`, `.bashrc`, `.zprofile`, 등.)에 다음 명령어를 복사 붙여넣기 하세요: `alias get_esprs='. $HOME/export-esp.sh'` + 2. 터미널 세션을 재시작하시거나 `source [프로파일 경로]` 명령어를 실행하세요, 예를 들면, `source ~/.bashrc`. + + 이 방식은 매 쉘마다 sourcing을 안해도됩니다, `export-esp.sh`스크립트는 새로운 쉘이 실행될때 자동으로 실행됩니다. + +### `espup`는 무엇을 설치하나요? + +Espressif 대상을 지원하기위해, `espup` 다음과 같은 도구를 설치합니다. + +- Espressif 대상 지원을 위한 Espressif Rust fork +- `RISC-V` 대상을 위한 `nightly` 툴체인 +- `Xtensa`대상을 위한 `LLVM` [fork][llvm-github-fork] +- final binary를 링크하는 [GCC 툴체인][gcc-toolchain-github-fork] + +fork 컴파일러는 표준 Rust 컴파일러와 공존할 수 있으며, 둘 다 시스템에 설치할 수 있습니다. fork 컴파일러는 [오버로딩 메소드][rustup-overrides]를 사용할 때 호출됩니다. + +> ⚠️ **참고**: 우리는 fork를 업스트림하기위해 노력을 하고있습니다 +> 1. `LLVM` fork에 변화는 이미 진행중입니다, [tracking issue][llvm-github-fork-upstream issue]를 확인하세요. +> 2. Rust 컴파일러 Fork들에 대해, LLVM 변경이 수락되면, 우리는 Rust 컴파일러 변경을 진행할 것입니다. + +오류가 발생하면, [문제 해결][troubleshooting] 장을 확인하세요. + +[llvm-github-fork]: https://github.com/espressif/llvm-project +[gcc-toolchain-github-fork]: https://github.com/espressif/crosstool-NG/ +[rustup-overrides]: https://rust-lang.github.io/rustup/overrides.html +[llvm-github-fork-upstream issue]: https://github.com/espressif/llvm-project/issues/4 +[troubleshooting]: ../troubleshooting/index.md + +### `Xtensa` Targets를 위한 다른 설치 방법 + +- [`rust-build`][rust-build] 설치 스크립트 사용. 이것은 과거에 권장되는 방법이었지만, 이제 설치 스크립트는 기능이 frozen되었다. 모든 새로운 기능은 `espup`에만 포함될 것입니다. 원본 Repository [README][https://github.com/esp-rs/rust-build.git]를 참조하십시오. +- 소스에서 `Xtensa` Rust 컴파일러를 구축하세요. 이 과정은 계산 비용이 많이 들고 시스템에 따라 완료하는 데 한 시간 이상이 걸릴 수 있습니다. 이 접근 방식을 취할 주요 이유가 없다면 권장되지 않습니다. 여기 소스에서 빌드할 리포지토리가 있습니다: [`esp-rs/rust` repository][esp-rs-rust]. + +[rust-build]: https://github.com/esp-rs/rust-build#download-installer-in-bash +[esp-rs-rust]: https://github.com/esp-rs/rust diff --git a/src/installation/std-requirements.md b/src/installation/std-requirements.md index 323f32a..1e464df 100644 --- a/src/installation/std-requirements.md +++ b/src/installation/std-requirements.md @@ -1,27 +1,27 @@ -# `std` 개발 요구사항 - -대상 아키텍처에 관계없이, [`std`][rust-esp-book-overview-std] 애플리케이션을 구축하는 데 필요한 다음과 같은 도구가 설치되어 있는지 확인하십시오: - -- ESP-IDF 전제조건: - - 윈도우: [`python`][python-website-download] 와 [`git`][git-website-download] - - 리눅스: [리눅스 ESP-IDF 전제조건][esp-idf-linux]. - - macOS: macOS ESP-IDF prerequisites][esp-idf-macos]. -- [`ldproxy`][embuild-github-ldproxy] binary crate: A tool that forwards linker arguments to the actual linker that is also given as an argument to `ldproxy`. Install it by running: -- [`ldproxy`][embuild-github-ldproxy] 바이너리 크레이트: `ldproxy`에 대한 인수로도 주어진 실제 링커에 링커 인수를 전달하는 도구. 실행하여 설치하세요: - - ```shell - cargo install ldproxy - ``` - -> ⚠️ **참고**: std 런타임은 [ESP-IDF][esp-idf-github] (Espressif IoT Development Framework)를 호스팅 환경으로 사용하지만 사용자는 설치할 필요가 없습니다. ESP-IDF는 `std` 애플리케이션을 구축할 때 모든 `std` 프로젝트가 사용해야 하는 크레이트인 [`esp-idf-sys`][esp-idf-sys-github]에 의해 자동으로 다운로드되고 설치됩니다. -> - -[rust-esp-book-overview-std]: ../overview/using-the-standard-library.md -[python-website-download]: https://www.python.org/downloads/windows/ -[git-website-download]: https://git-scm.com/downloads -[embuild-github-ldproxy]: https://github.com/esp-rs/embuild/tree/master/ldproxy -[esp-idf-sys-github]: https://github.com/esp-rs/esp-idf-sys -[esp-idf-github]: https://github.com/espressif/esp-idf -[esp-idf-linux]: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/linux-macos-setup.html#for-linux-users -[esp-idf-macos]: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/linux-macos-setup.html#for-macos-users - +# `std` 개발 요구사항 + +대상 아키텍처에 관계없이, [`std`][rust-esp-book-overview-std] 애플리케이션을 구축하는 데 필요한 다음과 같은 도구가 설치되어 있는지 확인하십시오: + +- ESP-IDF 전제조건: + - 윈도우: [`python`][python-website-download] 와 [`git`][git-website-download] + - 리눅스: [리눅스 ESP-IDF 전제조건][esp-idf-linux]. + - macOS: macOS ESP-IDF prerequisites][esp-idf-macos]. + +- [`ldproxy`][embuild-github-ldproxy] 바이너리 크레이트: `ldproxy`에 대한 인수로도 주어진 실제 링커에 링커 인수를 전달하는 도구. 실행하여 설치하세요: + + ```shell + cargo install ldproxy + ``` + +> ⚠️ **참고**: std 런타임은 [ESP-IDF][esp-idf-github] (Espressif IoT Development Framework)를 호스팅 환경으로 사용하지만 사용자는 설치할 필요가 없습니다. ESP-IDF는 `std` 애플리케이션을 구축할 때 모든 `std` 프로젝트가 사용해야 하는 크레이트인 [`esp-idf-sys`][esp-idf-sys-github]에 의해 자동으로 다운로드되고 설치됩니다. +> + +[rust-esp-book-overview-std]: ../overview/using-the-standard-library.md +[python-website-download]: https://www.python.org/downloads/windows/ +[git-website-download]: https://git-scm.com/downloads +[embuild-github-ldproxy]: https://github.com/esp-rs/embuild/tree/master/ldproxy +[esp-idf-sys-github]: https://github.com/esp-rs/esp-idf-sys +[esp-idf-github]: https://github.com/espressif/esp-idf +[esp-idf-linux]: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/linux-macos-setup.html#for-linux-users +[esp-idf-macos]: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/linux-macos-setup.html#for-macos-users + diff --git a/src/installation/using-containers.md b/src/installation/using-containers.md index 9c4b922..0d77686 100644 --- a/src/installation/using-containers.md +++ b/src/installation/using-containers.md @@ -1,26 +1,23 @@ -# Containers 사용하기 - -로컬 시스템에 직접 설치하는 대신, 컨테이너 내에서 개발 환경을 호스팅할 수 있습니다. Espressif는 `RISC-V`와 `Xtensa` 대상 아키텍처를 모두 지원하고 `std`와 `no_std` 개발을 모두 가능하게 하는 [`idf-rust`][idf-rust] 이미지를 제공합니다. - -`linux/arm64` 및 `linux/amd64` 플랫폼에 대한 수많은 태그를 찾을 수 있습니다. - -각 Rust 릴리스에 대해, 우리는 다음과 같은 명명 규칙으로 태그를 생성합니다: - -- `_` - - For example, `esp32_1.64.0.0` contains the ecosystem for developing `std`, and `no_std` applications for `ESP32` with the `1.64.0.0` `Xtensa` Rust toolchain. - - 예를 들어, `esp32_1.64.0.0`에는 `std`를 개발하기 위한 생태계와 `1.64.0.0` `Xtensa` Rust 툴체인이 있는 `ESP32`용 `no_std` 애플리케이션이 포함되어 있습니다. - -특별 케이스가 있다.: - -- ``은 모든 Espressif 대상과의 호환성을 나타내는 모든 것이 될 수 있습니다. -- `` can be `latest` which indicates the latest release of the `Xtensa` Rust toolchain -- ``은 `Xtensa` Rust 툴체인의 `최신` 릴리스를 나타내는 최신일 수 있습니다. - -Depending on your operating system, you can choose any container runtime, such as [Docker][docker], [Podman][podman], or [Lima][lima]. - -운영 체제에 따라 [Docker][docker], [Podman][podman], 또는 [Lima][lima]와 같은 컨테이너 런타임을 선택할 수 있습니다. - -[docker]: https://www.docker.com/ -[podman]: https://podman.io/ -[lima]: https://github.com/lima-vm/lima -[idf-rust]: https://hub.docker.com/r/espressif/idf-rust/tags +# Containers 사용하기 + +로컬 시스템에 직접 설치하는 대신, 컨테이너 내에서 개발 환경을 호스팅할 수 있습니다. Espressif는 `RISC-V`와 `Xtensa` 대상 아키텍처를 모두 지원하고 `std`와 `no_std` 개발을 모두 가능하게 하는 [`idf-rust`][idf-rust] 이미지를 제공합니다. + +`linux/arm64` 및 `linux/amd64` 플랫폼에 대한 수많은 태그를 찾을 수 있습니다. + +각 Rust 릴리스에 대해, 우리는 다음과 같은 명명 규칙으로 태그를 생성합니다: + +- `_` + - 예를 들어, `esp32_1.64.0.0`에는 `std`를 개발하기 위한 생태계와 `1.64.0.0` `Xtensa` Rust 툴체인이 있는 `ESP32`용 `no_std` 애플리케이션이 포함되어 있습니다. + +특별 케이스가 있다.: + +- ``은 모든 Espressif 대상과의 호환성을 나타내는 모든 것이 될 수 있습니다. +- `` can be `latest` which indicates the latest release of the `Xtensa` Rust toolchain +- ``은 `Xtensa` Rust 툴체인의 `최신` 릴리스를 나타내는 최신일 수 있습니다. + +운영 체제에 따라 [Docker][docker], [Podman][podman], 또는 [Lima][lima]와 같은 컨테이너 런타임을 선택할 수 있습니다. + +[docker]: https://www.docker.com/ +[podman]: https://podman.io/ +[lima]: https://github.com/lima-vm/lima +[idf-rust]: https://hub.docker.com/r/espressif/idf-rust/tags diff --git a/src/writing-your-own-application/std.md b/src/writing-your-own-application/std.md index e3dfe22..8f47c79 100644 --- a/src/writing-your-own-application/std.md +++ b/src/writing-your-own-application/std.md @@ -1,41 +1,39 @@ -# `std` 어플리케이션 만들기 - -`std` 애플리케이션을 개발하는 방법을 배우고 싶다면, [Ferrous Systems][ferrous-systems]와 함께 개발된 다음 교육 자료를 참조하십시오: - -- [Embedded Rust on Espressif][std-book] -- [`std-training`][std-repository] 레포지토리 - -The training is based on [ESP32-C3-DevKit-RUST-1][esp-rust-board]. You can use any other Espressif development board, but code changes and configuration changes might be needed. - -교육은 [ESP32-C3-DevKit-RUST-1][esp-rust-board]을 기반으로 합니다. 다른 Espressif 개발 보드를 사용할 수 있지만, 코드 변경과 구성 변경이 필요할 수 있습니다. - -* [입문 수준의 예제][intro]: - * [A basic hardware-check][hardware-check] - * [An HTTP Client][http-client] - * [An HTTP Server][http-server] - * [An MQTT Client][mqtt] -* [고급 수준의 예제][advanced]: - * 로우레벨 GPIO - * 일반적인 상황의 인터럽트 - * [I2C Driver][i2c-driver] - * [I2C Sensor Reading][i2c-sensor-reading] - * [GPIO/Button Interrupts][button-interrupt] - * RGB LED 조작 - -> ⚠️ **참고**: [`esp-idf-hal`][esp-idf-hal]의 예제 폴더 아래에 특정 주변 장치의 사용을 다루는 몇 가지 예가 있습니다. 즉, [`esp-idf-hal/examples`][esp-idf-hal-examples]. - -[ferrous-systems]: https://ferrous-systems.com/ -[std-book]: https://esp-rs.github.io/std-training/ -[std-repository]: https://github.com/esp-rs/std-training -[esp-rust-board]: https://github.com/esp-rs/esp-rust-board -[intro]: https://github.com/esp-rs/std-training/tree/main/intro -[hardware-check]: https://github.com/esp-rs/std-training/tree/main/intro/hardware-check -[http-client]: https://github.com/esp-rs/std-training/tree/main/intro/http-client -[http-server]: https://github.com/esp-rs/std-training/tree/main/intro/http-server -[mqtt]: https://github.com/esp-rs/std-training/tree/main/intro/mqtt -[advanced]: https://github.com/esp-rs/std-training/tree/main/advanced -[i2c-driver]: https://github.com/esp-rs/std-training/tree/main/advanced/i2c-driver -[i2c-sensor-reading]: https://github.com/esp-rs/std-training/tree/main/advanced/i2c-sensor-reading -[button-interrupt]: https://github.com/esp-rs/std-training/tree/main/advanced/button-interrupt -[esp-idf-hal-examples]: https://github.com/esp-rs/esp-idf-hal/tree/master/examples -[esp-idf-hal]: https://github.com/esp-rs/esp-idf-hal +# `std` 어플리케이션 만들기 + +`std` 애플리케이션을 개발하는 방법을 배우고 싶다면, [Ferrous Systems][ferrous-systems]와 함께 개발된 다음 교육 자료를 참조하십시오: + +- [Embedded Rust on Espressif][std-book] +- [`std-training`][std-repository] 레포지토리 + +교육은 [ESP32-C3-DevKit-RUST-1][esp-rust-board]을 기반으로 합니다. 다른 Espressif 개발 보드를 사용할 수 있지만, 코드 변경과 구성 변경이 필요할 수 있습니다. + +* [입문 수준의 예제][intro]: + * [A basic hardware-check][hardware-check] + * [An HTTP Client][http-client] + * [An HTTP Server][http-server] + * [An MQTT Client][mqtt] +* [고급 수준의 예제][advanced]: + * 로우레벨 GPIO + * 일반적인 상황의 인터럽트 + * [I2C Driver][i2c-driver] + * [I2C Sensor Reading][i2c-sensor-reading] + * [GPIO/Button Interrupts][button-interrupt] + * RGB LED 조작 + +> ⚠️ **참고**: [`esp-idf-hal`][esp-idf-hal]의 예제 폴더 아래에 특정 주변 장치의 사용을 다루는 몇 가지 예가 있습니다. 즉, [`esp-idf-hal/examples`][esp-idf-hal-examples]. + +[ferrous-systems]: https://ferrous-systems.com/ +[std-book]: https://esp-rs.github.io/std-training/ +[std-repository]: https://github.com/esp-rs/std-training +[esp-rust-board]: https://github.com/esp-rs/esp-rust-board +[intro]: https://github.com/esp-rs/std-training/tree/main/intro +[hardware-check]: https://github.com/esp-rs/std-training/tree/main/intro/hardware-check +[http-client]: https://github.com/esp-rs/std-training/tree/main/intro/http-client +[http-server]: https://github.com/esp-rs/std-training/tree/main/intro/http-server +[mqtt]: https://github.com/esp-rs/std-training/tree/main/intro/mqtt +[advanced]: https://github.com/esp-rs/std-training/tree/main/advanced +[i2c-driver]: https://github.com/esp-rs/std-training/tree/main/advanced/i2c-driver +[i2c-sensor-reading]: https://github.com/esp-rs/std-training/tree/main/advanced/i2c-sensor-reading +[button-interrupt]: https://github.com/esp-rs/std-training/tree/main/advanced/button-interrupt +[esp-idf-hal-examples]: https://github.com/esp-rs/esp-idf-hal/tree/master/examples +[esp-idf-hal]: https://github.com/esp-rs/esp-idf-hal