ãã®ããŒãã§ã¯ãRustã®ã¹ãã«ãåäžãããæçšãªãŠãŒãã£ãªãã£ãšã©ã€ãã©ãªãããã€ãäœæããŸãã GPIOãUARTãçµã¿èŸŒã¿ã¿ã€ããŒçšã®ãã©ã€ããŒãäœæããŸãã XMODEMãããã³ã«ãå®è£
ããŸãã ããããã¹ãŠã䜿çšããŠãåçŽãªã·ã§ã«ãšããŒãããŒããŒãäœæããŸãã èªãåã«ã æ¬ãèªãããšã匷ããå§ãããŸãã å°ãªããšãæåããæåŸãŸã§ã æ zyãªããããããå°ãçµéšãç©ãã 人ã«ã¯ã ããããå§ãã§ããŸãã ãã·ã¢èªã§ã¯ã ããã§æãããšãã§ããŸã ã
ãã¡ããã ãŒãã¬ãã«ããã€ãã¹ããããšã¯ãŸã£ãã䟡å€ããããŸããã ãŸãããã®éšåã®ååã¯ã©ãºããªãŒãå¿
èŠãšããŸããã
䟿å©ãªè³æ
- Rustã«ããBook v2.0 ã éäžã§ãã·ã¢èªã«ç¿»èš³ã 翻蚳è
ã®ããŒã ãããããïŒãããŠåœŒããå©ããïŒã ãã®å°ååã¯ãå°ãªããšãèªãã§ããªã人ã«ã¯ééããªãèªã䟡å€ããããŸãã
- Rustæšæºã©ã€ãã©ãªããã¥ã¡ã³ã ã ããã«ã¯ãã¹ãŠãçšæãããŠãããããã¯æšæºçŽåã§ãã
- docs.rs-ããŸããŸãªã©ã€ãã©ãªã®ããã¥ã¡ã³ããèªãããšãã§ããŸãã
- ç»é²ãšSMSãªãã®ãããªã³ã©ã€ã³ç¡æããŠã³ããŒãã RTFMïŒ
- XMODEMãããã³ã«ã«é¢ããWikièšäºã äžè¬çãªéçºããã³èµ·æºã®æŽå²ã«èå³ããã人ã®ããã«ã å®è£
ã«ã¯ã»ãšãã©åœ¹ç«ã¡ãŸããã ã»ãšãã©äœããããŸããã
- å¥ã® XMODEM ããã¥ã¡ã³ã ã
- BCM2837-ããã¯ã©ãºããªãŒã®å²åã«ã€ããŠã§ãã ãããååã
ãã§ãŒãº0ïŒã¯ããã«
念ã®ãããã³ãŒã¹äºæã®ãã¡ãŒã ãŠã§ã¢ãšãââãŒããŠã§ã¢ã䜿çšããŠããããšãããäžåºŠç¢ºèªããŠãã ããã
- ææ°ã®64ãããUnixã©ã€ã¯OSïŒLinuxãmacOSããŸãã¯BSD
- é©åãªUSBã³ãã¯ã¿ãŒããããŸãïŒèš±å¯ãããŠããªããã®ã¯æ·»ä»ãã¡ã€ã«ã䜿çšã§ããŸãïŒ
ããã«ã次ã®ããã°ã©ã ãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãïŒ git
ã wget
ã tar
ã screen
ã make
ãªã©ã ãŒãã¬ãã«ã«å¿
èŠãªãã¹ãŠã®ãã®ã ãã®ããŒãã§ã¯ã socat
ãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã
ååWindowsã§å¿
èŠãªãã¹ãŠãå®è¡ã§ããå Žåãä»åã¯ãã¹ãŠãåäœããã¯ãã§ãã ããããçªç¶ãµããŒãããªãå Žåã ç§ããªãªãžãã«ã®äœè
ããVendaãæã«å
¥ããããšããæãäžããããšãã欲æ±ãæã£ãŠããŸããã
ã³ãŒãæ€çŽ¢
ãã®éšåã®ã³ãŒãã次ã®ããã«è€è£œã§ããŸãã
git clone https://web.stanford.edu/class/cs140e/assignments/1-shell/skeleton.git 1-shell
èªåã§ãªããžããªã®å
容ãèªç±ã«æ¢çŽ¢ããŠãã ããã
ã質å
ãã®ã©ãããã³ä»¥äžã®ãã¹ãŠã®ã©ãã§ã¯ã 質åããããŸã ã ããªãã¯ãã¿ãã¬ã䜿çšããŠã³ã¡ã³ãã§çŽæ¥çããããšãã§ããŸãã 以äžã«äŸã瀺ããŸãã
ä»ã®GPIOãã³ãã©ã®ããã«æ§æããŠäœ¿çšããŸããïŒ [assignment0]
ååã¯ãç¹æ»
ããLEDã®ååã«16ãã³GPIOã䜿çšããŸããã ã¬ãžã¹ã¿GPFSEL1
ã GPSET0
ããã³GPCLR0
ãŸãã ãã³27ã䜿çšããå Žåãã©ã®ã¬ãžã¹ã¿ã䟿å©ã§ããïŒ ãããŠããã®27 GPIOãã³ã®ç©ççãªæ¥è§Šã¯äœã§ããïŒ
è§æ¬åŒ§ã¯ã questions/
ãã£ã¬ã¯ããªå
ã®ãã¡ã€ã«åã瀺ããŸãã ã³ã¡ã³ãã§åçããå¿
èŠããããããããã¯ç§ãã¡ã«ãšã£ãŠç¹ã«éèŠã§ã¯ãããŸããã èªåãçãããšç¢ºä¿¡ã§ãããŸã§ãä»äººã®çããèªãŸãªãã§ãã ããã ããã§ãªããã°ãé¢çœããããŸããã ãã ãããããã®ã¿ã°ã¯ã¹ãã€ã©ãŒã®ããããŒãšããŠäœ¿çšã§ããŸãã ãã ãããããã®ãã¡ã€ã«ã«æåã«æžã蟌ãããšããå§ãããŸãã 䟿å®äžã
ãã§ãŒãº1ïŒèŠ³èŠ§è»ïŒãããïŒ

