aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/resource-user-struct.rs60
-rw-r--r--macros/src/codegen.rs6
-rw-r--r--macros/src/lib.rs3
3 files changed, 68 insertions, 1 deletions
diff --git a/examples/resource-user-struct.rs b/examples/resource-user-struct.rs
new file mode 100644
index 00000000..132aa349
--- /dev/null
+++ b/examples/resource-user-struct.rs
@@ -0,0 +1,60 @@
+//! examples/resource.rs
+
+#![deny(unsafe_code)]
+#![deny(warnings)]
+#![no_main]
+#![no_std]
+
+use cortex_m_semihosting::{debug, hprintln};
+use lm3s6965::Interrupt;
+use panic_semihosting as _;
+
+#[rtic::app(device = lm3s6965)]
+mod app {
+ #[resources]
+ struct Resources {
+ // A resource
+ #[init(0)]
+ shared: u32,
+ }
+
+ // Should not collide with the struct above
+ struct Resources2 {
+ // A resource
+ shared: u32,
+ }
+
+ #[init]
+ fn init(_: init::Context) {
+ rtic::pend(Interrupt::UART0);
+ rtic::pend(Interrupt::UART1);
+ }
+
+ // `shared` cannot be accessed from this context
+ #[idle]
+ fn idle(_cx: idle::Context) -> ! {
+ debug::exit(debug::EXIT_SUCCESS);
+
+ // error: no `resources` field in `idle::Context`
+ // _cx.resources.shared += 1;
+
+ loop {}
+ }
+
+ // `shared` can be accessed from this context
+ #[task(binds = UART0, resources = [shared])]
+ fn uart0(cx: uart0::Context) {
+ let shared: &mut u32 = cx.resources.shared;
+ *shared += 1;
+
+ hprintln!("UART0: shared = {}", shared).unwrap();
+ }
+
+ // `shared` can be accessed from this context
+ #[task(binds = UART1, resources = [shared])]
+ fn uart1(cx: uart1::Context) {
+ *cx.resources.shared += 1;
+
+ hprintln!("UART1: shared = {}", cx.resources.shared).unwrap();
+ }
+}
diff --git a/macros/src/codegen.rs b/macros/src/codegen.rs
index e45f1a38..f97f841a 100644
--- a/macros/src/codegen.rs
+++ b/macros/src/codegen.rs
@@ -123,6 +123,7 @@ pub fn app(app: &App, analysis: &Analysis, extra: &Extra) -> TokenStream2 {
let const_app_schedule = schedule::codegen(app, extra);
let user_imports = app.user_imports.clone();
+ let user_code = app.user_code.clone();
let name = &app.name;
let device = extra.device;
quote!(
@@ -148,6 +149,11 @@ pub fn app(app: &App, analysis: &Analysis, extra: &Extra) -> TokenStream2 {
#(#imports)*
#(#user_imports)*
+ /// User code from within the module
+ #(#user_code)*
+ /// User code end
+
+
#(#user_hardware_tasks_imports)*
#(#user_software_tasks_imports)*
diff --git a/macros/src/lib.rs b/macros/src/lib.rs
index 2a439e1e..94e7eec6 100644
--- a/macros/src/lib.rs
+++ b/macros/src/lib.rs
@@ -35,7 +35,8 @@ mod tests;
///
/// The items allowed in the module block are specified below:
///
-/// # 1. `struct Resources`
+/// # 1. `#[resources]
+/// struct <resource-name>`
///
/// This structure contains the declaration of all the resources used by the application. Each field
/// in this structure corresponds to a different resource. Each resource may optionally be given an