My solution
What solution did you come up with?
Here’s mine:
1. #![deny(unsafe_code)]
2. #![no_main]
3. #![no_std]
5. use aux5::{entry, prelude::*, Delay, Leds};
7. #[entry]
8. fn main() -> ! {
9. let (mut delay, mut leds): (Delay, Leds) = aux5::init();
11. let ms = 50_u8;
12. loop {
13. for curr in 0..8 {
14. let next = (curr + 1) % 8;
16. leds[next].on();
17. delay.delay_ms(ms);
18. leds[curr].off();
19. delay.delay_ms(ms);
20. }
21. }
22. }
One more thing! Check that your solution also works when compiled in “release” mode:
1. $ cargo build --target thumbv7em-none-eabihf --release
You can test it with this gdb command:
1. $ # or, you could simply call `cargo run --target thumbv7em-none-eabihf --release`
2. $ arm-none-eabi-gdb target/thumbv7em-none-eabihf/release/led-roulette
3. $ # ~~~~~~~
Binary size is something we should always keep an eye on! How big is your solution? You can checkthat using the size command on the release binary:
1. $ # equivalent to size target/thumbv7em-none-eabihf/debug/led-roulette
2. $ cargo size --target thumbv7em-none-eabihf --bin led-roulette -- -A
3. led-roulette :
4. section size addr
5. .vector_table 392 0x8000000
6. .text 16404 0x8000188
7. .rodata 2924 0x80041a0
8. .data 0 0x20000000
9. .bss 4 0x20000000
10. .debug_str 602185 0x0
11. .debug_abbrev 24134 0x0
12. .debug_info 553143 0x0
13. .debug_ranges 112744 0x0
14. .debug_macinfo 86 0x0
15. .debug_pubnames 56467 0x0
16. .debug_pubtypes 94866 0x0
17. .ARM.attributes 58 0x0
18. .debug_frame 174812 0x0
19. .debug_line 354866 0x0
20. .debug_loc 534 0x0
21. .comment 75 0x0
22. Total 1993694
24. $ cargo size --target thumbv7em-none-eabihf --bin led-roulette --release -- -A
25. led-roulette :
26. section size addr
27. .vector_table 392 0x8000000
28. .text 1826 0x8000188
29. .rodata 84 0x80008ac
30. .data 0 0x20000000
31. .bss 4 0x20000000
32. .debug_str 23334 0x0
33. .debug_loc 6964 0x0
34. .debug_abbrev 1337 0x0
35. .debug_info 40582 0x0
36. .debug_ranges 2936 0x0
37. .debug_macinfo 1 0x0
38. .debug_pubnames 5470 0x0
39. .debug_pubtypes 10016 0x0
40. .ARM.attributes 58 0x0
41. .debug_frame 164 0x0
42. .debug_line 9081 0x0
43. .comment 18 0x0
44. Total 102267
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 2KBin my case. On the other hand, the data and bss sections contain variables statically allocatedin RAM (static variables). A static variable is being used in aux5::init; that’s why it shows 4bytes of bss.
One final thing! We have been running our programs from within GDB but our programs don’t depend onGDB at all. You can confirm this be closing both GDB and OpenOCD and then resetting the board bypressing the black button on the board. The LED roulette application will run without interventionof GDB.