ïŒã©ã¹ã¿ã«ã€ããŠã®ååãªç¥èãæ¢ã«ããå Žåããã®éšåã¯å®å
šã«ã¹ãããã§ããŸããïŒ
ãã¬ãŒãã³ã°ã®ããã«ããããŸãŸãªç®çã®ããã«Rustã®ããã°ã©ã ãç·šéããŸãã äžéšã¯ç·šéåŸã«ã³ã³ãã€ã«ããå¿
èŠããããŸãã ãã®ä»ã¯ã³ã³ãã€ã«ããªãã§ãã ãã ã 3çªç®ã®å Žåããã¹ãã¯æ£åžžã«å®äºããå¿
èŠããããŸãã
ferris-wheel/
ãã£ã¬ã¯ããªã®è
žã§ã¯ã以äžãèŠã€ããããšãã§ããŸãïŒ
compile-fail
ããªãããã«å£ããå¿
èŠãããã³ãŒããå«ãŸããŠããŸãcompile-pass
åã«æ£ç¢ºã«ä¿®æ£ããå¿
èŠãããã³ãŒããå«ãŸããŠããŸãrun-pass
ç·ã«ãªãã¯ãã®ãã¹ããå«ãã³ãŒããå«ãŸããŠããŸãquestions
-çè«äžã¯è³ªåã§ãããã³ã¡ã³ãã«ãã¹ãŠèšå
¥ã§ããããšã«ãã§ã«åæããŠããŸãã
test.sh test.sh
ã¯ãŸã ããtest.sh
ã 圌ã¯ã¿ã¹ã¯ã®æ£ããããã§ãã¯ããŸãã å®è¡ãããšãäºæ³ã©ããã§ã¯ãªãå Žæãšå
容ãéåžžã«äžè¬çã«èª¬æãããŸãã 次ã®ãããªãã®ïŒ
$ ./test.sh ERROR: compile-pass/borrow-1.rs failed to compile! ERROR: compile-pass/const.rs failed to compile! ... 0 passes, 25 failures
ããã«ãã¹ã¯ãªããã¯-v
ãã©ã°ãåãå
¥ããŸãã ãã®ãã©ã°ãã¹ã¯ãªããã«æž¡ããããšãã³ã³ãã€ã©ãŒãåãåºããšã©ãŒã衚瀺ãããŸãã
$ ./test.sh -v ERROR: compile-pass/borrow-1.rs failed to compile! ---------------------- stderr -------------------------- warning: unused variable: `z` --> /.../ferris-wheel/compile-pass/borrow-1.rs:9:9 | 9 | let z = *y; | ^ | = note: #[warn(unused_variables)] on by default = note: to avoid this warning, consider using `_z` instead error[E0507]: cannot move out of borrowed content --> /.../ferris-wheel/compile-pass/borrow-1.rs:9:13 | 9 | let z = *y; | ^^ | | | cannot move out of borrowed content | help: consider using a reference instead: `&*y` error: aborting due to previous error ... 0 passes, 25 failures
ãã®ã¹ã¯ãªããã¯ãæååããã£ã«ã¿ãŒãšããŠã䜿çšããŸãã 䜿çšå¯èœãªå Žåããã®ãã£ã«ã¿ãŒã«äžèŽãããã¡ã€ã«ãã¹ïŒ$ãã£ã¬ã¯ããª/ $ãã¡ã€ã«åïŒã®ã¿ããã§ãã¯ãããŸãã äŸïŒ
./test.sh trait ERROR: compile-pass/trait-namespace.rs failed to compile! ERROR: run-pass/trait-impl.rs failed to compile! 0 passes, 2 failures
äžæ¹ãä»æ¹ã«å¹²æžããããšã¯ãªãããã£ã«ã¿ãŒãš-v
çµã¿åãããããšãã§ããŸãã ãã®ãããªãã®ïŒ ./test.sh -v filter
ã
ã©ã®ãããå€æŽã§ããŸããïŒ
åãã¡ã€ã«ã«ã¯ã³ã¡ã³ããå«ãŸããŠãããã³ã¡ã³ããã©ã®çšåºŠæãªãããå¯èœæ§ããããã瀺ããŸãïŒå·®åäºç®ïŒã ã€ãŸã ããã°ã©ã ãä¿®æ£ããããã«è¡ãããšãã§ããå€æŽã®æ倧æ°ã ãã®ãã¬ãŒã ã¯ãŒã¯ã«é©åããªã決å®ã¯ã倱æãããšã¿ãªãããšãã§ããŸãã
äŸãšããŠã ãã¡ã€ã«compile-pass/try.rs
ã³ã¡ã³ãããããŸãã
è¿œå ã§ããã³ãŒãã¯12è¡ãŸã§ã§ãïŒç©ºã®è¡ãèæ
®ãããŸãïŒã ãããŠã2æåãå€æŽ ïŒè¿œå /å€æŽ/åé€ïŒããŸãã git diff
ã䜿çšããŠãè¡ããšã®å€æŽã確èªã§ããŸãã ãããŠã git diff --word-diff-regex=.
åãã§ãããæåããšã«ã
å¥ã®äŸïŒ
kakbeã¯ãã³ãŒãã®1è¡ã®ã¿ãå€æŽ ïŒè¿œå /å€æŽ/æ¡åŒµïŒã§ããããšã瀺ããŠããŸãã
äžè¬èŠå
å€æŽåŸãããã°ã©ã ã®æå³ãããæ©èœã¯ä¿æãããã¯ãã§ãã ã³ã³ãã€ã«ããããã«ç¹å®ã®é¢æ°ã®æ¬äœãå€æŽããå¿
èŠãããå Žåã unimplemented!()
ãè¿œå ããã ãã§ã¯äžååã ãšããŸãããunimplemented!()
ã çãããå Žåã¯ãã§ããéãã®ããšãè©ŠããŠãã ããã ããŠããŸãã¯ã³ã¡ã³ãã§ãé¡ãããŸãã
ããã«å ããŠã次ã®ããŒãã£ã¡ãœãããå®è¡ããããšã¯å®å
šã«æšå¥šãããŸããã
- ããããã¹ãŠã®
assert!
å€æŽããŠãã ããassert!
s - ãå€æŽããªãããšããŒã¯ãããŠãããã¹ãŠãå€æŽããŸã
- å€æŽå¯èœãªç¯å²ãšå
容ã«é¢ããã³ã¡ã³ãã®å€æŽ
- ãã¡ã€ã«ã®ç§»åãååå€æŽãè¿œå
ãã¹ãŠã®ã¿ã¹ã¯ãå®äºãããšã test.sh
ã¯25 passes, 0 failures
ãåºåããŸã
ãã³ãïŒãã¡ã€ã«åã«ã¯ãœãªã¥ãŒã·ã§ã³ã®ããŒãå«ãŸããŠããå ŽåããããŸãã
ãã³ãïŒ ãã®å±
å¿å°ã®è¯ããã£ããã«ãŒã ã§ã¯ ãRustã«é¢ãã質åã«ãã°ããåçã§ããŸã ã ãã®èšäºã®ã³ã¡ã³ããããéãã
ã©ããã ä¿®çã¯äœã§ãããïŒ ãªãæ©èœããã®ã§ããïŒ [ãã¡ã€ã«å]
ãã®éšåã®åããã°ã©ã ã«ã€ããŠããœãŒã¹ã³ãŒãã®äœãåé¡ã§ãã£ããã説æããå¿
èŠããããŸãã 次ã«èª¬æãã ããŒãã³ã¢ ã©ã®ãããªå€æŽãè¡ããããããããã®ä¿®æ£ããªãæ±ãä»äºãããã®ãã é©åãªèª¬æãæè¿ããŸãã ããªãã¯ãã¹ãŠãããªãã«ãšãŠãæçœã§ãããšæããªããããªãã¯æžãããšãã§ããŸããã æ lazãªã-ããªãã¯ãŸã£ããäœãæžãããšãã§ããŸããã
ãã§ãŒãº2ïŒé
žå

