[Rust] Embedded Rust: ๊ธฐ์ด
์๋ฒ ๋๋ ํ๊ฒฝ์์ Rust๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ์ ์ธ ์๋ฆฌ์ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํด๋ณธ๋ค.
์๋ฒ ๋๋๋ผ๊ณ ํ๋ฉด ์ฃผ๊ตฌ์ฅ์ฐฝ C๋ง ์ธ ๊ฒ ๊ฐ์ง๋ง, ์์ธ๋ก Rust๋ฅผ ์ค์ ๋ก ํ์ฉํ๋ ๊ฒฝ์ฐ๋ ๋๋ฌผ๊ฒ๋๋ง ์๋ค.
ํ๊ฒฝ๋ ๊ทธ๋ญ์ ๋ญ ๋์์ง ์์ ํธ์ด๋ค.
C/C++์ ์ง์ ๋ถํด์ ์ซ๊ณ , ๋ชจ๋ํ ์ธ์ด๋ก ์์ฐ์ฑ๊ณผ ์์ ์ฑ์ ์ก๊ณ ์ถ๋ค๋ฉด ํ์ฌ๋ก์ Rust ์ธ์๋ ๋ง๋ ํ ๋์์ด ์๋ ๊ฒ ๊ฐ๋ค.
no_std
๋ณดํต Rust์์ ์ผ๋ฐ PC ํ๊ฒฝ์ผ๋ก ์์ ํ ๋๋ std ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ ๊ทน์ ์ผ๋ก ํ์ฉํ๋ค.
ํ์ง๋ง ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ํ์ฉํ ์ ์๋ ์์ค์ ํ๊ฒฝ๋ ์กด์ฌํ๋ค. MCU ์์ค์ ์๋ฒ ๋๋ ํ๊ฒฝ์ด ๋ํ์ ์ด๋ค.
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ Rust๋ ์ด๋ฌํ ์๋ฒ ๋๋ ํ๊ฒฝ์ ๋ถ๋ถ์ ์ผ๋ก ์ง์ํ๋ฉฐ, ์ด์ ๋ํ ์ฌ์ฉ ์์๋ ์กด์ฌํ๋ค.
๊ทธ๋ฌ๋ฉด ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ํฉ์์ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ์์ฑํด์ผ ํ ๊น?
๋คํํ๋ Rust๋ std๊ฐ ์ฌ์ฉ ๋ถ๊ฐ๋ฅํ ํ๊ฒฝ์์๋ ์ฌ์ฉํ ์ ์๋ core ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ณ๋๋ก ์กด์ฌํ๋ค.
core๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ์ ์ด๋๋ง Rust์ ์ฅ์ ๋ค์ ํ์ฉํ ์ ์๋ค.
no_std ํ๊ฒฝ์์๋ ๊ฝค ๋ง์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค.

- std ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๊ณ ,
- main ํจ์ ํธ์ถ ์ ์ ์ด๊ธฐํ๊ฐ ์ง์๋์ง ์์ผ๋ฉฐ
- ์คํ์ค๋ฒํ๋ก ๋ฐฉ์ง๊ฐ ๋นํ์ฑํ๋๋ฉฐ
- HashMap, HashSet ๊ฐ์ ๋์ ๊ธฐ๋ฐ ์ปฌ๋ ์ ๋ ์ฌ์ฉ ๋ถ๊ฐ๋ฅํ๋ค.
ํ ํ ๋น์ ์ฌ์ฉํ ์ ์์ผ๋ ์ค์ ํ๊ธฐ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค. allocator ์ค์ ์ด ํ์ํ ์ ์๋ค.
no_std ๋ชจ๋๋ก๋ง ์ปดํ์ผํ๋ ค๋ฉด ์ต์๋จ์ #![no_std]๋ฅผ ์ง์ ํ๋ฉด ๋๋ค.
๊ทธ๋ฌ๋ฉด ๋ฐ๋ก ์๋ฐ์ด ๋ฌถ์ผ ๊ฒ์ด๋ค.
core ๋ผ์ด๋ธ๋ฌ๋ฆฌ
no_std ํ๊ฒฝ์์๋ core ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฐ์ ์ฌ์ฉํ ์ ์๋ค.
core๋ libc ์ข
์์ฑ์ด ์๋ Rust๋ง์ ๊ณ ์ ํ ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ตฌ์ฑ์์๋ค.
์ฌ์ฉ ์์ฒด๋ ์ด๋ ต์ง ์๋ค. ๊ธฐ๋ณธ ๊ตฌ์ฑ์์์ด๊ธฐ ๋๋ฌธ์ ๋ณ๋์ ์ค์ ์์ด๋ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค.

์๋ ๋ฌธ์์์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ ์ฒด ๋ชฉ๋ก์ ํ์ธํ ์ ์๋ค.
https://doc.rust-lang.org/core/
์ ๋ง ๊ธฐ๋ณธ๋ง์ ๊ฐ์ท๊ธฐ ๋๋ฌธ์, I/O ์ง์์ด ์ ๋ฌดํ๊ณ , ํ ํ ๋น๊ณผ ์ฐ๊ด๋ ๊ธฐ๋ฅ๋ ์ ํ ์๋ค.
I/O๋ ํ ํ ๋น ๊ฐ์๊ฒ ํ์ํ๋ค๋ฉด C FFI๋ฅผ ํตํด์ ์ฒ๋ฆฌ๋ฅผ ํด์ผํ ๊ฒ์ด๋ค.
ํ๊ฒ
์ผ๋ฐ์ ์ธ ์๋ฒ ๋๋ ํ๊ฒฝ์ด ๊ทธ๋ ๋ฏ์ด, ๋ณดํต ๊ฐ๋ฐ์ ์ผ๋ฐ PC์์ ํ๊ณ ๊ฒฐ๊ณผ๋ฌผ์ ์๋ฒ ๋๋ ์ฅ๋น์ ์ฌ๋ ค์ ์คํ์ ํ๊ฒ ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ ค๋ฉด ํ๊ฒ์ ์ค์นํด์ ๊ทธ๊ฑธ๋ก ์ปดํ์ผ์ ์์ผ์ผ ํ๋ค.
๋ฌ์คํธ์์ ์ง์๋๋ ํ๊ฒ์ ๊ฝค ๋ง๋ค.


๋ค์ ํฌ์คํธ์์๋ qemu๋ฅผ ํตํด์ ์๋ฎฌ๋ ์ด์ ์ ํด๋ณด๊ฒ ๋ค.
์ฐธ์กฐ
https://docs.rust-embedded.org/book/intro/no-std.html