diff options
| -rw-r--r-- | ci/expected/binds.run | 4 | ||||
| -rw-r--r-- | ci/script.sh | 1 | ||||
| -rw-r--r-- | examples/binds.rs | 48 | ||||
| -rw-r--r-- | macros/src/codegen.rs | 4 |
4 files changed, 55 insertions, 2 deletions
diff --git a/ci/expected/binds.run b/ci/expected/binds.run new file mode 100644 index 0000000..f84cff0 --- /dev/null +++ b/ci/expected/binds.run @@ -0,0 +1,4 @@ +init +foo called 1 time +idle +foo called 2 times diff --git a/ci/script.sh b/ci/script.sh index 5cc79fb..7cda1e5 100644 --- a/ci/script.sh +++ b/ci/script.sh @@ -93,6 +93,7 @@ main() { idle init interrupt + binds resource lock diff --git a/examples/binds.rs b/examples/binds.rs new file mode 100644 index 0000000..a8b386f --- /dev/null +++ b/examples/binds.rs @@ -0,0 +1,48 @@ +//! examples/binds.rs + +#![deny(unsafe_code)] +#![deny(warnings)] +#![no_main] +#![no_std] + +extern crate panic_semihosting; + +use cortex_m_semihosting::{debug, hprintln}; +use lm3s6965::Interrupt; +use rtfm::app; + +// `examples/interrupt.rs` rewritten to use `binds` +#[app(device = lm3s6965)] +const APP: () = { + #[init] + fn init() { + rtfm::pend(Interrupt::UART0); + + hprintln!("init").unwrap(); + } + + #[idle] + fn idle() -> ! { + hprintln!("idle").unwrap(); + + rtfm::pend(Interrupt::UART0); + + debug::exit(debug::EXIT_SUCCESS); + + loop {} + } + + #[interrupt(binds = UART0)] + fn foo() { + static mut TIMES: u32 = 0; + + *TIMES += 1; + + hprintln!( + "foo called {} time{}", + *TIMES, + if *TIMES > 1 { "s" } else { "" } + ) + .unwrap(); + } +}; diff --git a/macros/src/codegen.rs b/macros/src/codegen.rs index 117bce8..0e25e8a 100644 --- a/macros/src/codegen.rs +++ b/macros/src/codegen.rs @@ -1128,7 +1128,7 @@ fn exceptions(ctxt: &mut Context, app: &App, analysis: &Analysis) -> Vec<proc_ma }; let locals = mk_locals(&exception.statics, false); - let symbol = ident.to_string(); + let symbol = exception.args.binds.as_ref().unwrap_or(ident).to_string(); let alias = ctxt.ident_gen.mk_ident(None, false); let unsafety = &exception.unsafety; quote!( @@ -1214,7 +1214,7 @@ fn interrupts( let locals = mk_locals(&interrupt.statics, false); let alias = ctxt.ident_gen.mk_ident(None, false); - let symbol = ident.to_string(); + let symbol = interrupt.args.binds.as_ref().unwrap_or(ident).to_string(); let unsafety = &interrupt.unsafety; scoped.push(quote!( // unsafe trampoline to deter end-users from calling this non-reentrant function |