ãã®æ®µéã§ã¯ãã³ãã³ãã©ã€ã³çšã«ããã€ãã®ã©ã€ãã©ãªãš1ã€ã®ãŠãŒãã£ãªãã£ãäœæããŸãã ãµããã£ã¬ã¯ããªstack-vec
ã volatile
ã ttywrite
ããã³xmodem
ã§ttywrite
ãxmodem
ã ãŸããå£ããŠããªãå Žåã«åçã§ãã質åãããã€ããããŸãã åéšåã¯è²šç©ã«ãã£ãŠç®¡çãããŠããŸãã å°ãªããšããããã®ã³ãã³ãã¯äŸ¿å©ãšåŒã¶ããšãã§ããŸãïŒ
cargo build
-ããã°ã©ã ãŸãã¯ã©ã€ãã©ãªããã«ãããŸãcargo test
- cargo test
å®è¡cargo run
-ã¢ããªã±ãŒã·ã§ã³ã®èµ·åcargo run -- $
-ãã®æ¹æ³ã§ãã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã«ãã©ã°ãæž¡ãããšãã§ããŸã
Cargoã«ã€ããŠã¯ãå¥ã®å°ååCargo BookããããŸãã ããããããã¹ãŠã詳现ã«æ©èœããæ¹æ³ã«ã€ããŠå¿
èŠãªæ
å ±ãåŠã¶ããšãã§ããŸãã
ãµããã§ãŒãºAïŒStackVec
ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãæ±ãæãéèŠãªæ©èœã®1ã€ã¯ãã¡ã¢ãªã®å²ãåœãŠã§ãã CãRustãJavaãPythonããŸãã¯ã»ãŒãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ãäžè¬çã«malloc()
åŒã³åºãå Žåãååãªã¡ã¢ãªããªãå Žåãã·ã¹ãã ã³ãŒã«ãæçµçã«äœ¿çšããããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«è¿œå ã®ã¡ã¢ãªãèŠæ±ãããŸãã ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¯ããŸã ã¡ã¢ãªã誰ãå æããŠããªããã©ãããå€æããŸãã ãã®å Žåããã®ã¡ã¢ãªããOSãããã»ããµã«å°ãæ¯ããããŸãã
ã¡ã¢ãªå²ãåœãŠ- éé°è
ãã¹ãŠã®linupsãªã©ã®ææ°ã®OSã«ã¯ãã¡ã¢ãªç®¡çã«é¢é£ããå€ãã®ããªãã¯ãå«ãŸããŠããŸãã ããšãã°ãæé©åæŸèæã®é åºã§ãäžå®éã®ã¡ã¢ãªãèŠæ±ããããšãä»®æ³çã«å²ãåœãŠãããŸãã ãã®å Žåãã¢ããªã±ãŒã·ã§ã³ããã®ã¡ã¢ãªã䜿çšããããšãããŸã§ãç©çã¡ã¢ãªã¯å²ãåœãŠãããŸããã äžæ¹ãåçŽåãããé
åžã®é¯èŠã¯ãã¢ããªã±ãŒã·ã§ã³ã«å¯ŸããŠäœæãããŸãã ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¯èŠäºã«åãã€ãããšãã§ããŸãïŒ
ïŒ
å
éšã®Vec
ã String
ããã³Box
ãªã©ã®æ§é äœã¯ã malloc()
ã䜿çšããŠç¬èªã®ããŒãºã«åãããŠã¡ã¢ãªãå²ãåœãŠãŸãã ã€ãŸãããããã®æ§é ã«ã¯ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ãµããŒããå¿
èŠã§ãã ç¹ã«ãOSãã¡ã¢ãªãå²ãåœãŠãæ¹æ³ãç¥ã£ãŠããå¿
èŠããããŸãã ãã®ããŒãã¯ãŸã å§ãŸã£ãŠããŸããïŒæ¬¡ã®ã·ãªãŒãºãåç
§ïŒã®ã§ãã¡ã¢ãªç®¡çã¯äžåãããŸããã ãããã£ãŠããããã®ãã¹ãŠã®Vec
ïŒãŸã ïŒäœ¿çšããããšã¯ã§ããŸããã
ããã¯Vec
éäžçãªæ··ä¹±ã§ãããããããç¹ã§é©åãªæœè±¡åã§ãïŒ ããã«ãããããããçš®é¡ã®åŸ®åŠãªç¹ãèŠããå¿
èŠãªãã .push()
ããã³.pop()
芳ç¹ããèããããšãã§ããŸãã å®å
šãªã¡ã¢ãªã¢ãã±ãŒã¿ãªãã§Vec
䌌ããã®ãååŸã§ããŸããïŒ

