Skip to content

Commit

Permalink
Merge #268 #270
Browse files Browse the repository at this point in the history
268: CI: replace compiletest-rs with trybuild r=japaric a=japaric

We use compiletest to run compile-fail tests but compiletest depends on compiler
internals so it breaks every now and then and requires nightly. With trybuild we
can also run compile-fail tests but it works on stable and it already has
reached version 1.0

270: Added struct de-structure-ing example in tips & tricks r=japaric a=korken89

As per last meeting, a bare-bones added that we can improve

Co-authored-by: Jorge Aparicio <jorge@japaric.io>
Co-authored-by: Emil Fresk <emil.fresk@gmail.com>
  • Loading branch information
3 people committed Nov 13, 2019
3 parents 72e84cb + e9a8394 + 76e2345 commit 85463ed
Show file tree
Hide file tree
Showing 14 changed files with 80 additions and 45 deletions.
5 changes: 1 addition & 4 deletions .cargo/config
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,4 @@ runner = "qemu-system-arm -cpu cortex-m3 -machine lm3s6965evb -nographic -semiho
[target.'cfg(all(target_arch = "arm", target_os = "none"))']
rustflags = [
"-C", "link-arg=-Tlink.x",
]

[build]
target = "thumbv7m-none-eabi"
]
3 changes: 1 addition & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,7 @@ matrix:

# compile-fail tests
- env: TARGET=x86_64-unknown-linux-gnu
# FIXME revert this -- compiletest-rs v0.3.25 is broken with recent nightly
rust: nightly-2019-10-31
rust: nightly
if: (branch = staging OR branch = trying) OR (type = pull_request AND branch = master)

# heterogeneous multi-core support
Expand Down
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ features = ["exit"]
version = "0.5.2"

[target.x86_64-unknown-linux-gnu.dev-dependencies]
compiletest_rs = "0.3.22"
trybuild = "1"

[features]
heterogeneous = ["cortex-m-rtfm-macros/heterogeneous", "microamp"]
Expand Down
9 changes: 9 additions & 0 deletions book/en/src/by-example/tips.md
Original file line number Diff line number Diff line change
Expand Up @@ -165,3 +165,12 @@ crate and print the output to the console.
$ # produces the same output as before
$ cargo expand --example smallest | tail
```

## Resource de-structure-ing

When having a task taking multiple resources it can help in readability to split
up the resource struct. Here're two examples on how this can be done:

``` rust
{{#include ../../../../examples/destructure.rs}}
```
5 changes: 4 additions & 1 deletion ci/script.sh
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,13 @@ main() {
mkdir -p ci/builds

if [ $T = x86_64-unknown-linux-gnu ]; then
if [ $TRAVIS_RUST_VERSION = nightly ]; then
if [[ $TRAVIS_RUST_VERSION == 1.*.* ]]; then
# test on a fixed version (MSRV) to avoid problems with changes in rustc diagnostics
# compile-fail tests
cargo test --test single --target $T
fi

if [ $TRAVIS_RUST_VERSION = nightly ]; then
# multi-core compile-pass tests
pushd heterogeneous
local exs=(
Expand Down
47 changes: 47 additions & 0 deletions examples/destructure.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
//! examples/destructure.rs

#![deny(unsafe_code)]
#![deny(warnings)]
#![no_main]
#![no_std]

use cortex_m_semihosting::hprintln;
use lm3s6965::Interrupt;
use panic_semihosting as _;

#[rtfm::app(device = lm3s6965)]
const APP: () = {
struct Resources {
// Some resources to work with
#[init(0)]
a: u32,
#[init(0)]
b: u32,
#[init(0)]
c: u32,
}

#[init]
fn init(_: init::Context) {
rtfm::pend(Interrupt::UART0);
rtfm::pend(Interrupt::UART1);
}

// Direct destructure
#[task(binds = UART0, resources = [a, b, c])]
fn uart0(cx: uart0::Context) {
let a = cx.resources.a;
let b = cx.resources.b;
let c = cx.resources.c;

hprintln!("UART0: a = {}, b = {}, c = {}", a, b, c).unwrap();
}

// De-structure-ing syntax
#[task(binds = UART1, resources = [a, b, c])]
fn uart1(cx: uart1::Context) {
let uart1::Resources { a, b, c } = cx.resources;

hprintln!("UART0: a = {}, b = {}, c = {}", a, b, c).unwrap();
}
};
18 changes: 3 additions & 15 deletions tests/single.rs
Original file line number Diff line number Diff line change
@@ -1,19 +1,7 @@
use std::path::PathBuf;

use compiletest_rs::{common::Mode, Config};
use trybuild::TestCases;

#[test]
fn ui() {
let mut config = Config::default();

config.mode = Mode::Ui;
config.src_base = PathBuf::from("ui/single");
config.target_rustcflags = Some(
"--edition=2018 -L target/debug/deps -Z unstable-options --extern rtfm --extern lm3s6965"
.to_owned(),
);
config.link_deps();
config.clean_rmeta();

compiletest_rs::run_tests(&config);
let t = TestCases::new();
t.compile_fail("ui/single/*.rs");
}
3 changes: 0 additions & 3 deletions ui/single/exception-invalid.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,3 @@ error: only exceptions with configurable priority can be used as hardware tasks
|
6 | fn nmi(_: nmi::Context) {}
| ^^^

error: aborting due to previous error

3 changes: 0 additions & 3 deletions ui/single/exception-systick-used.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,3 @@ error: this exception can't be used because it's being used by the runtime
|
6 | fn sys_tick(_: sys_tick::Context) {}
| ^^^^^^^^

error: aborting due to previous error

3 changes: 0 additions & 3 deletions ui/single/extern-interrupt-not-enough.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,3 @@ error: not enough `extern` interrupts to dispatch all software tasks (need: 1; g
|
6 | fn a(_: a::Context) {}
| ^

error: aborting due to previous error

3 changes: 0 additions & 3 deletions ui/single/extern-interrupt-used.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,3 @@ error: `extern` interrupts can't be used as hardware tasks
|
5 | #[task(binds = UART0)]
| ^^^^^

error: aborting due to previous error

8 changes: 6 additions & 2 deletions ui/single/locals-cfg.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ error[E0425]: cannot find value `FOO` in this scope
44 | FOO;
| ^^^ not found in this scope

error: aborting due to 5 previous errors
error: duplicate lang item in crate `panic_halt`: `panic_impl`.
|
= note: first defined in crate `std`.

For more information about this error, try `rustc --explain E0425`.
error: duplicate lang item in crate `panic_semihosting`: `panic_impl`.
|
= note: first defined in crate `panic_halt`.
4 changes: 0 additions & 4 deletions ui/single/resources-cfg.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,3 @@ error[E0609]: no field `o5` on type `uart1Resources<'_>`
| ^^ unknown field
|
= note: available fields are: `__marker__`

error: aborting due to 15 previous errors

For more information about this error, try `rustc --explain E0609`.
12 changes: 8 additions & 4 deletions ui/single/task-priority-too-high.stderr
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
warning: unused import: `rtfm::app`
--> $DIR/task-priority-too-high.rs:3:5
|
3 | use rtfm::app;
| ^^^^^^^^^
|
= note: #[warn(unused_imports)] on by default

error[E0080]: evaluation of constant value failed
--> $DIR/task-priority-too-high.rs:5:1
|
5 | #[rtfm::app(device = lm3s6965)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ attempt to subtract with overflow

error: aborting due to previous error

For more information about this error, try `rustc --explain E0080`.

0 comments on commit 85463ed

Please sign in to comment.