Author here. I would definitely second these two links. They were very helpful in getting started, and later when I wanted to declare an interrupt handler.
Not to put too fine a point on it, but this is expression, not abstraction. Abstraction implies making distinct things common, like an I/O module that works for different microcontrollers. The bits described here are an 1:1 binding into Rust.
[1]: https://book.avr-rust.com/
[2]: https://rust-embedded.github.io/book/