ãã¡ããã æåã«æãæµ®ãã¶ã®ã¯ãã¡ã¢ãªã®äºåå²ãåœãŠãšããã®äžã«å¿
èŠãªæœè±¡åãå®è£
ããç¹å®ã®æ§é ãžã®ãã®åŸã®è»¢éã§ãã ãã€ããªãã¡ã€ã«ã«çŽæ¥ããŸãã¯ã¹ã¿ãã¯ã®ã©ããã«ã¡ã¢ãªãéçã«å²ãåœãŠãããšãã§ããŸãã ã©ã¡ãã®å Žåãããã®ãããªã¡ã¢ãªã¯ãäºåã«æ±ºããããåºå®ãµã€ãºã§ãªããã°ãªããŸããã
ãã®ãµããã§ãŒãºã§ã¯ã StackVec
ãå®è£
ãStackVec
ãããã¯ã Vec
ãæšæºã©ã€ãã©ãªããæäŸããAPIãšåæ§ã®APIãæäŸããŸãã ãã ããäºåã«å²ãåœãŠãããã¡ã¢ãªã䜿çšããŸãã ãã®åãStackVec
ãã³ãã³ãã©ã€ã³ãå®è£
ãããšãã«åœ¹ç«ã¡ãŸãïŒãã§ãŒãº3ïŒã stack-vec
ãµããã£ã¬ã¯ããªã§äœæ¥ãstack-vec
ã ãã®äžã«ã¯ããã§ã«æ¬¡ã®ãã®ããããŸãã
Cargo.toml
-Cargoã®æ§æãã¡ã€ã«src/lib.rs
å¿
èŠãªã³ãŒããè¿œå ããŸãsrc/tests.rs
cargo test
éå§æã«å®è¡ãããcargo test
questions/
- questions/
ãã¡ã€ã«ã®ç©ºçœïŒããŸãèå³ããªãïŒ
StackVec
ã€ã³ã¿ãŒãã§ãŒã¹
StackVec<T>
ã¯ã StackVec::new()
åŒã³åºãããšã«ãã£ãŠäœæãããŸãã f-ii new
åŒæ°ãšããŠãã¿ã€ãT
ã¹ã©ã€ã¹T
ãŸãã StackVec<T>
ã¯ã Vec
é¡äŒŒã®ã¡ãœãããšã»ãŒåãæ¹æ³ã§äœ¿çšãããå€ãã®ã¡ãœãããå®è£
ããŸãã ããšãã°ã StackVec<u8>
ãŸãã
let mut storage = [0u8; 1024]; let mut vec = StackVec::new(&mut storage); for i in 0..10 { vec.push(i * i).expect("can push 1024 times"); } for (i, v) in vec.iter().enumerate() { assert_eq!(*v, (i * i) as u8); } let last_element = vec.pop().expect("has elements"); assert_eq!(last_element, 9 * 9);
StackVec
åStackVec
æ¢ã«æ¬¡ã®ããã«å®£èšããStackVec
ããŸãã
pub struct StackVec<'a, T: 'a> { storage: &'a mut [T], len: usize, }
StackVec
ç解StackVec
StackVec
ããã€ã¹ã«é¢ãã質åãããã€ããããŸãã
push
ãResult
è¿ãã®ã¯ãªãã§ããïŒ [ããã·ã¥å€±æ]
æšæºã©ã€ãã©ãªã«ããVec
ã®push
ã¡ãœããã«ã¯ãæ»ãå€ããããŸããã ãã ãã StackVec
ããã®push
ã¯StackVec
ãããªãã®ããããŸããäœããã®ãšã©ãŒãããå¯èœæ§ãããããšã瀺ãçµæãè¿ããŸãã Vec
ãšéã£ãŠStackVec::push()
倱æããã®ã¯ãªãã§ããïŒ
T
ç涯ã«å¶éããå¿
èŠãããã®ã¯ãªãã§ããïŒ [寿åœ]
ã³ã³ãã€ã©ã¯ããã®StackVec
ãæåŠãStackVec
ã
struct StackVec<'a, T> { buffer: &'a mut [T], len: usize }
åT
ã«å¶çŽãè¿œå ãããšããã¹ãŠãæ©èœããŸãã
struct StackVec<'a, T: 'a> { buffer: &'a mut [T], len: usize }
ãªããã®å¶éãå¿
èŠãªã®ã§ããïŒ Rustããã®å¶éã«åŸããªããšã©ããªããŸããïŒ
StackVec
pop
ã¡ãœããã«T: Clone
å¿
èŠãªã®StackVec
ãªãã§ããïŒ [clone-for-pop]
Vec<T>
æšæºã©ã€ãã©ãªã®pop
ã¡ãœããã¯T
å®è£
ãããŸããã StackVec
pop
ã¡ãœããã¯T
ãClone
ããããã£ãå®è£
ããå Žåã«ã®ã¿å®è£
ãããŸãã ãªããããªã®ã§ããããïŒ ãã®å¶éãå
æãããšã©ããªããŸããïŒ
StackVec
å®è£
stack-vec/src/lib.rs
ãã¹ãŠã®unimplemented!()
ã¡ãœãããStackVec
ãstack-vec/src/lib.rs
ã åã¡ãœããã«ã¯ãã§ã«ããã¥ã¡ã³ãããããŸãïŒããšãã°ãããããäœãå¿
èŠãã¯æ確ã§ãïŒã ããã«å ããŠã src/tests.rs
ãã¡ã€ã«ã«ã¯ãå®è£
ãæ£ããããšã確èªããã®ã«åœ¹ç«ã€ãã¹ãããããŸãã cargo test
ã³ãã³ãã䜿çšããŠãã¹ããå®è¡ã§ããŸãã ããã«ã StackVec
ã¯ã©ã¹ã®IntoIterator
ã DerefMut
ããã³IntoIterator
ãå®è£
ããå¿
èŠããããŸãã ãããŠ&StackVec
IntoIterator IntoIterator
ã ãããã®ç¹æ§ãå®è£
ããªããšããã¹ãã¯å€±æããŸãã å®è£
ãæ£ããããšã確èªãã質åã«çããããããã«ãªã£ããããã«ã次ã®ãµããã§ãŒãºã«é²ã¿ãŸãã
ã©ã®ãã¹ãã«Deref
å®è£
ãå¿
èŠã§ããïŒ [deref-in-tests]
str/tests.rs
ãããã¹ãŠã®ãã¹ãã³ãŒããèªã¿åãstr/tests.rs
ã Deref
å®è£
ããªãå Žåãã©ã®ãã¹ããã³ã³ãã€ã«ããããªãã®ã§ããïŒ DerefMut
ã©ãã§ããïŒ ãªãã§ïŒ
å®éããã¹ãã¯å®äºããŠããŸãã
æäŸãããåäœãã¹ãã¯åºæ¬çãªæ©èœãã«ããŒããŠããŸããããããã¿ããã¹ãŠãã¹ãããããã§ã¯ãããŸããã ãã®ãããªã¹ããŒã¹ãæ¢ããå倧ãªæ£çŸ©ã®åã®äžã«ããã¹ãã®ç¥ã«ããã«ãã¹ããè¿œå ããŠãã ããã
ãã³ãïŒãŒããã§ãŒãºliftime
ãžã§ãããã®ãœãªã¥ãŒã·ã§ã³ã圹ç«ã€å ŽåããããŸãã
ãµããã§ãŒãºBïŒ volatile

ãã®ããŒãã§ã¯ãæ®çºæ§ã¡ã¢ãªã¢ã¯ã»ã¹ã«ã€ããŠèª¬æãã volatile/
ãµããã£ã¬ã¯ããªã®ã³ãŒããèªã¿åããŸãã ç¬èªã®ã³ãŒããæžãããšã¯ããŸããããã»ã«ããã¹ãã«ã¯çåããããŸãã
å
žåçãªãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãšåæ§ã«ãã³ã³ãã€ã©ã¯éåžžã«å·§åŠãªããªãã¯ãå·§ã¿ã«å®è¡ããŸãã æé©åã®åã«ãããŠã圌ãã¯ããªããæå³ãããã®ã®ããã«èŠããäœããããŠããŸãã å®éãå
éšã«ã¯éåžžã«åŒ·åãªéè¡ããããŸãã ãã®ãããªéè¡ã®è¯ãäŸã¯ããããã³ãŒãã®åé€ã§ãã ã³ã³ãã€ã©ãã³ãŒããå®è¡ã«åœ±é¿ãäžããªãããšã蚌æã§ããå Žåããããã³ãŒãã¯è¿
éãã€æå®çã«åãåãããŸãã ãã®ãããªã³ãŒãããããšããŸãããïŒ
fn f() { let mut x = 0; let y = &mut x; *y = 10; }
ã³ã³ãã€ã©ãŒã¯ãèšé²åŸã«*y
èªã¿åãããªããšããå°ãåççãªçç±ãèãããããããŸããã ãã®ãããã³ã³ãã€ã©ã¯çµæã®ãã€ããªãã¡ã€ã«ãããã®éšåãåçŽã«é€å€ã§ããŸãã ãã®ããã«è°è«ãç¶ãããšãã³ã³ãã€ã©ã¯y
èªäœã®å®£èšãåæããŠããx
ãåæããããšãé©åã§ãããšå€æããŸãã æåŸã«ã f()
ãžã®åŒã³åºãã¯ãã€ãã®äžã«è¡ããŸãã
ãã®çš®ã®æé©åã¯éåžžã«äŸ¿å©ã§äŸ¡å€ããããŸãã ãããã®ãããã§ãããã°ã©ã ã¯çµæã«åœ±é¿ãäžããããšãªãå éãããŸãã 確ãã«ãå Žåã«ãã£ãŠã¯ããã®ãããªè©æ¬ºã¯äºæãã¬çµæãããããå¯èœæ§ããããŸãã ããšãã°ã y
ã¯æžã蟌ã¿ã®ã¿å¯èœãªã¬ãžã¹ã¿ãæããŸãã ãã®å Žåã *y
ãžã®æžã蟌ã¿ã¯ã *y
ãèªã¿åããªããŠããããªã芳å¯å¯èœãªå¹æããããŸãã ã³ã³ãã€ã©ããããç¥ããªãå Žåãæé©å段éã§ãã®éšåãååŸããã ãã§ãããã°ã©ã ã¯æåŸ
ã©ããã«åäœããŸããã
ãã®ãããªãã®ã®èªã¿åã/æžã蟌ã¿ããå±
å¿å°ã®è¯ãäžçèªäœã«åœ±é¿ãäžããããšãã³ã³ãã€ã©ãŒã«ã©ã®ããã«çŽåŸãããããšãã§ããŸããïŒ ããã¯ãŸãã«ãæ®çºæ§ã¡ã¢ãªã¢ã¯ã»ã¹ã®æå³ã§ãã ã³ã³ãã€ã©ã¯ããã®ãããªãµã€ããžã®ã¢ã¯ã»ã¹ãæé©åããªãããšãèªããŸãã
ãã³ãvolatile
Rustã§ã¯ã write_volatile
ãšwrite_volatile
ã䜿çšããŠãçã®ãã€ã³ã¿ãŒãèªã¿æžãã§ããŸãã
ãããã¯ã©ã®ãããªçã®ãã€ã³ã¿ã§ããïŒ
ãããŸã§ããªã³ã¯ãå¯æ¥ã«ç¥ãããšãã§ããŸããïŒããã¯&T
ããã³&mut T
ïŒã Rustã®rawãã€ã³ã¿ãŒïŒ *const T
ããã³*mut T
ïŒã¯ããããŒãã§ãã«ãŒã®æå¹æéã远跡ããªãåºæ¬çã«åããªã³ã¯ã§ãã ãããã®çã®ãã€ã³ã¿ãŒã䜿çšããèªã¿åã/æžã蟌ã¿ã¯ãCããã³C ++ã®æ奜家ã§ããèŠãããåã足ã®è² å·ã«ã€ãªããå¯èœæ§ããããŸãã Rustã§ã¯ããã®ãããªæäœã¯å®å
šã§ã¯ãªããšèããŠããŸãã ãããã£ãŠããã®ãã¹ãŠãunsafe
ã¿ã°ã§ããŒã¯ããããšãå¿
é ã§ãã ããã¥ã¡ã³ãã§çã®ãã€ã³ã¿ã®è©³çŽ°ãèªãã§ãã ããã
write_volatile
ãšwrite_volatile
æ¯åæžãããšã¯ååã«æ²ããã§ãïŒãã€ç
ã«ãã£ãŠåŒãèµ·ããããè¿·æãªãšã©ãŒã«ã€ãªããå¯èœæ§ããããšããäºå®ã«å ããŠïŒã 幞ããªããšã«ãRustã¯ç§ãã¡ã®ç掻ãããç°¡åã§å®å
šã«ããæ©äŒãæäŸããŠãããŸãã äžæ¹ã§ã¯ãåçŽã«volatile
ã©ãããŒãäœæãïŒçŽ æµãªCã®volatile
ããŒã¯ãŒãã«ã»ãšãã©äŒŒãŠããŸãïŒããã¹ãŠã®èªã¿åã/æžã蟌ã¿ãã³ãŒãå
ã«æ®ãããã«ããŸãã ããŒãã¹ãšããŠãèªã¿åãå°çšãŸãã¯æžã蟌ã¿å°çšã®ã©ãããŒãå®çŸ©ã§ããŸãïŒã©ãããŒã¯ãããŸãããå¿
èŠã«å¿ããŠãã©ã³ã¯ãšã¹ãã³ãæäŸããŸãïŒã
Volatile
ã ReadVolatile
ã WriteVolatile
ããã³UniqueVolatile
volatile/
ãã£ã¬ã¯ããªå
ã®volatile
ïŒèª°ãèããã§ããããïŒïŒããã4ã€ã®ã¿ã€ããå®è£
ããŸãããããã¯ããã®ååããæãããªããšãè¡ããŸãã 詳现ã¯ããã¥ã¡ã³ããã芧ãã ããã ãã®ããã¥ã¡ã³ãã䟿å©ãªåœ¢åŒã§å®éã«èªãã«ã¯ã volatile/
ãã£ã¬ã¯ããªã§çŽæ¥cargo doc --open
åŒã³åºããŠãã ããã
UniqueVolatile
ãããã®ã¯ãªãã§ããïŒ [ãŠããŒã¯æ®çºæ§]
Volatile
ãšUniqueVolatile
䜿çšãããšãæ®çºæ§ã¡ã¢ãªã¢ã¯ã»ã¹ãUniqueVolatile
ã§ããŸãã ããã¥ã¡ã³ãã«åºã¥ããŠã2ã€ã®ã¿ã€ãã®éãã¯äœã§ããïŒ
src/lib.rs
ã èªåã®ã¹ãã«ã®ç²Ÿç¥ã§ã³ãŒããèªãã§ãã ããã ãã®åŸïŒã³ãŒããèªãã§ïŒã次ã®2ã€ã®è³ªåã«çããŸãã çµäºæ¹æ³-次ã®ãµããã§ãŒãºã«é²ãããšãã§ããŸãã
èªã¿æžãã®å¶éã¯ã©ã®ããã«æŽçãããŠããŸããïŒ [匷å¶]
WriteVolatile
ãšWriteVolatile
ã¯ããããããã€ã³ã¿ãŒã®èªã¿åããšæžã蟌ã¿ãäžå¯èœã«ããŸãã ããã¯ã©ã®ããã«è¡ãããŸããïŒ
éåžžã®æ¹æ³ã®ä»£ããã«ç¹æ§ã䜿çšããå©ç¹ã¯äœã§ããïŒ [ç¹æ§]
泚ææ·±ã調ã¹ããšãåã¿ã€ããç¬èªã®new
ã¡ãœããã1ã€ã ãå®è£
ããŠããããšã眮ãæããããšãã§ããŸãã ä»ã®ãã¹ãŠã®ã¡ãœããã¯ã Writeable
æ¹æ³ã§Readable
ã Writeable
ããã³ReadableWriteable
å®è£
ã«é¢é£ããŠããŸãã ãã®ãã¹ãŠã®å©çã¯äœã§ããïŒ ãã®ã¢ãããŒãã®å°ãªããšã2ã€ã®å©ç¹ã説æããŠãã ããã
read
ãšwrite
å®å
šã§new
å®å
šã§ãªãã®ã¯ãªãã§ããïŒ [å®å
š]
read
ãšwrite
ãå®å
šã§ãããšèŠãªãããããã«ã new
ã«é¢ããŠäœãçå®ã§ããå¿
èŠããããŸããïŒ å¯Ÿç
§çã«ã read
ãšwrite
å®å
šwrite
ã¯ãããŸããwrite
代ããã«new
ãå®å
šãšããŒã¯ããã®ã¯å®å
šã§ããããïŒ
ãã³ãïŒããããã¹ãŠã®ã¡ãœããã®ããã¥ã¡ã³ããèªãã§ãã ããã
ãªãnew
ã®äœ¿çšã匷å¶ããã®ã§ããïŒ [pub-constructor]
ã¿ã€ãVolatile
ã次ã®ããã«å®£èšãããå ŽåïŒ
struct Volatile<T>(pub *mut T);
次ã«ã new
ãåŒã³åºã代ããã«Volatile(ptr)
ã䜿çšããŠVolatile(ptr)
åã®å€ãäœæã§ããŸãã éçåŒã³åºãnew
ã©ãããŒãäœæãã䜿çšæ³ã¯äœã§ããïŒ
ãã³ãïŒäž¡æ¹ã®ãªãã·ã§ã³ã®å®å
šæ§ã¹ããŒãã¡ã³ãã®æå³ãèæ
®ããŠãã ããã
ãã¯ãã¯äœãããŸããïŒ [ãã¯ã]
readable!
ãã¯ãã¯äœãããŸããreadable!
writeable!
ãããŠreadable_writeable!
ïŒ
ãµããã§ãŒãºCïŒ xmodem
ãã®ãµããã§ãŒãºã§ã¯ãXMODEMãã¡ã€ã«è»¢éãããã³ã«ïŒ xmodem/
ãµããã£ã¬ã¯ããªïŒãå®è£
ããŸãã äž»ãªäœæ¥ã¯xmodem/src/lib.rs
ã
XMODEMã¯ã1977幎ã«éçºãããåçŽãªãã¡ã€ã«è»¢éãããã³ã«ã§ãã ãã±ãããã§ãã¯ãµã ãéä¿¡ãã£ã³ã»ã«ãããã³ãšã©ãŒãçºçããå Žåã«éä¿¡ãèªåçã«åè©Šè¡ããæ©èœããããŸãã UARTãªã©ã®ã·ãªã¢ã«ã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠæ
å ±ãéä¿¡ããããã«åºã䜿çšãããŠããŸãã ãããã³ã«ã®äž»èŠãªæ©èœã¯ã·ã³ãã«ã§ãã wikiã§è©³çŽ°ãèªãã§ãã ããïŒ XMODEM ïŒèª°ã§ãèšäºããã·ã¢èªã«ç¿»èš³ã§ããŸãïŒã
ãããã³ã«
ãããã³ã«èªäœã«ã€ããŠã¯ãããã¹ããã¡ã€ã«ãX-Modem File Transfer Protocolã®ç解ãã§è©³çŽ°ã«èª¬æãããŠããŸãã ããã§ããã€ãã®èª¬æãç¹°ãè¿ããŸãã
ãŠã£ãããã£ã¢ããã®èª¬æã«åºã¥ããŠå®è£
ãè¡ããªãã§ãã ããïŒ
æè²åŠããã®èª¬æã¯é«ã¬ãã«ã§æçšã§ãããå€ãã®è©³çŽ°ã¯ããã§å®è£
ãããã®ãšã¯ç°ãªããŸãã æè²åŠã¯ãããã³ã«ã®æŠèŠãšããŠã®ã¿äœ¿çšããŠãã ããã
XMODEMã¯éåžžã«ãã€ããªãããã³ã«ã§ããçã®ãã€ããéåä¿¡ãããŸãã ããã«ããããã³ã«ã¯åäºéã§ããéä¿¡è
ãŸãã¯åä¿¡è
ã¯ãã€ã§ãããŒã¿ãéä¿¡ããŸãããäž¡æ¹ãåæã«éä¿¡ããããšã¯ãããŸããã æåŸã«ãããã¯ãã±ãããããã³ã«ã§ããããŒã¿ã¯128ãã€ãã®ãããã¯ïŒãã±ããïŒã«åå²ãããŸãã ãããã³ã«ã¯ãã©ã®ãã€ããéä¿¡ãããããã€éä¿¡ããããäœã瀺ããããããŠåŸã§ããããèªã¿åãæ¹æ³ã決å®ããŸãã
ãŸããããã€ãã®å®æ°ãå®çŸ©ããŸãããã
const SOH: u8 = 0x01; const EOT: u8 = 0x04; const ACK: u8 = 0x06; const NAK: u8 = 0x15; const CAN: u8 = 0x18;
, NAK
, NAK
. , NAK
, . NAK
, .
, , . 1. (.. 255), 0.

, :
SOH
- (
255 - $_
)
- :
, :
SOH
EOT
- (128 )
, , , CAN
. CAN
â .
, :
EOT
NAK
( â )EOT
ACK
( â )
, ( EOT
):
NAK
EOT
( , )ACK
XMODEM
XMODEM . , . expect_byte
, expect_byte_or_cancel
, read_packet
write_packet
src/lib.rs
. Xmodem
: packet
started
. , .
expect_byte
expect_byte_or_cancel
. ( read_byte
write_byte
) read_packet
write_packet
. , , transmit
receive
. / . , . cargo test
. , â .
std.
std::io
. std
.
:
{read, write}_packet
33 .
io::Read io::Write (, , ).
?
ã
, .
D: ttywrite
ttywrite
. XMODEM. xmodem
. ttywrite/src/main.rs
. test.sh
. - socat
.
?
, . . , . UART, .
TTY?
TTY â (TeltTYpe writer). , . ( ) . /dev/
, tty.
ttywrite
- . structopt , clap . , , Cargo.toml
. structopt . , , structopt .
, , --help
. , cargo run
--
. : cargo run -- --help
. . main.rs
. Opt
. .
, ? [invalid]
. -f
idk
. structopt
, ?
, . . , .
main
serial::open . open
serial , . open
TTYPort , / / ( io::Read
io::Write
). ( SerialDevice
).
ttywrite
. , , opt
main
. , stdin
. . . -r
, . , xmodem
. ( ).
XMODEM Xmodem::transfer
Xmodem::transmit_with_progress
. transmit_with_progress
. :
fn progress_fn(progress: Progress) { println!("Progress: {:?}", progress); } Xmodem::transmit_with_progress(data, to, progress_fn)
test.sh
ttywrite
. :
Opening PTYs... Running test 1/10. wrote 333 bytes to input ... Running test 10/10. wrote 232 bytes to input SUCCESS
stdin
io::stdin() .
io::copy() .
main()
35 .
TTYPort .
test.sh
-r
? [bad-test]
-r
. XMODEM. , ? XMODEM ? ?
UPD . . .