From 43e0f2927fa78135da8d3a9612a1563c152aa131 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20B=C3=B6ving?=
Date: Sun, 18 Jul 2021 13:18:32 +0200
Subject: [PATCH 1/7] ch05 ch06 rewrite for micro:bit v2
- Ported all the code to the microbit BSP
- Tested all the code commands etc. on v1.5 and v2
- ch06 doesn't need to be touched I think
- currently relying on the git version of microbit since it
introduces quite a few nice new APIs we want to use,
microbit is (hopefully) going to make a release before
this rewrite actually gets published
- the solution to the ch05 challenge is arguably the most stupid
way you could come up with to generate the matrix, at the
same time this makes it simple enough to be understood by everyone
though, which is certainly more important in this case
---
src/05-led-roulette/.cargo/config | 3 -
src/05-led-roulette/Cargo.toml | 16 +-
src/05-led-roulette/Embed.toml | 5 +-
src/05-led-roulette/README.md | 5 +-
src/05-led-roulette/build-it.md | 75 +++++++---
src/05-led-roulette/debug-it.md | 92 ++++++------
src/05-led-roulette/flash-it.md | 28 ++--
src/05-led-roulette/it-blinks.md | 54 +++----
src/05-led-roulette/light-it-up.md | 81 ++++------
src/05-led-roulette/my-solution.md | 212 ++++++++++++++++-----------
src/05-led-roulette/src/main.rs | 2 +-
src/05-led-roulette/the-challenge.md | 52 +++++--
src/assets/gdb-layout-asm.png | Bin 216403 -> 280312 bytes
src/assets/gdb-layout-src.png | Bin 34560 -> 24977 bytes
14 files changed, 370 insertions(+), 255 deletions(-)
diff --git a/src/05-led-roulette/.cargo/config b/src/05-led-roulette/.cargo/config
index a0ec1777f..6260c5718 100644
--- a/src/05-led-roulette/.cargo/config
+++ b/src/05-led-roulette/.cargo/config
@@ -2,6 +2,3 @@
rustflags = [
"-C", "link-arg=-Tlink.x",
]
-
-[build]
-target = "thumbv6m-none-eabi"
diff --git a/src/05-led-roulette/Cargo.toml b/src/05-led-roulette/Cargo.toml
index 776e8a465..0dedefeae 100644
--- a/src/05-led-roulette/Cargo.toml
+++ b/src/05-led-roulette/Cargo.toml
@@ -4,10 +4,24 @@ version = "0.1.0"
authors = ["Henrik Böving "]
edition = "2018"
+[dependencies.microbit-v2]
+version = "0.10.1"
+git = "https://github.com/nrf-rs/microbit/"
+optional = true
+
+
+[dependencies.microbit]
+version = "0.10.1"
+git = "https://github.com/nrf-rs/microbit/"
+optional = true
+
[dependencies]
cortex-m = "0.6.0"
cortex-m-rt = "0.6.10"
panic-halt = "0.2.0"
-nrf51-hal = "0.11.0"
rtt-target = { version = "0.2.2", features = ["cortex-m"] }
panic-rtt-target = { version = "0.1.1", features = ["cortex-m"] }
+
+[features]
+v2 = ["microbit-v2"]
+v1 = ["microbit"]
diff --git a/src/05-led-roulette/Embed.toml b/src/05-led-roulette/Embed.toml
index 91584ec92..f89445be1 100644
--- a/src/05-led-roulette/Embed.toml
+++ b/src/05-led-roulette/Embed.toml
@@ -1,5 +1,8 @@
[default.general]
-chip = "nrf51822_xxAA"
+# v2
+# chip = "nrf52833"
+# v1
+# chip = "nrf51822"
[default.reset]
halt_afterwards = true
diff --git a/src/05-led-roulette/README.md b/src/05-led-roulette/README.md
index b3e928d6a..f645accd6 100644
--- a/src/05-led-roulette/README.md
+++ b/src/05-led-roulette/README.md
@@ -10,7 +10,7 @@ I'm going to give you a high level API to implement this app but don't worry we'
stuff later on. The main goal of this chapter is to get familiar with the *flashing* and debugging
process.
-The starter code is in the `src` directory of that repository. Inside that directory there are more
+The starter code is in the `src` directory of the book repository. Inside that directory there are more
directories named after each chapter of this book. Most of those directories are starter Cargo
projects.
@@ -49,7 +49,8 @@ Furthermore there is also an `Embed.toml` file
This file tells `cargo-embed` that:
-* we are working with a nrf51822,
+* we are working with either an nrf52833 or nrf51822, you will again have to remove the comments from the
+ chip you are using, just like you did in chapter 3.
* we want to halt the chip after we flashed it so our program does not instantly jump to the loop
* we want to disable RTT, RTT being a protocol that allows the chip to send text to a debugger.
You have in fact already seen RTT in action, it was the protocol that sent "Hello World" in chapter 3.
diff --git a/src/05-led-roulette/build-it.md b/src/05-led-roulette/build-it.md
index 3766f0a96..bd703955f 100644
--- a/src/05-led-roulette/build-it.md
+++ b/src/05-led-roulette/build-it.md
@@ -5,8 +5,8 @@ architecture than your computer we'll have to cross compile. Cross compiling in
as passing an extra `--target` flag to `rustc`or Cargo. The complicated part is figuring out the
argument of that flag: the *name* of the target.
-The microcontroller in the micro:bit has a Cortex-M0 processor in it. `rustc` knows how to cross compile
-to the Cortex-M architecture and provides several different targets that cover the different processor
+As we already know the microcontroller on the micro:bit v2 has a Cortex-M4F processor in it, the one on v1 a Cortex-M0.
+`rustc` knows how to cross compile to the Cortex-M architecture and provides several different targets that cover the different processor
families within that architecture:
- `thumbv6m-none-eabi`, for the Cortex-M0 and Cortex-M1 processors
@@ -16,11 +16,14 @@ families within that architecture:
- `thumbv8m.main-none-eabi`, for the Cortex-M33 and Cortex-M35P processors
- `thumbv8m.main-none-eabihf`, for the Cortex-M33**F** and Cortex-M35P**F** processors
-For the micro:bit, we'll use the `thumbv6m-none-eabi` target. Before cross compiling you have to
-download pre-compiled version of the standard library (a reduced version of it actually) for your
-target. That's done using `rustup`:
+For the micro:bit v2, we'll use the `thumbv7em-none-eabihf` target, for v1 the `thumbv6m-none-eabi` one.
+Before cross compiling you have to download pre-compiled version of the standard library
+(a reduced version of it actually) for your target. That's done using `rustup`:
``` console
+# For micro:bit v2
+$ rustup target add thumbv7em-none-eabihf
+# For micro:bit v1
$ rustup target add thumbv6m-none-eabi
```
@@ -30,36 +33,64 @@ You only need to do the above step once; `rustup` will re-install a new standard
With the `rust-std` component in place you can now cross compile the program using Cargo:
``` console
-$ # make sure you are in the `src/05-led-roulette` directory
+# make sure you are in the `src/05-led-roulette` directory
-$ cargo build --target thumbv6m-none-eabi
+# For micro:bit v2
+$ cargo build --features v2 --target thumbv7em-none-eabihf
Compiling semver-parser v0.7.0
Compiling typenum v1.12.0
- Compiling proc-macro2 v1.0.19
- Compiling unicode-xid v0.2.1
Compiling cortex-m v0.6.3
(...)
- Compiling as-slice v0.1.3
- Compiling aligned v0.3.4
- Compiling cortex-m-rt-macros v0.1.8
- Compiling nrf-hal-common v0.11.1
- Finished dev [unoptimized + debuginfo] target(s) in 18.69s
+ Compiling microbit-v2 v0.10.1
+ Finished dev [unoptimized + debuginfo] target(s) in 33.67s
+
+# For micro:bit v1
+$ cargo build --features v1 --target thumbv6m-none-eabi
+ Compiling fixed v1.2.0
+ Compiling syn v1.0.39
+ Compiling cortex-m v0.6.3
+ (...)
+ Compiling microbit v0.10.1
+ Finished dev [unoptimized + debuginfo] target(s) in 22.73s
```
> **NOTE** Be sure to compile this crate *without* optimizations. The provided Cargo.toml
> file and build command above will ensure optimizations are off.
-> **NOTE** If you have looked into `.cargo/config` you will have noticed that the target
- is actually always set to "thumbv6m-none-eabi" so the --target flag to `cargo` can in
- fact be omitted here.
-
OK, now we have produced an executable. This executable won't blink any leds,
it's just a simplified version that we will build upon later in the chapter.
As a sanity check, let's verify that the produced executable is actually an ARM binary:
``` console
-$ # equivalent to `readelf -h target/thumbv6m-none-eabi/debug/led-roulette`
- cargo readobj --target thumbv6m-none-eabi --bin led-roulette -- -file-headers
+# For micro:bit v2
+# equivalent to `readelf -h target/thumbv7em-none-eabihf/debug/led-roulette`
+$ cargo readobj --features v2 --target thumbv7em-none-eabihf --bin led-roulette -- -file-headers
+ Finished dev [unoptimized + debuginfo] target(s) in 0.01s
+ELF Header:
+ Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
+ Class: ELF32
+ Data: 2's complement, little endian
+ Version: 1 (current)
+ OS/ABI: UNIX - System V
+ ABI Version: 0
+ Type: EXEC (Executable file)
+ Machine: ARM
+ Version: 0x1
+ Entry point address: 0x117
+ Start of program headers: 52 (bytes into file)
+ Start of section headers: 793112 (bytes into file)
+ Flags: 0x5000400
+ Size of this header: 52 (bytes)
+ Size of program headers: 32 (bytes)
+ Number of program headers: 4
+ Size of section headers: 40 (bytes)
+ Number of section headers: 21
+ Section header string table index: 19
+
+# For micro:bit v1
+# equivalent to `readelf -h target/thumbv6m-none-eabi/debug/led-roulette`
+$ cargo readobj --features v1 --target thumbv6m-none-eabi --bin led-roulette -- -file-headers
+ Finished dev [unoptimized + debuginfo] target(s) in 0.01s
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
@@ -72,11 +103,11 @@ ELF Header:
Version: 0x1
Entry point address: 0xC1
Start of program headers: 52 (bytes into file)
- Start of section headers: 599484 (bytes into file)
+ Start of section headers: 693196 (bytes into file)
Flags: 0x5000200
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
- Number of program headers: 2
+ Number of program headers: 4
Size of section headers: 40 (bytes)
Number of section headers: 22
Section header string table index: 20
diff --git a/src/05-led-roulette/debug-it.md b/src/05-led-roulette/debug-it.md
index 6f6bd4726..76cc6ad47 100644
--- a/src/05-led-roulette/debug-it.md
+++ b/src/05-led-roulette/debug-it.md
@@ -4,8 +4,8 @@ Before we debug our little program let's take a moment to quickly understand wha
happening here. In the previous chapter we already discussed the purpose of the second chip
on the board as well as how it talks to our computer, but how can we actually use it?
-As you can see from the output of `cargo-embed` it opened a "GDB stub", this is a server that our GDB
-can connect to and send commands like "set a breakpoint at address X" to, the server can then decide
+The little option `default.gb.enabled = true` in `Embed.toml` made `cargo-embed` open a so called "GDB stub" after flashing,
+this is a server that our GDB can connect to and send commands like "set a breakpoint at address X" to, the server can then decide
on its own how to handle this command. In the case of the `cargo-embed` GDB stub it will forward the
command to the debugging probe on the board via USB which then does the job of actually talking to the
MCU for us.
@@ -13,18 +13,14 @@ MCU for us.
## Let's debug!
Since `cargo-embed` is blocking our current shell we can simply open a new one and cd back into our project
-directory. Once we are there we can connect to the GDB server like this:
+directory. Once we are there we first have to open the binary in gdb like this:
```shell
+# For micro:bit v2
+$ gdb target/thumbv7em-none-eabihf/debug/led-roulette
+
+# For micro:bit v1
$ gdb target/thumbv6m-none-eabi/debug/led-roulette
-(gdb) target remote :1337
-Remote debugging using :1337
-::fmt (
- self=,
- f=)
- at ~/.cargo/registry/src/github.com-1ecc6299db9ec823/cortex-m-rt-0.6.12/src/lib.rs:489
-489 pub unsafe extern "C" fn Reset() -> ! {
-(gdb)
```
> **NOTE** Depending on which GDB you installed you will have to use a different command to launch it,
@@ -34,22 +30,29 @@ Remote debugging using :1337
> implement the GDB protocol and thus might not recognize all of the commands your GDB is sending to it,
> as long as it does not crash, you are fine.
-Right now we are inside the `Reset()` function. This is (surprisingly) the function that is run after a reset
-of the chip. Since we did tell cargo-embed to halt the chip after we flashed it, this is where we start.
+Next we will have to connect to the GDB stub, it runs on `localhost:1337` per default so in order to
+connect to it run the following:
-This `Reset()` function is part of a small piece of setup code that initializes some things for our Rust program
-before moving on to the `main()` function. Let's set a breakpoint there and jump to it:
+```shell
+(gdb) target remote :1337
+Remote debugging using :1337
+0x00000116 in nrf52833_pac::{{impl}}::fmt (self=0xd472e165, f=0x3c195ff7) at /home/nix/.cargo/registry/src/github.com-1ecc6299db9ec823/nrf52833-pac-0.9.0/src/lib.rs:157
+157 #[derive(Copy, Clone, Debug)]
+```
+
+Next what we want to do is get to the main function of our program,
+we will do this by first setting a breakpoint there and the continuing
+program execution until we hit the breakpoint:
```
(gdb) break main
-Breakpoint 1 at 0xac: file src/05-led-roulette/src/main.rs, line 9.
+Breakpoint 1 at 0x104: file src/05-led-roulette/src/main.rs, line 9.
+Note: automatically using hardware breakpoints for read-only addresses.
(gdb) continue
Continuing.
-Note: automatically using hardware breakpoints for read-only addresses.
-Breakpoint 1, main () at src/05-led-roulette/src/main.rs:9
+Breakpoint 1, led_roulette::__cortex_m_rt_main_trampoline () at src/05-led-roulette/src/main.rs:9
9 #[entry]
-(gdb)
```
Breakpoints can be used to stop the normal flow of a program. The `continue` command will let the
@@ -77,7 +80,7 @@ If we wanted to break in line 13 we can simply do:
```
(gdb) break 13
-Breakpoint 2 at 0xb8: file src/05-led-roulette/src/main.rs, line 13.
+Breakpoint 2 at 0x110: file src/05-led-roulette/src/main.rs, line 13.
(gdb) continue
Continuing.
@@ -98,29 +101,11 @@ is initialized but `_y` is not. Let's inspect those stack/local variables using
$1 = 42
(gdb) print &x
$2 = (*mut i32) 0x20003fe8
-(gdb) print _y
-$3 = 536870912
-(gdb) print &_y
-$4 = (*mut i32) 0x20003fec
(gdb)
```
-As expected, `x` contains the value `42`. `_y`, however, contains the value `536870912` (?). Because
-`_y` has not been initialized yet, it contains some garbage value.
-
-The command `print &x` prints the address of the variable `x`. The interesting bit here is that GDB
-output shows the type of the reference: `i32*`, a pointer to an `i32` value. Another interesting
-thing is that the addresses of `x` and `_y` are very close to each other: their addresses are just
-`4` bytes apart.
-
-Instead of printing the local variables one by one, you can also use the `info locals` command:
-
-```
-(gdb) info locals
-x = 42
-_y = 536870912
-(gdb)
-```
+As expected, `x` contains the value `42`. The command `print &x` prints the address of the variable `x`.
+The interesting bit here is that GDB output shows the type of the reference: `i32*`, a pointer to an `i32` value.
If we want to continue the program execution line by line we can do that using the `next` command
so let's proceed to the `loop {}` statement:
@@ -137,6 +122,15 @@ And `_y` should now be initialized.
$5 = 42
```
+Instead of printing the local variables one by one, you can also use the `info locals` command:
+
+```
+(gdb) info locals
+x = 42
+_y = 42
+(gdb)
+```
+
If we use `next` again on top of the `loop {}` statement, we'll get stuck because the program will
never pass that statement. Instead, we'll switch to the disassemble view with the `layout asm`
command and advance one instruction at a time using `stepi`. You can always switch back into Rust
@@ -155,23 +149,23 @@ program around the line you are currently at.
```
(gdb) disassemble /m
-Dump of assembler code for function led_roulette::__cortex_m_rt_main:
+Dump of assembler code for function _ZN12led_roulette18__cortex_m_rt_main17h3e25e3afbec4e196E:
10 fn main() -> ! {
- 0x000000b2 <+0>: sub sp, #8
- 0x000000b4 <+2>: movs r0, #42 ; 0x2a
+ 0x0000010a <+0>: sub sp, #8
+ 0x0000010c <+2>: movs r0, #42 ; 0x2a
11 let _y;
12 let x = 42;
- 0x000000b6 <+4>: str r0, [sp, #0]
+ 0x0000010e <+4>: str r0, [sp, #0]
13 _y = x;
- 0x000000b8 <+6>: str r0, [sp, #4]
+ 0x00000110 <+6>: str r0, [sp, #4]
14
15 // infinite loop; just so we don't leave this stack frame
16 loop {}
-=> 0x000000ba <+8>: b.n 0xbc
- 0x000000bc <+10>: b.n 0xbc
+=> 0x00000112 <+8>: b.n 0x114 <_ZN12led_roulette18__cortex_m_rt_main17h3e25e3afbec4e196E+10>
+ 0x00000114 <+10>: b.n 0x114 <_ZN12led_roulette18__cortex_m_rt_main17h3e25e3afbec4e196E+10>
End of assembler dump.
```
@@ -195,7 +189,7 @@ One last trick before we move to something more interesting. Enter the following
(gdb) c
Continuing.
-Breakpoint 1, main () at src/05-led-roulette/src/main.rs:9
+Breakpoint 1, led_roulette::__cortex_m_rt_main_trampoline () at src/05-led-roulette/src/main.rs:9
9 #[entry]
(gdb)
```
@@ -224,7 +218,7 @@ A debugging session is active.
Inferior 1 [Remote target] will be detached.
Quit anyway? (y or n) y
-Detaching from program: $PWD/target/thumbv6m-none-eabi/debug/led-roulette, Remote target
+Detaching from program: $PWD/target/thumbv7em-none-eabihf/debug/led-roulette, Remote target
Ending remote debugging.
[Inferior 1 (Remote target) detached]
```
diff --git a/src/05-led-roulette/flash-it.md b/src/05-led-roulette/flash-it.md
index 2ea7da03b..2a38c66c6 100644
--- a/src/05-led-roulette/flash-it.md
+++ b/src/05-led-roulette/flash-it.md
@@ -7,10 +7,11 @@ In this case, our `led-roulette` program will be the *only* program in the micro
By this I mean that there's nothing else running on the microcontroller: no OS, no "daemon",
nothing. `led-roulette` has full control over the device.
-Flashing the binary itself is quite simple thanks to `cargo-embed`, you only have to type `cargo embed`.
+Flashing the binary itself is quite simple thanks to `cargo-embed`.
Before executing that command though, lets look into what it actually does. If you look at the side of your micro:bit
-with the USB connector facing upwards you will notice, that there are actually 2 black squares on there, one is our MCU
+with the USB connector facing upwards you will notice, that there are actually 2 black squares on there
+(on the micro:bit v2 is a third and biggest one, its a speaker), one is our MCU
we already talked about but what purpose does the other one serve? The other chip has 3 main purposes:
1. Provide power from the USB connector to our MCU
@@ -24,15 +25,24 @@ the MCU, inspect its state via a debugger and other things.
So lets flash it!
```console
-$ cargo embed
+# For micro:bit v2
+$ cargo embed --features v2 --target thumbv7em-none-eabihf
(...)
- Erasing sectors ✔ [00:00:00] [##################################################################################################################################################################] 2.00KB/ 2.00KB @ 4.57KB/s (eta 0s )
- Programming pages ✔ [00:00:00] [##################################################################################################################################################################] 2.00KB/ 2.00KB @ 1.93KB/s (eta 0s )
- Finished flashing in 0.764s
-Firing up GDB stub at localhost:1337.
-GDB stub listening on localhost:1337
+ Erasing sectors ✔ [00:00:00] [####################################################################################################################################################] 2.00KiB/ 2.00KiB @ 4.21KiB/s (eta 0s )
+ Programming pages ✔ [00:00:00] [####################################################################################################################################################] 2.00KiB/ 2.00KiB @ 2.71KiB/s (eta 0s )
+ Finished flashing in 0.608s
+
+# For micro:bit v1
+$ cargo embed --features v1 --target thumbv6m-none-eabi
+ (...)
+ Erasing sectors ✔ [00:00:00] [####################################################################################################################################################] 2.00KiB/ 2.00KiB @ 4.14KiB/s (eta 0s )
+ Programming pages ✔ [00:00:00] [####################################################################################################################################################] 2.00KiB/ 2.00KiB @ 2.69KiB/s (eta 0s )
+ Finished flashing in 0.614s
```
You will notice that `cargo-embed` blocks after outputting the last line, this is inteded and you should not close it
-since we need it in this state for the next step, debugging it!
+since we need it in this state for the next step, debugging it! Furthermore you will have noticed that the `cargo build`
+and `cargo embed` are actually passed the same flags, this is because `cargo embed` actually executes the build and then
+flashes the resulting binary on to the chip, hence you can leave out the `cargo build` step in the future if you
+want to flash your code right away.
diff --git a/src/05-led-roulette/it-blinks.md b/src/05-led-roulette/it-blinks.md
index 17b572abd..fcdbdb252 100644
--- a/src/05-led-roulette/it-blinks.md
+++ b/src/05-led-roulette/it-blinks.md
@@ -24,17 +24,19 @@ simple delay-based program that prints something every second might for example
use cortex_m_rt::entry;
use rtt_target::{rtt_init_print, rprintln};
use panic_rtt_target as _;
-use nrf51_hal as hal;
-use hal::prelude::*;
+use microbit::board::Board;
+use microbit::hal::timer::Timer;
+use microbit::hal::prelude::*;
#[entry]
fn main() -> ! {
rtt_init_print!();
- let p = hal::pac::Peripherals::take().unwrap();
+ let mut board = Board::take().unwrap();
+
+ let mut timer = Timer::new(board.TIMER0);
- let mut delay = hal::Timer::new(p.TIMER0);
loop {
- delay.delay_ms(1000u32);
+ timer.delay_ms(1000u32);
rprintln!("1000 ms passed");
}
}
@@ -43,7 +45,10 @@ fn main() -> ! {
In order to actually see the prints we have to change `Embed.toml` like this:
```
[default.general]
-chip = "nrf51822_xxAA"
+# v2
+# chip = "nrf52833"
+# v1
+# chip = "nrf51822"
[default.reset]
halt_afterwards = false
@@ -55,14 +60,14 @@ enabled = true
enabled = false
```
-And now after putting the code into `src/main.rs` and another quick `cargo embed` you should see
-"`1000 ms passed`" being sent to your console every second from your MCU.
+And now after putting the code into `src/main.rs` and another quick `cargo embed` (again with the same flags you used before)
+you should see "`1000 ms passed`" being sent to your console every second from your MCU.
## Blinking
Now we've arrived at the point where we can combine our new knowledge about GPIO and delay abstractions
in order to actually make an LED on the back of the micro:bit blink. The resulting program is really just
-a mash-up of the one above and the one that turned an LED on in the last chapter and looks like this:
+a mash-up of the one above and the one that turned an LED on in the last section and looks like this:
```rs
#![deny(unsafe_code)]
@@ -72,31 +77,30 @@ a mash-up of the one above and the one that turned an LED on in the last chapter
use cortex_m_rt::entry;
use rtt_target::{rtt_init_print, rprintln};
use panic_rtt_target as _;
-use nrf51_hal as hal;
-use hal::prelude::*;
+use microbit::board::Board;
+use microbit::hal::timer::Timer;
+use microbit::hal::prelude::*;
#[entry]
fn main() -> ! {
rtt_init_print!();
- let p = hal::pac::Peripherals::take().unwrap();
+ let mut board = Board::take().unwrap();
- let mut delay = hal::Timer::new(p.TIMER0);
+ let mut timer = Timer::new(board.TIMER0);
- let p0 = hal::gpio::p0::Parts::new(p.GPIO);
- let mut row1 = p0.p0_13.into_push_pull_output(hal::gpio::Level::Low);
- let _col1 = p0.p0_04.into_push_pull_output(hal::gpio::Level::Low);
+ board.display_pins.col1.set_low().unwrap();
+ let mut row1 = board.display_pins.row1;
loop {
- row1.set_high().unwrap();
- rprintln!("Light!");
- delay.delay_ms(500u32);
-
- row1.set_low().unwrap();
- rprintln!("Dark!");
- delay.delay_ms(500u32);
+ row1.set_low().unwrap();
+ rprintln!("Dark!");
+ timer.delay_ms(1_000_u16);
+ row1.set_high().unwrap();
+ rprintln!("Light!");
+ timer.delay_ms(1_000_u16);
}
}
```
-And after putting the code into `src/main.rs` and a final `cargo embed` you should see the LED we light up before
-blinking as well as a print, every time the LED changes from off to on and vice versa.
+And after putting the code into `src/main.rs` and a final `cargo embed` (with the proper flags)
+you should see the LED we light up before blinking as well as a print, every time the LED changes from off to on and vice versa.
diff --git a/src/05-led-roulette/light-it-up.md b/src/05-led-roulette/light-it-up.md
index c17f4181f..00aed0adc 100644
--- a/src/05-led-roulette/light-it-up.md
+++ b/src/05-led-roulette/light-it-up.md
@@ -2,42 +2,29 @@
## embedded-hal
In this chapter we are going to make one of the many LEDs on the back of the micro:bit light up since this is
-basically the "Hello World" of embedded programming. In order to get this task done we will use a set of
-abstractions provided by the crate `embedded-hal`. `embedded-hal` is a crate which provides a set of traits
-that describe behaviour of hardware, for example the [OutputPin trait] which allows us to turn a pin on or off.
-
-In order to use these traits we have to implement them for the chip we are using. Luckily this has already been done
-in our case in the [nrf51-hal]. Crates like this are commonly referred to as HALs (Hardware Abstraction Layer)
-and allow us to use the same API to blink an LED and of course many more complex things accross all chips that implement
-the `embedded-hal` traits.
-
-For example, a person working on an embedded project might need to read temperature data from a sensor. In
-order to achieve this they can write a driver library that doesn't do anything MCU specific but instead just relies on
-`embedded-hal`. This will allow anyone with an MCU that implements the `embedded-hal` traits to easily plug and play
-their driver crate, despite having an MCU made by a completely different manufacturer or even with a different architecture, etc.
+basically the "Hello World" of embedded programming. In order to get this task done we will use one of the traits
+provided by `embedded-hal`, specifically the [OutputPin trait] which allows us to turn a pin on or off.
[OutputPin trait]: https://docs.rs/embedded-hal/0.2.4/embedded_hal/digital/v2/trait.OutputPin.html
-[nrf51-hal]: https://crates.io/crates/nrf51-hal
## The micro:bit LEDs
On the back of the micro:bit you can see a 5x5 square of LEDs, usually called an LED matrix. This matrix alignment is
used so that instead of having to use 25 seperate pins to drive every single one of the LEDs, we can just use 10 (5+5) pins in
-order to control which column and which row of our matrix lights up. However, the micro:bit team implemented this a
-little differently. Their [schematic page] says that it is actually implemented as a 3x9 matrix but a few columns simply
-remain unused.
+order to control which column and which row of our matrix lights up.
-In order to determine which pins we need to control to light up an LED we can check out
-micro:bit's open source [schematic], linked on the same page. The very first sheet contains the LED matrix circuit which
-is apparently connected to the pins named ROW1-3 and COL1-9. Further down on sheet 5 you can see that these pins
-directly map to our MCU. For example, ROW1 is connected to P0.13.
+> **NOTE** that the micro:bit v1 team implemented this a little differently. Their [schematic page] says
+> that it is actually implemented as a 3x9 matrix but a few columns simply remain unused.
-> **NOTE**: The naming scheme of the NRF51 for its pins (P0.13) simply refers to port 0 (P0) pin 13. This is done
-> because on MCUs with dozens or hundreds of pins you usually end up with multiple pins grouped up as ports for the sake of
-> clarity. The NRF51, however, is so small that it only has one GPIO port (P0).
+Usually in order to determine which specific pins we have to control in
+order to light a specific LED up we would now have to read the
+[micro:bit v2 schematic] or the [micro:bit v1 schematic] respectively.
+Luckily for us though we can use the aforementioned micro:bit BSP
+which abstracts all of this nicely away from us.
[schematic page]: https://tech.microbit.org/hardware/schematic/
-[schematic]: https://github.com/bbcmicrobit/hardware/blob/master/V1.5/SCH_BBC-Microbit_V1.5.PDF
+[micro:bit v2 schematic]: https://github.com/microbit-foundation/microbit-v2-hardware/blob/main/V2/MicroBit_V2.0.0_S_schematic.PDF
+[micro:bit v1 schematic]: https://github.com/bbcmicrobit/hardware/blob/master/V1.5/SCH_BBC-Microbit_V1.5.PDF
## Actually lighting it up!
@@ -51,18 +38,15 @@ a look at it and then we can go through it step by step:
use cortex_m_rt::entry;
use panic_halt as _;
-use nrf51_hal as hal;
-use hal::prelude::*;
+use microbit::board::Board;
+use microbit::hal::prelude::*;
#[entry]
fn main() -> ! {
- let p = hal::pac::Peripherals::take().unwrap();
-
- let p0 = hal::gpio::p0::Parts::new(p.GPIO);
- let mut row1 = p0.p0_13.into_push_pull_output(hal::gpio::Level::Low);
- let _col1 = p0.p0_04.into_push_pull_output(hal::gpio::Level::Low);
+ let mut board = Board::take().unwrap();
- row1.set_high().unwrap();
+ board.display_pins.col1.set_low().unwrap();
+ board.display_pins.row1.set_high().unwrap();
loop {}
}
@@ -71,39 +55,34 @@ fn main() -> ! {
The first few lines until the main function just do some basic imports and setup we already looked at before.
However, the main function looks pretty different to what we have seen up to now.
-The first line is related to how most HALs written in Rust work internally. Usually these crates rely on so-called
-PACs (Peripheral Access Crates). A PAC is usually an autogenerated crate that provides some minimal abstractions
-for all the peripherals our MCU has to offer. `let p = hal::pac::Peripherals::take().unwrap();` basically takes all
-these peripherals from the PAC and binds them to a variable.
+The first line is related to how most HALs written in Rust work internally.
+As discussed before they are built on top of PAC crates which own (in the Rust sense)
+all the peripherals of a chip. `let mut board = Board::take().unwrap();` basically takes all
+these peripherals from the PAC and binds them to a variable. In this specific case we are
+not only working with a HAL but with an entire BSP, so this also takes ownership
+of the Rust representation of the other chips on the board.
> **NOTE**: If you are wondering why we have to call `unwrap()` here, in theory it is possible for `take()` to be called
> more than once. This would lead to the peripherals being represented by two separate variables and thus lots of
> possible confusing behaviour because two variables modify the same resource. In order to avoid this, PACs are
> implemented in a way that it would panic if you tried to take the peripherals twice.
-Once we got the peripherals, we assemble the GPIO port 0 from them with `let p0 = hal::gpio::p0::Parts::new(p.GPIO);` and
-proceed to construct the `ROW1` and `COL1` pin using the two lines below, initialized as a switched-off
-(`hal::gpio::Level::Low`) push-pull output pin (`into_push_pull_output`).
-
-> **NOTE** If you don't know what push-pull means, don't worry about it, it's mostly irrelevant for us here, if you do
-> want to figure it out, have a look [here](https://en.wikipedia.org/wiki/Push%E2%80%93pull_output).
-
-Now we can finally light the LED connected to `ROW1`, `COL1` up by setting the `ROW1` pin to high (i.e. switching it on).
-The reason we can leave `COL1` set to low is because of how the LED matrix circuit works. Furthermore, `embedded-hal` is
+Now we can light the LED connected to `row1`, `col1` up by setting the `row1` pin to high (i.e. switching it on).
+The reason we can leave `col1` set to low is because of how the LED matrix circuit works. Furthermore, `embedded-hal` is
designed in a way that every operation on hardware can possibly return an error, even just toggling a pin on or off. Since
that is highly unlikely in our case, we can just `unwrap()` the result.
-
## Testing it
-Testing our little program is quite simple. First put it into `src/mains.rs`. Afterwards we simply have to run `cargo-embed`
-again, let it flash and just like before, open our GDB and connect to the GDB stub:
+Testing our little program is quite simple. First put it into `src/mains.rs`. Afterwards we simply have to run the
+`cargo-embed` command from the last section again, let it flash and just like before, open our GDB and connect
+to the GDB stub:
```
-$ gdb target/thumbv6m-none-eabi/debug/led-roulette
+$ # Your GDB debug command from the last section
(gdb) target remote :1337
Remote debugging using :1337
-cortex_m_rt::Reset () at ~/.cargo/registry/src/github.com-1ecc6299db9ec823/cortex-m-rt-0.6.12/src/lib.rs:489
+cortex_m_rt::Reset () at /home/nix/.cargo/registry/src/github.com-1ecc6299db9ec823/cortex-m-rt-0.6.12/src/lib.rs:489
489 pub unsafe extern "C" fn Reset() -> ! {
(gdb)
```
diff --git a/src/05-led-roulette/my-solution.md b/src/05-led-roulette/my-solution.md
index a9c2614ed..29721584b 100644
--- a/src/05-led-roulette/my-solution.md
+++ b/src/05-led-roulette/my-solution.md
@@ -2,7 +2,8 @@
What solution did you come up with?
-Here's mine:
+Here's mine, it's probably one of the simplest (but of course not most
+beautiful) way to generate the required matrix:
``` rust
#![deny(unsafe_code)]
@@ -12,58 +13,40 @@ Here's mine:
use cortex_m_rt::entry;
use rtt_target::rtt_init_print;
use panic_rtt_target as _;
-use nrf51_hal as hal;
-use hal::prelude::*;
-
-// All border LEDs in order with the exception of the very first LED which is set
-// at the last spot
-const COMBINATIONS: [(usize, usize); 16] = [
- (2, 4), (1, 2), (2, 5), (1, 3), (3, 8), (2, 1), (1, 4), (3, 2), (2,6),
- (3, 1), (2, 7), (3, 3), (1, 8), (2, 2), (3, 4), (1, 1)
+use microbit::{
+ board::Board,
+ display::blocking::Display,
+ hal::Timer,
+};
+
+const PIXELS: [(usize, usize); 16] = [
+ (0,0), (0,1), (0,2), (0,3), (0,4), (1,4), (2,4), (3,4), (4,4),
+ (4,3), (4,2), (4,1), (4,0), (3,0), (2,0), (1,0)
];
#[entry]
fn main() -> ! {
rtt_init_print!();
- let p = hal::pac::Peripherals::take().unwrap();
- let mut delay = hal::Timer::new(p.TIMER0);
+ let board = Board::take().unwrap();
+ let mut timer = Timer::new(board.TIMER0);
+ let mut display = Display::new(board.display_pins);
+ let mut leds = [
+ [0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0],
+ ];
- let p0 = hal::gpio::p0::Parts::new(p.GPIO);
-
- // Initialize all rows and cols to off
- let mut row1 = p0.p0_13.into_push_pull_output(hal::gpio::Level::Low).degrade();
- let row2 = p0.p0_14.into_push_pull_output(hal::gpio::Level::Low).degrade();
- let row3 = p0.p0_15.into_push_pull_output(hal::gpio::Level::Low).degrade();
- let mut col1 = p0.p0_04.into_push_pull_output(hal::gpio::Level::High).degrade();
- let col2 = p0.p0_05.into_push_pull_output(hal::gpio::Level::High).degrade();
- let col3 = p0.p0_06.into_push_pull_output(hal::gpio::Level::High).degrade();
- let col4 = p0.p0_07.into_push_pull_output(hal::gpio::Level::High).degrade();
- let col5 = p0.p0_08.into_push_pull_output(hal::gpio::Level::High).degrade();
- let col6 = p0.p0_09.into_push_pull_output(hal::gpio::Level::High).degrade();
- let col7 = p0.p0_10.into_push_pull_output(hal::gpio::Level::High).degrade();
- let col8 = p0.p0_11.into_push_pull_output(hal::gpio::Level::High).degrade();
- let col9 = p0.p0_12.into_push_pull_output(hal::gpio::Level::High).degrade();
-
- // bring up the very first LED
- row1.set_high().unwrap();
- col1.set_low().unwrap();
-
- let mut cols = [col1, col2, col3, col4, col5, col6, col7, col8, col9];
- let mut rows = [row1, row2, row3];
+ let mut last_led = (0,0);
loop {
- let mut previous_pair = (1, 1);
- for current_pair in COMBINATIONS.iter() {
- delay.delay_ms(30u32);
-
- rows[current_pair.0 - 1].set_high().unwrap();
- cols[current_pair.1 - 1].set_low().unwrap();
-
- rows[previous_pair.0 - 1].set_low().unwrap();
- cols[previous_pair.1 - 1].set_high().unwrap();
-
- previous_pair = *current_pair;
+ for current_led in PIXELS.iter() {
+ leds[last_led.0][last_led.1] = 0;
+ leds[current_led.0][current_led.1] = 1;
+ display.show(&mut timer, leds, 30);
+ last_led = *current_led;
}
}
}
@@ -72,12 +55,22 @@ fn main() -> ! {
One more thing! Check that your solution also works when compiled in "release" mode:
``` console
-$ cargo embed --release
+# For micro:bit v2
+$ cargo embed --features v2 --target thumbv7em-none-eabihf --release
+ (...)
+
+# For micro:bit v1
+$ cargo embed --features v1 --target thumbv6m-none-eabi --release
+ (...)
```
If you want to debug your "release" mode binary you'll have to use a different GDB command:
``` console
+# For micro:bit v2
+$ gdb target/thumbv7em-none-eabihf/release/led-roulette
+
+# For micro:bit v1
$ gdb target/thumbv6m-none-eabi/release/led-roulette
```
@@ -85,58 +78,113 @@ Binary size is something we should always keep an eye on! How big is your soluti
that using the `size` command on the release binary:
``` console
-$ cargo size --bin led-roulette -- -A
- Finished dev [unoptimized + debuginfo] target(s) in 0.03s
+# For micro:bit v2
+$ cargo size --features v2 --target thumbv7em-none-eabihf -- -A
+ Finished dev [unoptimized + debuginfo] target(s) in 0.02s
+led-roulette :
+section size addr
+.vector_table 256 0x0
+.text 26984 0x100
+.rodata 2732 0x6a68
+.data 0 0x20000000
+.bss 1092 0x20000000
+.uninit 0 0x20000444
+.debug_abbrev 33941 0x0
+.debug_info 494113 0x0
+.debug_aranges 23528 0x0
+.debug_ranges 130824 0x0
+.debug_str 498781 0x0
+.debug_pubnames 143351 0x0
+.debug_pubtypes 124464 0x0
+.ARM.attributes 58 0x0
+.debug_frame 69128 0x0
+.debug_line 290580 0x0
+.debug_loc 1449 0x0
+.comment 109 0x0
+Total 1841390
+
+
+$ cargo size --features v2 --target thumbv7em-none-eabihf --release -- -A
+ Finished release [optimized + debuginfo] target(s) in 0.02s
+led-roulette :
+section size addr
+.vector_table 256 0x0
+.text 6332 0x100
+.rodata 648 0x19bc
+.data 0 0x20000000
+.bss 1076 0x20000000
+.uninit 0 0x20000434
+.debug_loc 9036 0x0
+.debug_abbrev 2754 0x0
+.debug_info 96460 0x0
+.debug_aranges 1120 0x0
+.debug_ranges 11520 0x0
+.debug_str 71325 0x0
+.debug_pubnames 32316 0x0
+.debug_pubtypes 29294 0x0
+.ARM.attributes 58 0x0
+.debug_frame 2108 0x0
+.debug_line 19303 0x0
+.comment 109 0x0
+Total 283715
+
+# micro:bit v1
+$ cargo size --features v1 --target thumbv6m-none-eabi -- -A
+ Finished dev [unoptimized + debuginfo] target(s) in 0.02s
led-roulette :
section size addr
.vector_table 168 0x0
-.text 20996 0xa8
-.rodata 2956 0x52ac
+.text 28584 0xa8
+.rodata 2948 0x7050
.data 0 0x20000000
-.bss 1088 0x20000000
-.uninit 0 0x20000440
-.debug_abbrev 21988 0x0
-.debug_info 283389 0x0
-.debug_aranges 15832 0x0
-.debug_str 307609 0x0
-.debug_pubnames 68859 0x0
-.debug_pubtypes 55406 0x0
+.bss 1092 0x20000000
+.uninit 0 0x20000444
+.debug_abbrev 30020 0x0
+.debug_info 373392 0x0
+.debug_aranges 18344 0x0
+.debug_ranges 89656 0x0
+.debug_str 375887 0x0
+.debug_pubnames 115633 0x0
+.debug_pubtypes 86658 0x0
.ARM.attributes 50 0x0
-.debug_frame 47732 0x0
-.debug_line 199401 0x0
-.debug_ranges 68936 0x0
-.debug_loc 976 0x0
-.comment 147 0x0
-Total 1095533
+.debug_frame 54144 0x0
+.debug_line 237714 0x0
+.debug_loc 1499 0x0
+.comment 109 0x0
+Total 1415898
-
-$ cargo size --bin led-roulette --release -- -A
+$ cargo size --features v1 --target thumbv6m-none-eabi --release -- -A
Finished release [optimized + debuginfo] target(s) in 0.02s
led-roulette :
section size addr
.vector_table 168 0x0
-.text 4044 0xa8
-.rodata 692 0x1074
+.text 4848 0xa8
+.rodata 648 0x1398
.data 0 0x20000000
.bss 1076 0x20000000
.uninit 0 0x20000434
-.debug_loc 7520 0x0
-.debug_abbrev 3444 0x0
-.debug_info 55229 0x0
-.debug_aranges 1144 0x0
-.debug_ranges 3608 0x0
-.debug_str 48267 0x0
-.debug_pubnames 15435 0x0
-.debug_pubtypes 15970 0x0
+.debug_loc 9705 0x0
+.debug_abbrev 3235 0x0
+.debug_info 61908 0x0
+.debug_aranges 1208 0x0
+.debug_ranges 5784 0x0
+.debug_str 57358 0x0
+.debug_pubnames 22959 0x0
+.debug_pubtypes 18891 0x0
.ARM.attributes 50 0x0
-.debug_frame 2152 0x0
-.debug_line 17050 0x0
-.comment 147 0x0
-Total 175996
+.debug_frame 2316 0x0
+.debug_line 18444 0x0
+.comment 19 0x0
+Total 208617
+
```
> **NOTE** The Cargo project is already configured to build the release binary using LTO.
-Know how to read this output? The `text` section contains the program instructions. It's around 4KB
-in my case. On the other hand, the `data` and `bss` sections contain variables statically allocated
-in RAM (`static` variables).
+Know how to read this output? The `text` section contains the program instructions. On the other hand,
+the `data` and `bss` sections contain variables statically allocated in RAM (`static` variables).
+If you remember back to the specification of the microcontroller on your micro:bit, you should
+notice that its flash memory is actually far too small to contain this binary, so how is this possible?
+As we can see from the size statistics most of the binary is actually made up of debugging related
+sections , those are however not flashed to the microcontroller at any time, after all they aren't
+relevant for the execution.
diff --git a/src/05-led-roulette/src/main.rs b/src/05-led-roulette/src/main.rs
index 9380a52ba..bb8c08ca6 100644
--- a/src/05-led-roulette/src/main.rs
+++ b/src/05-led-roulette/src/main.rs
@@ -4,7 +4,7 @@
use cortex_m_rt::entry;
use panic_halt as _;
-use nrf51_hal as _;
+use microbit as _;
#[entry]
fn main() -> ! {
diff --git a/src/05-led-roulette/the-challenge.md b/src/05-led-roulette/the-challenge.md
index 2067ff76c..613c56a31 100644
--- a/src/05-led-roulette/the-challenge.md
+++ b/src/05-led-roulette/the-challenge.md
@@ -13,14 +13,48 @@ If you can't exactly see what's happening here it is in a much slower version:
-2 hints before you start:
+Since working with the LED pins separately is quite annoying
+(especially if you have to use basically all of them like here)
+you can use the display API provided by the BSP. It works like this:
-1. As we learned before the LED matrix of the micro:bit is actually a 3x9 while being exposed as a 5x5. Furthermore,
- it seems like the 9 columns and 3 rows are more or less randomly mapped to the visual 5x5 matrix. If you don't want
- to go through the effort of figuring out the pins you have to set high/low in order to blink the border of the
- matrix, here is the list: `(R1, C1) (R2, C4) (R1, C2), (R2, C5) (R1, C3) (R3, C8) (R2, C1) (R1, C4) (R3, C2) (R2,
- C6) (R3, C1) (R2, C7) (R3, C3) (R1, C8) (R2, C2) (R3, C4)`
+```rust
+#![deny(unsafe_code)]
+#![no_main]
+#![no_std]
-2. If you are thinking about storing columns and rows in arrays you will quickly notice they are of different types since
- all GPIO pins are represented as their own type. However, you can call `.degrade()` on the individual GPIO objects in
- order to "degrade" them all into the same type and then store them in an array.
+use cortex_m_rt::entry;
+use rtt_target::rtt_init_print;
+use panic_rtt_target as _;
+use microbit::{
+ board::Board,
+ display::blocking::Display,
+ hal::{prelude::*, Timer},
+};
+
+#[entry]
+fn main() -> ! {
+ rtt_init_print!();
+
+ let board = Board::take().unwrap();
+ let mut timer = Timer::new(board.TIMER0);
+ let mut display = Display::new(board.display_pins);
+ let light_it_all = [
+ [1, 1, 1, 1, 1],
+ [1, 1, 1, 1, 1],
+ [1, 1, 1, 1, 1],
+ [1, 1, 1, 1, 1],
+ [1, 1, 1, 1, 1],
+ ];
+
+ loop {
+ // Show light_it_all for 1000ms
+ display.show(&mut timer, light_it_all, 1000);
+ // clear the display again
+ display.clear();
+ timer.delay_ms(1000_u32);
+ }
+}
+```
+
+Equipped with this API your task basically boils down to just having
+to calculate the proper image matrix and passing it into the BSP.
diff --git a/src/assets/gdb-layout-asm.png b/src/assets/gdb-layout-asm.png
index 0f1f1ef0d1368bae04bd354e51442e055bf67a9c..50fa77f9d6e197596b51c5204039b3729c7463a2 100644
GIT binary patch
literal 280312
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