[Rust] Embedded Rust: ๊ธฐ์ดˆ

์ž„๋ฒ ๋””๋“œ ํ™˜๊ฒฝ์—์„œ Rust๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ์›๋ฆฌ์™€ ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ณธ๋‹ค.

์ž„๋ฒ ๋””๋“œ๋ผ๊ณ  ํ•˜๋ฉด ์ฃผ๊ตฌ์žฅ์ฐฝ C๋งŒ ์“ธ ๊ฒƒ ๊ฐ™์ง€๋งŒ, ์˜์™ธ๋กœ Rust๋ฅผ ์‹ค์ œ๋กœ ํ™œ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๋“œ๋ฌผ๊ฒŒ๋‚˜๋งˆ ์žˆ๋‹ค.
ํ™˜๊ฒฝ๋„ ๊ทธ๋Ÿญ์ €๋Ÿญ ๋‚˜์˜์ง€ ์•Š์€ ํŽธ์ด๋‹ค.

C/C++์€ ์ง€์ €๋ถ„ํ•ด์„œ ์‹ซ๊ณ , ๋ชจ๋˜ํ•œ ์–ธ์–ด๋กœ ์ƒ์‚ฐ์„ฑ๊ณผ ์•ˆ์ •์„ฑ์„ ์žก๊ณ  ์‹ถ๋‹ค๋ฉด ํ˜„์žฌ๋กœ์„œ Rust ์™ธ์—๋Š” ๋งˆ๋•…ํ•œ ๋Œ€์•ˆ์ด ์—†๋Š” ๊ฒƒ ๊ฐ™๋‹ค.




no_std

๋ณดํ†ต Rust์—์„œ ์ผ๋ฐ˜ PC ํ™˜๊ฒฝ์œผ๋กœ ์ž‘์—…ํ•  ๋•Œ๋Š” std ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ํ™œ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ˆ˜์ค€์˜ ํ™˜๊ฒฝ๋„ ์กด์žฌํ•œ๋‹ค. MCU ์ˆ˜์ค€์˜ ์ž„๋ฒ ๋””๋“œ ํ™˜๊ฒฝ์ด ๋Œ€ํ‘œ์ ์ด๋‹ค.
๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  Rust๋Š” ์ด๋Ÿฌํ•œ ์ž„๋ฒ ๋””๋“œ ํ™˜๊ฒฝ์„ ๋ถ€๋ถ„์ ์œผ๋กœ ์ง€์›ํ•˜๋ฉฐ, ์ด์— ๋Œ€ํ•œ ์‚ฌ์šฉ ์ˆ˜์š”๋„ ์กด์žฌํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์—์„œ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ํ• ๊นŒ?
๋‹คํ–‰ํžˆ๋„ Rust๋Š” std๊ฐ€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ํ™˜๊ฒฝ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” core ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ณ„๋„๋กœ ์กด์žฌํ•œ๋‹ค.
core๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ œํ•œ์ ์ด๋‚˜๋งˆ Rust์˜ ์žฅ์ ๋“ค์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

no_std ํ™˜๊ฒฝ์—์„œ๋Š” ๊ฝค ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

  1. std ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ ,
  2. main ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ „์˜ ์ดˆ๊ธฐํ™”๊ฐ€ ์ง€์›๋˜์ง€ ์•Š์œผ๋ฉฐ
  3. ์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ ๋ฐฉ์ง€๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋˜๋ฉฐ
  4. 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