26 Commits

Author SHA1 Message Date
Emil Fresk
73bae533c4 Added backtrace limit to mitigate infinite backtraces 2019-02-05 20:17:20 +01:00
Emil Fresk
ac344b967f Merge pull request #66 from jacobrosenthal/patch-1
update interrupt usage
2019-01-30 19:54:09 +01:00
Jacob Rosenthal
c6599f3686 update interrupt usage 2019-01-29 15:12:07 -07:00
Adam Greig
3aa5ea9fd3 Merge pull request #64 from sstelfox/fix_breakpoint
Adjust the default breakpoint name to match cortex-m-rt pull #144
2019-01-22 08:38:49 +00:00
Sam Stelfox
26baac1bf3 Adjust the default breakpoint name to match cortex-m-rt pull #144 2019-01-21 23:39:45 -05:00
Emil Fresk
2d7405fc04 Merge pull request #61 from rubberduck203/tests
Add example of writing tests that run on host machine
2019-01-01 11:34:22 +01:00
Christopher J. McClellan
e58549b2ec Add more documentation for testing on host 2018-12-31 07:01:16 -05:00
Emil Fresk
9ee8b84217 Merge pull request #62 from rubberduck203/coc
Fixes code of conduct link.
2018-12-31 11:35:55 +01:00
Christopher J. McClellan
0e2aadf8f2 Make sure we can actually test prod code 2018-12-30 19:55:24 -05:00
Christopher J. McClellan
e7138e0e2a Fixes code of conduct link.
Closes #60
2018-12-30 19:24:24 -05:00
Christopher J. McClellan
c142db6e23 Add example of writing tests that run on host machine 2018-12-30 19:17:58 -05:00
Emil Fresk
207bca35f4 Merge pull request #59 from rust-embedded/loop_crash_fix
Workaround for loop {} until it is fixed
2018-11-20 15:33:23 +01:00
Emil Fresk
f9570c7c65 Workaround for loop {} until it is fixed 2018-11-20 07:58:38 +01:00
Adam Greig
f47d1633af Merge pull request #57 from rust-embedded/sh
use hprint macros and NVIC::pend; fix allocator example
2018-11-10 00:10:46 +00:00
Jorge Aparicio
55e61c3291 bump dependencies 2018-11-10 00:04:28 +01:00
Jorge Aparicio
e64e690512 use NVIC::pend
instead of the deprecated NVIC.set_pending
2018-11-10 00:02:00 +01:00
Jorge Aparicio
f7a943f480 fix the allocator example
importing alloc is a bit weird
2018-11-10 00:01:25 +01:00
Jorge Aparicio
9c6b290e12 use hprint macros 2018-11-10 00:00:57 +01:00
Emil Fresk
7e2bec66b7 Merge pull request #54 from Nicoretti/toml
Add additional meta data to improve crate experience
2018-10-28 23:48:50 +01:00
Emil Fresk
4295bccf0e Merge pull request #51 from rust-embedded/therealprof-extended-remote
Default to extended-remote instead of remote mode
2018-10-28 23:48:32 +01:00
Nicola Coretti
8f292e0f07 Add additional meta data to improve crate experience
* Add readme setting, so README.md is shown on https://crates.io/
2018-10-26 15:54:27 +02:00
Jonathan 'theJPster' Pallant
76d2e947a5 Merge pull request #53 from birkenfeld/patch-1
Add example moving .bss data into custom memory
2018-10-22 19:18:17 -07:00
Georg Brandl
76cdd6a95b fix example 2018-10-21 17:27:47 +02:00
Georg Brandl
314e48537c Add example moving .bss data into custom memory
We're using a STM32F429 and wanted to move stuff around in memory, notably put stack+data into CPU coupled memory, and put framebuffers for the integrated LCD controller into the normal SRAM.

Getting this right while not completely overriding the default `link.x` was quite tricky (especially finding the `INSERT AFTER` life-saver...) so I thought an example would not hurt here.

It should probably also be mentioned in other places (book/...)?
2018-10-21 13:04:40 +02:00
Daniel Egger
d5abcf6d2a Merge pull request #52 from jannic/patch-1
Update rust version requirements in README.md
2018-10-13 21:40:23 +02:00
Jan Niehusmann
b02a67b5f9 Update rust version requirements in README.md
As Cargo.toml now includes edition = "2018", it won't build with rust 1.30-stable. 1.31-stable will be the first stable version to have the edition feature enabled. (See https://internals.rust-lang.org/t/rust-2018-release-schedule-and-extended-beta/8076 for details.)

