17 Commits

Author SHA1 Message Date
Michael Droogleever Fortuyn
cb48e8fbdd Merge branch 'rofrol-patch-1' 2020-04-27 18:54:57 +02:00
droogmic
492ef04d3d Merge pull request #24 from NOP0/master
Bumped micro-rust dependency to 0.8
2020-04-27 18:47:29 +02:00
droogmic
d8ee697999 Merge pull request #23 from rofrol/patch-6
we -> We
2020-04-27 18:47:20 +02:00
droogmic
3da68b5f1d Merge pull request #21 from rofrol/patch-5
Uninitialized _y has value -1
2020-04-27 18:47:09 +02:00
droogmic
69c27cf5f2 Merge pull request #20 from rofrol/patch-4
use #[entry] instead of entry!
2020-04-27 18:46:57 +02:00
droogmic
fe7a225b00 Merge pull request #19 from rofrol/patch-3
break main instead of break rustled::main
2020-04-27 18:46:46 +02:00
droogmic
e4e030c109 Merge pull request #17 from rofrol/patch-2
Missing extern crate panic_halt
2020-04-27 18:46:32 +02:00
droogmic
f278ec36b1 Use stable rust (#16)
* Stable rust in setup

* Version WIP

* Update panics

* fix1

* manual fixes

* autofix

* bump

* finish

* More stable fixes

* Stable nb block and editions
2020-04-27 18:45:47 +02:00
droogmic
6cc89a0423 Typos (#15)
* Typo: verify

* Typo: build

* Bump microbit

* Fix gdb command

* Fix gdbinit name

* Fix debugging binary name

* Add space

* Finish removing rustled
2020-04-27 18:45:12 +02:00
NOP0
b08613a7fd Bumped micro-rust dependency to 0.8 2020-01-05 21:29:32 +01:00
Roman Frołow
44c312271e we -> We 2019-12-30 15:14:19 +01:00
Roman Frołow
84783bca5e gdb-multiarch 2019-12-30 12:23:20 +01:00
Roman Frołow
7e1dd57395 Uninitialized _y has value -1 2019-12-30 12:19:08 +01:00
Roman Frołow
5810565cf6 use #[entry] instead of entry!
>[breaking-change] the entry!, pre_init! and exception! macros have been replaced with attributes: #[entry], #[pre_init] and #[exception], respectively.

9a4a260398/CHANGELOG.md (v060---2018-09-06)
2019-12-30 12:13:33 +01:00
Roman Frołow
bd34b10823 break main instead of break rustled::main
It didn't work for me with `rustled::`
2019-12-30 12:11:59 +01:00
Roman Frołow
f2dcd25d4e Missing extern crate panic_halt 2019-12-29 18:25:49 +01:00
Roman Frołow
a46be27bce Use gdb-multiarch instead of gdb-arm-none-eabi
https://askubuntu.com/questions/1031103/how-to-install-gdb-arm-none-eabi-on-ubuntu-18-04#comment1682182_1032469
2019-12-29 18:24:23 +01:00
18 changed files with 53 additions and 51 deletions

View File

@@ -2,5 +2,5 @@ target remote :3333
monitor arm semihosting enable monitor arm semihosting enable
set print asm-demangle on set print asm-demangle on
load load
#break main break main
continue continue

View File

@@ -3,7 +3,7 @@
> Create a time delay. > Create a time delay.
Another piece of information you will need is how to create a time delay before moving to the next row. Another piece of information you will need is how to create a time delay before moving to the next row.
we want the time spent switching LED lines on and off to be much shorter than the time spent waiting with LEDs on. We want the time spent switching LED lines on and off to be much shorter than the time spent waiting with LEDs on.
### For loop ### For loop

View File

@@ -1,9 +1,10 @@
[package] [package]
name = "display" name = "display"
version = "0.1.0" version = "0.2.0"
edition = "2018"
[dependencies] [dependencies]
cortex-m-rt="~0.6" cortex-m-rt="~0.6"
cortex-m-semihosting="~0.3" cortex-m-semihosting="~0.3"
panic-semihosting = "~0.5" panic-semihosting = "~0.5"
microbit="~0.6" microbit="~0.8"

View File

@@ -69,10 +69,10 @@ impl Display {
/// Clear display /// Clear display
pub fn clear(&mut self) { pub fn clear(&mut self) {
for row in &mut self.rows { for row in &mut self.rows {
row.set_low(); row.set_low().unwrap();
} }
for col in &mut self.cols { for col in &mut self.cols {
col.set_high(); col.set_high().unwrap();
} }
} }
@@ -97,18 +97,18 @@ impl Display {
let loops = duration_ms / (self.rows.len() as u32 * self.delay_ms); let loops = duration_ms / (self.rows.len() as u32 * self.delay_ms);
for _ in 0..loops { for _ in 0..loops {
for (row_line, led_matrix_row) in self.rows.iter_mut().zip(led_matrix.iter()) { for (row_line, led_matrix_row) in self.rows.iter_mut().zip(led_matrix.iter()) {
row_line.set_high(); row_line.set_high().unwrap();
for (col_line, led_matrix_val) in self.cols.iter_mut().zip(led_matrix_row.iter()) { for (col_line, led_matrix_val) in self.cols.iter_mut().zip(led_matrix_row.iter()) {
// We are keeping it simple, and not adding brightness // We are keeping it simple, and not adding brightness
if *led_matrix_val > 0 { if *led_matrix_val > 0 {
col_line.set_low(); col_line.set_low().unwrap();
} }
} }
delay.delay_ms(self.delay_ms); delay.delay_ms(self.delay_ms);
for col_line in &mut self.cols { for col_line in &mut self.cols {
col_line.set_high(); col_line.set_high().unwrap();
} }
row_line.set_low(); row_line.set_low().unwrap();
} }
} }
} }
@@ -120,15 +120,15 @@ fn main() -> ! {
writeln!(stdout, "Start").unwrap(); writeln!(stdout, "Start").unwrap();
if let Some(p) = microbit::Peripherals::take() { if let Some(p) = microbit::Peripherals::take() {
// Split GPIO // Split GPIO
let mut gpio = p.GPIO.split(); let gpio = p.GPIO.split();
// Configure RX and TX pins accordingly // Configure RX and TX pins accordingly
let tx = gpio.pin24.into_push_pull_output().downgrade(); let tx = gpio.pin24.into_push_pull_output().downgrade();
let rx = gpio.pin25.into_floating_input().downgrade(); let rx = gpio.pin25.into_floating_input().downgrade();
// Configure serial communication // Configure serial communication
let (mut tx, _) = serial::Serial::uart0(p.UART0, tx, rx, BAUD115200).split(); let (mut tx, _) = serial::Serial::uart0(p.UART0, tx, rx, BAUD115200).split();
writeln!(tx, ""); writeln!(tx, "").unwrap();
writeln!(tx, "Init"); writeln!(tx, "Init").unwrap();
// Create delay provider // Create delay provider
let mut delay = Delay::new(p.TIMER0); let mut delay = Delay::new(p.TIMER0);
@@ -179,10 +179,10 @@ fn main() -> ! {
[0, 1, 1, 1, 0], [0, 1, 1, 1, 0],
]; ];
writeln!(tx, "Starting!"); writeln!(tx, "Starting!").unwrap();
loop { loop {
writeln!(tx, "I <3 Rust on the micro:bit!"); writeln!(tx, "I <3 Rust on the micro:bit!").unwrap();
leds.display(&mut delay, letter_I, 1000); leds.display(&mut delay, letter_I, 1000);
leds.display(&mut delay, heart, 1000); leds.display(&mut delay, heart, 1000);
leds.display(&mut delay, letter_U, 1000); leds.display(&mut delay, letter_U, 1000);

View File

@@ -149,6 +149,8 @@ Note, you would also need to disable [name mangling][nm]:
#![no_std] #![no_std]
#![no_main] #![no_main]
extern crate panic_halt;
#[no_mangle] #[no_mangle]
pub extern "C" fn _start() -> ! { pub extern "C" fn _start() -> ! {
loop {} loop {}

View File

@@ -71,6 +71,7 @@ available.
I mentioned that OpenOCD provides a GDB server so let's connect to that right now: I mentioned that OpenOCD provides a GDB server so let's connect to that right now:
``` console ``` console
# On Ubuntu use `gdb-mutliarch -q target/thumbv6m-none-eabi/debug//microrust-start`
$ arm-none-eabi-gdb -q target/thumbv6m-none-eabi/debug/microrust-start $ arm-none-eabi-gdb -q target/thumbv6m-none-eabi/debug/microrust-start
Reading symbols from target/thumbv6m-none-eabi/debug/microrust-start...done. Reading symbols from target/thumbv6m-none-eabi/debug/microrust-start...done.
(gdb) (gdb)

View File

@@ -6,7 +6,7 @@ Before we start, let's add some code to debug:
``` rust ``` rust
// -- snip -- // -- snip --
entry!(main); #[entry]
fn main() -> ! { fn main() -> ! {
let _y; let _y;
let x = 42; let x = 42;
@@ -87,15 +87,15 @@ $1 = 42
$2 = (i32 *) 0x10001fdc $2 = (i32 *) 0x10001fdc
(gdb) print _y (gdb) print _y
$3 = 134219052 $3 = -1
(gdb) print &_y (gdb) print &_y
$4 = (i32 *) 0x10001fd8 $4 = (i32 *) 0x10001fd8
``` ```
As expected, `x` contains the value `42`. As expected, `x` contains the value `42`.
`_y` however, contains the value `134219052` (?). `_y` however, contains the value `-1` (?).
Because `_y` has not been initialized yet, it contains some garbage value. Because `_y` has not been initialized yet, it contains `-1`.
The command `print &x` prints the address of the variable `x`. 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: The interesting bit here is that GDB output shows the type of the reference:
@@ -108,7 +108,7 @@ Instead of printing the local variables one by one, you can also use the `info l
``` ```
(gdb) info locals (gdb) info locals
x = 42 x = 42
_y = 134219052 _y = -1
``` ```
OK. With another `step`, we'll be on top of the `loop {}` statement: OK. With another `step`, we'll be on top of the `loop {}` statement:

View File

@@ -1,6 +1,7 @@
[package] [package]
name = "start" name = "start"
version = "0.2.0" version = "0.3.0"
edition = "2018"
[dependencies] [dependencies]
panic-halt = "~0.2" panic-halt = "~0.2"

View File

@@ -1,9 +1,10 @@
[package] [package]
name = "hello" name = "hello"
version = "0.2.0" version = "0.3.0"
edition = "2018"
[dependencies] [dependencies]
microbit="~0.6" microbit="~0.8"
cortex-m-rt="~0.6" cortex-m-rt="~0.6"
cortex-m-semihosting="~0.3" cortex-m-semihosting="~0.3"
panic-semihosting = "~0.5" panic-semihosting = "~0.5"

View File

@@ -20,20 +20,20 @@ fn main() -> ! {
writeln!(stdout, "Start").unwrap(); writeln!(stdout, "Start").unwrap();
if let Some(p) = microbit::Peripherals::take() { if let Some(p) = microbit::Peripherals::take() {
// Split GPIO // Split GPIO
let mut gpio = p.GPIO.split(); let gpio = p.GPIO.split();
// Configure RX and TX pins accordingly // Configure RX and TX pins accordingly
let tx = gpio.pin24.into_push_pull_output().downgrade(); let tx = gpio.pin24.into_push_pull_output().downgrade();
let rx = gpio.pin25.into_floating_input().downgrade(); let rx = gpio.pin25.into_floating_input().downgrade();
// Configure serial communication // Configure serial communication
let (mut tx, _) = serial::Serial::uart0(p.UART0, tx, rx, BAUD115200).split(); let (mut tx, _) = serial::Serial::uart0(p.UART0, tx, rx, BAUD115200).split();
write!(tx, "serial - start\r\n"); write!(tx, "serial - start\r\n").unwrap();
// Get row and column for display // Get row and column for display
let mut led = gpio.pin13.into_push_pull_output(); let mut led = gpio.pin13.into_push_pull_output();
let _ = gpio.pin4.into_push_pull_output(); let _ = gpio.pin4.into_push_pull_output();
// Set row high (column starts low) // Set row high (column starts low)
led.set_high(); led.set_high().unwrap();
// Write string with newline and carriage return // Write string with newline and carriage return
write!(tx, "serial - LED on\r\n"); write!(tx, "serial - LED on\r\n").unwrap();
} }
panic!("End"); panic!("End");
} }

View File

@@ -1,10 +1,11 @@
[package] [package]
name = "microbit" name = "micro"
version = "0.1.0" version = "0.2.0"
edition = "2018"
[dependencies] [dependencies]
cortex-m-rt="~0.6" cortex-m-rt="~0.6"
cortex-m-semihosting="~0.3" cortex-m-semihosting="~0.3"
panic-abort = "~0.3" panic-halt = "~0.2"
panic-semihosting = "~0.5" panic-semihosting = "~0.5"
microbit="~0.6" microbit="~0.8"

View File

@@ -1,7 +1,7 @@
#![no_std] #![no_std]
#![no_main] #![no_main]
extern crate panic_abort; extern crate panic_halt;
extern crate cortex_m_rt as rt; extern crate cortex_m_rt as rt;
extern crate microbit; extern crate microbit;
@@ -16,7 +16,7 @@ use microbit::hal::serial::BAUD115200;
fn main() -> ! { fn main() -> ! {
if let Some(p) = microbit::Peripherals::take() { if let Some(p) = microbit::Peripherals::take() {
// Split GPIO // Split GPIO
let mut gpio = p.GPIO.split(); let gpio = p.GPIO.split();
// Configure RX and TX pins accordingly // Configure RX and TX pins accordingly
let tx = gpio.pin24.into_push_pull_output().downgrade(); let tx = gpio.pin24.into_push_pull_output().downgrade();
let rx = gpio.pin25.into_floating_input().downgrade(); let rx = gpio.pin25.into_floating_input().downgrade();

View File

@@ -1,7 +1,7 @@
#![no_std] #![no_std]
#![no_main] #![no_main]
extern crate panic_abort; extern crate panic_halt;
extern crate cortex_m_rt as rt; extern crate cortex_m_rt as rt;
extern crate microbit; extern crate microbit;

View File

@@ -5,7 +5,7 @@
extern crate microbit; extern crate microbit;
extern crate cortex_m_rt as rt; extern crate cortex_m_rt as rt;
extern crate cortex_m_semihosting as sh; extern crate cortex_m_semihosting as sh;
extern crate panic_abort; extern crate panic_halt;
use core::fmt::Write; use core::fmt::Write;
use rt::entry; use rt::entry;

View File

@@ -1,10 +1,11 @@
[package] [package]
name = "serial" name = "serial"
version = "0.1.0" version = "0.2.0"
edition = "2018"
[dependencies] [dependencies]
heapless="~0.3" heapless="~0.5"
cortex-m-rt="~0.6" cortex-m-rt="~0.6"
cortex-m-semihosting="~0.3" cortex-m-semihosting="~0.3"
panic-semihosting = "~0.5" panic-semihosting = "~0.5"
microbit="~0.6" microbit="~0.8"

View File

@@ -13,7 +13,7 @@ use sh::hio;
use microbit::hal::prelude::*; use microbit::hal::prelude::*;
use microbit::hal::serial; use microbit::hal::serial;
use microbit::hal::serial::BAUD115200; use microbit::hal::serial::BAUD115200;
use microbit::nb::block; use microbit::block;
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
@@ -21,16 +21,16 @@ fn main() -> ! {
writeln!(stdout, "Start").unwrap(); writeln!(stdout, "Start").unwrap();
if let Some(p) = microbit::Peripherals::take() { if let Some(p) = microbit::Peripherals::take() {
// Split GPIO // Split GPIO
let mut gpio = p.GPIO.split(); let gpio = p.GPIO.split();
// Configure RX and TX pins accordingly // Configure RX and TX pins accordingly
let tx = gpio.pin24.into_push_pull_output().downgrade(); let tx = gpio.pin24.into_push_pull_output().downgrade();
let rx = gpio.pin25.into_floating_input().downgrade(); let rx = gpio.pin25.into_floating_input().downgrade();
// Configure serial communication // Configure serial communication
let (mut tx, mut rx) = serial::Serial::uart0(p.UART0, tx, rx, BAUD115200).split(); let (mut tx, mut rx) = serial::Serial::uart0(p.UART0, tx, rx, BAUD115200).split();
writeln!(tx, "Start"); writeln!(tx, "Start").unwrap();
loop { loop {
let val = block!(rx.read()).unwrap(); let val = block!(rx.read()).unwrap();
block!(tx.write(val)); block!(tx.write(val)).unwrap();
} }
} }
panic!("End"); panic!("End");

View File

@@ -9,7 +9,7 @@ Here are the installation commands for a few Linux distributions.
``` shell ``` shell
$ sudo apt-get install \ $ sudo apt-get install \
gcc-arm-none-eabi \ gcc-arm-none-eabi \
gdb-arm-none-eabi \ gdb-multiarch \
minicom \ minicom \
openocd openocd
``` ```

View File

@@ -38,18 +38,12 @@ Next, follow OS-agnostic installation instructions for a few of the tools:
Install rustup by following the instructions at [https://rustup.rs](https://rustup.rs). Install rustup by following the instructions at [https://rustup.rs](https://rustup.rs).
Then, install or switch to the nightly channel. **NOTE** Make sure you have a recent version, but only `1.39.0` is validated.
``` shell
$ rustup default nightly
```
**NOTE** Make sure you have a nightly newer than `nightly-2018-10-12`.
`rustc -V` should return a date newer than the one shown below: `rustc -V` should return a date newer than the one shown below:
``` shell ``` shell
$ rustc -V $ rustc -V
rustc 1.31.0-nightly (2c2e2c57d 2018-10-12) rustc 1.39.0 (4560ea788 2019-11-04)
``` ```
### OS specific instructions ### OS specific instructions