ãã®ããŒãã§ã¯ã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 testquestions/ - 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 â .
, :
EOTNAK ( â )EOTACK ( â )
, ( EOT ):
NAKEOT ( , )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 . . .