mirror of
https://github.com/rtic-rs/rtic.git
synced 2024-11-30 15:34:33 +01:00
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>
This commit is contained in:
commit
85463ed6c3
14 changed files with 80 additions and 45 deletions
|
@ -7,7 +7,4 @@ runner = "qemu-system-arm -cpu cortex-m3 -machine lm3s6965evb -nographic -semiho
|
||||||
[target.'cfg(all(target_arch = "arm", target_os = "none"))']
|
[target.'cfg(all(target_arch = "arm", target_os = "none"))']
|
||||||
rustflags = [
|
rustflags = [
|
||||||
"-C", "link-arg=-Tlink.x",
|
"-C", "link-arg=-Tlink.x",
|
||||||
]
|
]
|
||||||
|
|
||||||
[build]
|
|
||||||
target = "thumbv7m-none-eabi"
|
|
|
@ -18,8 +18,7 @@ matrix:
|
||||||
|
|
||||||
# compile-fail tests
|
# compile-fail tests
|
||||||
- env: TARGET=x86_64-unknown-linux-gnu
|
- env: TARGET=x86_64-unknown-linux-gnu
|
||||||
# FIXME revert this -- compiletest-rs v0.3.25 is broken with recent nightly
|
rust: nightly
|
||||||
rust: nightly-2019-10-31
|
|
||||||
if: (branch = staging OR branch = trying) OR (type = pull_request AND branch = master)
|
if: (branch = staging OR branch = trying) OR (type = pull_request AND branch = master)
|
||||||
|
|
||||||
# heterogeneous multi-core support
|
# heterogeneous multi-core support
|
||||||
|
|
|
@ -67,7 +67,7 @@ features = ["exit"]
|
||||||
version = "0.5.2"
|
version = "0.5.2"
|
||||||
|
|
||||||
[target.x86_64-unknown-linux-gnu.dev-dependencies]
|
[target.x86_64-unknown-linux-gnu.dev-dependencies]
|
||||||
compiletest_rs = "0.3.22"
|
trybuild = "1"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
heterogeneous = ["cortex-m-rtfm-macros/heterogeneous", "microamp"]
|
heterogeneous = ["cortex-m-rtfm-macros/heterogeneous", "microamp"]
|
||||||
|
|
|
@ -165,3 +165,12 @@ crate and print the output to the console.
|
||||||
$ # produces the same output as before
|
$ # produces the same output as before
|
||||||
$ cargo expand --example smallest | tail
|
$ 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}}
|
||||||
|
```
|
||||||
|
|
|
@ -37,10 +37,13 @@ main() {
|
||||||
mkdir -p ci/builds
|
mkdir -p ci/builds
|
||||||
|
|
||||||
if [ $T = x86_64-unknown-linux-gnu ]; then
|
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
|
# compile-fail tests
|
||||||
cargo test --test single --target $T
|
cargo test --test single --target $T
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $TRAVIS_RUST_VERSION = nightly ]; then
|
||||||
# multi-core compile-pass tests
|
# multi-core compile-pass tests
|
||||||
pushd heterogeneous
|
pushd heterogeneous
|
||||||
local exs=(
|
local exs=(
|
||||||
|
|
47
examples/destructure.rs
Normal file
47
examples/destructure.rs
Normal file
|
@ -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();
|
||||||
|
}
|
||||||
|
};
|
|
@ -1,19 +1,7 @@
|
||||||
use std::path::PathBuf;
|
use trybuild::TestCases;
|
||||||
|
|
||||||
use compiletest_rs::{common::Mode, Config};
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn ui() {
|
fn ui() {
|
||||||
let mut config = Config::default();
|
let t = TestCases::new();
|
||||||
|
t.compile_fail("ui/single/*.rs");
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,3 @@ error: only exceptions with configurable priority can be used as hardware tasks
|
||||||
|
|
|
|
||||||
6 | fn nmi(_: nmi::Context) {}
|
6 | fn nmi(_: nmi::Context) {}
|
||||||
| ^^^
|
| ^^^
|
||||||
|
|
||||||
error: aborting due to previous error
|
|
||||||
|
|
||||||
|
|
|
@ -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) {}
|
6 | fn sys_tick(_: sys_tick::Context) {}
|
||||||
| ^^^^^^^^
|
| ^^^^^^^^
|
||||||
|
|
||||||
error: aborting due to previous error
|
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,3 @@ error: not enough `extern` interrupts to dispatch all software tasks (need: 1; g
|
||||||
|
|
|
|
||||||
6 | fn a(_: a::Context) {}
|
6 | fn a(_: a::Context) {}
|
||||||
| ^
|
| ^
|
||||||
|
|
||||||
error: aborting due to previous error
|
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,3 @@ error: `extern` interrupts can't be used as hardware tasks
|
||||||
|
|
|
|
||||||
5 | #[task(binds = UART0)]
|
5 | #[task(binds = UART0)]
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
|
|
||||||
error: aborting due to previous error
|
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,10 @@ error[E0425]: cannot find value `FOO` in this scope
|
||||||
44 | FOO;
|
44 | FOO;
|
||||||
| ^^^ not found in this scope
|
| ^^^ 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`.
|
||||||
|
|
|
@ -117,7 +117,3 @@ error[E0609]: no field `o5` on type `uart1Resources<'_>`
|
||||||
| ^^ unknown field
|
| ^^ unknown field
|
||||||
|
|
|
|
||||||
= note: available fields are: `__marker__`
|
= note: available fields are: `__marker__`
|
||||||
|
|
||||||
error: aborting due to 15 previous errors
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0609`.
|
|
||||||
|
|
|
@ -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
|
error[E0080]: evaluation of constant value failed
|
||||||
--> $DIR/task-priority-too-high.rs:5:1
|
--> $DIR/task-priority-too-high.rs:5:1
|
||||||
|
|
|
|
||||||
5 | #[rtfm::app(device = lm3s6965)]
|
5 | #[rtfm::app(device = lm3s6965)]
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ attempt to subtract with overflow
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ attempt to subtract with overflow
|
||||||
|
|
||||||
error: aborting due to previous error
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0080`.
|
|
||||||
|
|
Loading…
Reference in a new issue