At the same time, remove the remark about 1.30-beta not being out yet, as it's out by now.
2018-10-13 21:37:17 +02:00
10 changed files with 102 additions and 50 deletions

View File

@@ -1,13 +1,14 @@
[package]
authors = ["{{authors}}"]
edition = "2018"
readme = "README.md"
name = "{{project-name}}"
version = "0.1.0"
[dependencies]
cortex-m = "0.5.7"
cortex-m-rt = "0.6.3"
cortex-m-semihosting = "0.3.1"
cortex-m = "0.5.8"
cortex-m-rt = "0.6.5"
cortex-m-semihosting = "0.3.2"
panic-halt = "0.2.0"
# Uncomment for the panic example.

View File

@@ -8,12 +8,9 @@ This project is developed and maintained by the [Cortex-M team][team].
To build embedded programs using this template you'll need:
- Rust 1.30, 1.30-beta, nightly-2018-09-13 or a newer toolchain. e.g. `rustup
- Rust 1.31, 1.30-beta, nightly-2018-09-13 or a newer toolchain. e.g. `rustup
default beta`
> **NOTE**: 1.30-beta is not out yet so you'll have to use the nightly channel
> in the meantime.
- The `cargo generate` subcommand. [Installation
instructions](https://github.com/ashleygwilliams/cargo-generate#installation).
@@ -128,5 +125,5 @@ Contribution to this crate is organized under the terms of the [Rust Code of
Conduct][CoC], the maintainer of this crate, the [Cortex-M team][team], promises
to intervene to uphold that code of conduct.
[CoC]: CODE_OF_CONDUCT.md
[CoC]: https://www.rust-lang.org/policies/code-of-conduct
[team]: https://github.com/rust-embedded/wg#the-cortex-m-team

View File

@@ -14,16 +14,16 @@
#![no_main]
#![no_std]
extern crate alloc;
extern crate panic_halt;
use self::alloc::vec;
use core::alloc::Layout;
use core::fmt::Write;
use alloc::vec;
use alloc_cortex_m::CortexMHeap;
use cortex_m::asm;
use cortex_m_rt::entry;
use cortex_m_semihosting::hio;
use cortex_m_semihosting::hprintln;
// this is the allocator the application will use
#[global_allocator]
@@ -39,8 +39,11 @@ fn main() -> ! {
// Growable array allocated on the heap
let xs = vec![0, 1, 2];
let mut stdout = hio::hstdout().unwrap();
writeln!(stdout, "{:?}", xs).unwrap();
hprintln!("{:?}", xs).unwrap();
// exit QEMU
// NOTE do not run this on hardware; it can corrupt OpenOCD state
debug::exit(debug::EXIT_SUCCESS);
loop {}
}

View File

@@ -5,9 +5,6 @@
//!
//! [`svd2rust`]: https://crates.io/crates/svd2rust
//!
//! Device crates also provide an `interrupt!` macro (behind the "rt" feature) to register interrupt
//! handlers.
//!
//! This example depends on the [`stm32f103xx`] crate so you'll have to add it to your Cargo.toml.
//!
//! [`stm32f103xx`]: https://crates.io/crates/stm32f103xx
@@ -27,11 +24,9 @@
#[allow(unused_extern_crates)]
extern crate panic_halt;
use core::fmt::Write;
use cortex_m::peripheral::syst::SystClkSource;
use cortex_m_rt::entry;
use cortex_m_semihosting::hio::{self, HStdout};
use cortex_m_semihosting::hprint;
use stm32f30x::{interrupt, Interrupt};
#[entry]
@@ -53,19 +48,11 @@ fn main() -> ! {
while !syst.has_wrapped() {}
// trigger the `EXTI0` interrupt
nvic.set_pending(Interrupt::EXTI0);
NVIC::pend(Interrupt::EXTI0);
}
}
// try commenting out this line: you'll end in `default_handler` instead of in `exti0`
interrupt!(EXTI0, exti0, state: Option<HStdout> = None);
fn exti0(state: &mut Option<HStdout>) {
if state.is_none() {
*state = Some(hio::hstdout().unwrap());
}
if let Some(hstdout) = state.as_mut() {
hstdout.write_str(".").unwrap();
}
#[interrupt]
fn EXTI0() {
hprint!(".").unwrap();
}

View File

@@ -12,12 +12,10 @@
extern crate panic_halt;
use core::fmt::Write;
use cortex_m::peripheral::syst::SystClkSource;
use cortex_m::Peripherals;
use cortex_m_rt::{entry, exception};
use cortex_m_semihosting::hio::{self, HStdout};
use cortex_m_semihosting::hprint;
#[entry]
fn main() -> ! {
@@ -35,13 +33,5 @@ fn main() -> ! {
#[exception]
fn SysTick() {
static mut STDOUT: Option<HStdout> = None;
if STDOUT.is_none() {
*STDOUT = Some(hio::hstdout().unwrap());
}
if let Some(hstdout) = STDOUT.as_mut() {
hstdout.write_str(".").unwrap();
}
hprint!(".").unwrap();
}

View File

@@ -5,17 +5,15 @@
extern crate panic_halt;
use core::fmt::Write;
use cortex_m_rt::entry;
use cortex_m_semihosting::{debug, hio};
use cortex_m_semihosting::{debug, hprintln};
#[entry]
fn main() -> ! {
let mut stdout = hio::hstdout().unwrap();
writeln!(stdout, "Hello, world!").unwrap();
hprintln!("Hello, world!").unwrap();
// exit QEMU or the debugger section
// exit QEMU
// NOTE do not run this on hardware; it can corrupt OpenOCD state
debug::exit(debug::EXIT_SUCCESS);
loop {}

57
examples/test_on_host.rs Normal file
View File

@@ -0,0 +1,57 @@
//! Conditionally compiling tests with std and our executable with no_std.
//!
//! Rust's built in unit testing framework requires the standard library,
//! but we need to build our final executable with no_std.
//! The testing framework also generates a `main` method, so we need to only use the `#[entry]`
//! annotation when building our final image.
//! For more information on why this example works, see this excellent blog post.
//! https://os.phil-opp.com/unit-testing/
//!
//! Running this example:
//!
//! Ensure there are no targets specified under `[build]` in `.cargo/config`
//! In order to make this work, we lose the convenience of having a default target that isn't the
//! host.
//!
//! cargo build --example test_on_host --target thumbv7m-none-eabi
//! cargo test --example test_on_host
#![cfg_attr(test, allow(unused_imports))]
#![cfg_attr(not(test), no_std)]
#![cfg_attr(not(test), no_main)]
// pick a panicking behavior
#[cfg(not(test))]
extern crate panic_halt; // you can put a breakpoint on `rust_begin_unwind` to catch panics
// extern crate panic_abort; // requires nightly
// extern crate panic_itm; // logs messages over ITM; requires ITM support
// extern crate panic_semihosting; // logs messages to the host stderr; requires a debugger
use cortex_m::asm;
use cortex_m_rt::entry;
#[cfg(not(test))]
#[entry]
fn main() -> ! {
asm::nop(); // To not have main optimize to abort in release mode, remove when you add code
loop {
// your code goes here
}
}
fn add(a: i32, b: i32) -> i32 {
a + b
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn foo() {
println!("tests work!");
assert!(2 == add(1,1));
}
}

