From 5b681bee67a00424ac7c56767b2693683de4dd24 Mon Sep 17 00:00:00 2001
From: Per Lindgren <per.lindgren@ltu.se>
Date: Sat, 5 Jan 2019 15:42:38 +0100
Subject: [PATCH] bare1
---
.cargo/config | 3 +++
.vscode/launch.json | 58 +++++++++++++++++++++++++++++++++++++++++++++
.vscode/tasks.json | 24 +++++++++++++++++++
Cargo.toml | 5 +++-
examples/bare0.rs | 49 ++++++++++++++++++++------------------
5 files changed, 115 insertions(+), 24 deletions(-)
diff --git a/.cargo/config b/.cargo/config
index a7fff23..ec3e4e9 100644
--- a/.cargo/config
+++ b/.cargo/config
@@ -23,6 +23,9 @@ rustflags = [
# "-C", "linker=arm-none-eabi-gcc",
# "-C", "link-arg=-Wl,-Tlink.x",
# "-C", "link-arg=-nostartfiles",
+
+ # uncomment for unchecked wrapping arithmetics also in dev mode
+ # "-Z", "force-overflow-checks=off",
]
[build]
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 9885634..b61b652 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -168,6 +168,64 @@
],
"cwd": "${workspaceRoot}"
},
+ {
+ "type": "cortex-debug",
+ "request": "launch",
+ "servertype": "openocd",
+ "name": "bare1 (debug)",
+ "preLaunchTask": "cargo build --example bare1",
+ "executable": "./target/thumbv7em-none-eabihf/debug/examples/bare1",
+ "postLaunchCommands": [
+ "monitor arm semihosting enable"
+ ],
+ "swoConfig": {
+ "enabled": true,
+ "cpuFrequency": 16000000,
+ "swoFrequency": 2000000,
+ "source": "probe",
+ "decoders": [
+ {
+ "type": "console",
+ "label": "ITM",
+ "port": 0
+ }
+ ]
+ },
+ "configFiles": [
+ "interface/stlink.cfg",
+ "target/stm32f4x.cfg"
+ ],
+ "cwd": "${workspaceRoot}"
+ },
+ {
+ "type": "cortex-debug",
+ "request": "launch",
+ "servertype": "openocd",
+ "name": "bare1 (release)",
+ "preLaunchTask": "cargo build --example bare1",
+ "executable": "./target/thumbv7em-none-eabihf/release/examples/bare1",
+ "postLaunchCommands": [
+ "monitor arm semihosting enable"
+ ],
+ "swoConfig": {
+ "enabled": true,
+ "cpuFrequency": 16000000,
+ "swoFrequency": 2000000,
+ "source": "probe",
+ "decoders": [
+ {
+ "type": "console",
+ "label": "ITM",
+ "port": 0
+ }
+ ]
+ },
+ "configFiles": [
+ "interface/stlink.cfg",
+ "target/stm32f4x.cfg"
+ ],
+ "cwd": "${workspaceRoot}"
+ },
{
"type": "cortex-debug",
"request": "launch",
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index d671b64..d0ca15a 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -87,5 +87,29 @@
"isDefault": true
}
},
+ {
+ "type": "shell",
+ "label": "cargo build --example bare1",
+ "command": "cargo build --example bare1",
+ "problemMatcher": [
+ "$rustc"
+ ],
+ "group": {
+ "kind": "build",
+ "isDefault": true
+ }
+ },
+ {
+ "type": "shell",
+ "label": "cargo build --example bare1 --release",
+ "command": "cargo build --example bare1 --release",
+ "problemMatcher": [
+ "$rustc"
+ ],
+ "group": {
+ "kind": "build",
+ "isDefault": true
+ }
+ },
]
}
\ No newline at end of file
diff --git a/Cargo.toml b/Cargo.toml
index 1b4547c..418318f 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -5,8 +5,11 @@ readme = "README.md"
name = "app"
version = "0.1.0"
+[dependencies.cortex-m]
+version = "0.5.8"
+features = ["inline-asm"] # <- currently requires nightly compiler
+
[dependencies]
-cortex-m = "0.5.8"
cortex-m-rt = "0.6.7"
cortex-m-semihosting = "0.3.2"
panic-halt = "0.2.0"
diff --git a/examples/bare0.rs b/examples/bare0.rs
index db9ae60..cfd6f90 100644
--- a/examples/bare0.rs
+++ b/examples/bare0.rs
@@ -1,5 +1,5 @@
//! bare0.rs
-//!
+//!
//! Simple bare metal application
//! What it covers:
//! - constants
@@ -7,7 +7,7 @@
//! - checked vs. wrapping arithmetics
//! - safe and unsafe code
//! - making a safe API
-//!
+//!
// build without the Rust standard library
#![no_std]
// no standard main, we declare main using [entry]
@@ -18,7 +18,7 @@ extern crate panic_halt;
// Minimal runtime / startup for Cortex-M microcontrollers
use cortex_m_rt::entry;
-// a constant (cannot be changed)
+// a constant (cannot be changed at run-time)
const X_INIT: u32 = 10;
// global mutabale variables (changed using unsafe code)
@@ -40,62 +40,65 @@ fn main() -> ! {
}
}
-// 1. run the program in the debugger,
-// let the program run for a while and then press pause
-// look in the (Local -vscode) Variables view what do you find
+// 1. Run the program in the debugger, let the program run for a while and
+// then press pause. Look in the (Local -vscode) Variables view what do you find.
+//
// ** your answer here **
//
-// in the Expressions (WATCH -vscode) view add X and Y
+// In the Expressions (WATCH -vscode) view add X and Y
// what do you find
//
// ** your answer here **
-// step through one complete iteration of the loop
+//
+// Step through one complete iteration of the loop
// and see how the (Local) Variables are updated
// can you foresee what will eventually happen?
+//
// ** place your answer here **
//
// commit your answers (bare0_1)
//
-// 2. alter the constant X_INIT so that `x += 1` directly causes `x` to wrap
+// 2. Alter the constant X_INIT so that `x += 1` directly causes `x` to wrap
// what happens when `x` wraps
+//
// ** your answer here **
//
// commit your answers (bare0_2)
//
-// 3. place a breakpoint at `x += 1`
-// change (both) += opertions to use wrapping_add
+// 3. Place a breakpoint at `x += 1`
+//
+// Change (both) += opertions to use wrapping_add
// load and run the progam, what happens
// ** your answer here **
//
-// now continue exectution, what happens
+// Now continue exectution, what happens
// ** your answer here **
//
// commit your answers (bare0_3)
//
-// (if the program did not succeed back to the breakpoint
-// you have some fault in the program and go back to 3)
+// (If the program did not succeed back to the breakpoint
+// you have some fault in the program and go back to 3.)
+//
+// 4. Change the asserion to `assert!(x == X && X == Y + 1)`, what happens?
//
-// 4. change the asserion to `assert!(x == X && X == Y + 1)`, what happens
// ** place your answer here **
//
// commit your answers (bare0_4)
//
-// 5. remove the assertion and
-//
-// make "safe" functions for reading and writing X and Y
+// 5. Remove the assertion and implement "safe" functions for
+// reading and writing X and Y
// e.g. read_x, read_y, write_x, write_y
//
-// rewrite the program to use ONLY "safe" code besides the
+// Rewrite the program to use ONLY "safe" code besides the
// read/write functions (which are internally "unsafe")
//
// commit your solution (bare0_5)
//
-// 6*. optional
-// implement a read_u32/write_u32, taking a reference to a
+// 6. *Optional
+// Implement a read_u32/write_u32, taking a reference to a
// "static" variable
//
-// rewrite the program to use this abstraction instead of "read_x", etc.
+// Rewrite the program to use this abstraction instead of "read_x", etc.
//
// commit your solution (bare0_6)
//
-
--
GitLab