View File

@@ -19,3 +19,16 @@ MEMORY
/* This is required only on microcontrollers that store some configuration right
after the vector table */
/* _stext = ORIGIN(FLASH) + 0x400; */
/* Example of putting non-initialized variables into custom RAM locations. */
/* This assumes you have defined a region RAM2 above, and in the Rust
sources added the attribute `#[link_section = ".ram2bss"]` to the data
you want to place there. */
/* Note that the section will not be zero-initialized by the runtime! */
/* SECTIONS {
.ram2bss (NOLOAD) : ALIGN(4) {
*(.ram2bss);
. = ALIGN(4);
} > RAM2
} INSERT AFTER .bss;
*/

View File

@@ -3,9 +3,12 @@ target extended-remote :3333
# print demangled symbols
set print asm-demangle on
# set backtrace limit to not have infinite backtrace loops
set backtrace limit 32
# detect unhandled exceptions, hard faults and panics
break DefaultHandler
break UserHardFault
break HardFault
break rust_begin_unwind
# *try* to stop at the user entry point (it might be gone due to inlining)

View File

@@ -7,10 +7,13 @@ extern crate panic_halt; // you can put a breakpoint on `rust_begin_unwind` to c
// extern crate panic_itm; // logs messages over ITM; requires ITM support
// extern crate panic_semihosting; // logs messages to the host stderr; requires a debugger
use cortex_m::asm;
use cortex_m_rt::entry;
#[entry]
fn main() -> ! {
asm::nop(); // To not have main optimize to abort in release mode, remove when you add code
loop {
// your code goes here
}