Skip to content

Commit

Permalink
rtic-macros: fix #[cfg] for hardware and software tasks
Browse files Browse the repository at this point in the history
Disabling hardware and software tasks via `#[cfg]` flags was broken.
Added test case to verify, and fixed codegen to output missing cfgs.
  • Loading branch information
dalegaard committed Mar 18, 2024
1 parent 22ac33a commit afd506f
Show file tree
Hide file tree
Showing 7 changed files with 60 additions and 8 deletions.
4 changes: 4 additions & 0 deletions rtic-macros/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ For each category, *Added*, *Changed*, *Fixed* add new entries at the top!

## [Unreleased]

### Fixed

- Fixed `#[cfg]` tags on hardware and software tasks.

## [v2.1.0] - 2024-02-27

### Added
Expand Down
12 changes: 7 additions & 5 deletions rtic-macros/src/codegen/async_dispatchers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,12 @@ pub fn codegen(app: &App, analysis: &Analysis) -> TokenStream2 {
let interrupts = &analysis.interrupts;

// Generate executor definition and priority in global scope
for (name, _) in app.software_tasks.iter() {
for (name, task) in app.software_tasks.iter() {
let exec_name = util::internal_task_ident(name, "EXEC");
let cfgs = &task.cfgs;

items.push(quote!(
#(#cfgs)*
#[allow(non_upper_case_globals)]
static #exec_name: rtic::export::executor::AsyncTaskExecutorPtr =
rtic::export::executor::AsyncTaskExecutorPtr::new();
Expand Down Expand Up @@ -47,15 +49,15 @@ pub fn codegen(app: &App, analysis: &Analysis) -> TokenStream2 {

for name in channel.tasks.iter() {
let exec_name = util::internal_task_ident(name, "EXEC");
let task = &app.software_tasks[name];
let cfgs = &task.cfgs;
let from_ptr_n_args =
util::from_ptr_n_args_ident(app.software_tasks[name].inputs.len());

// TODO: Fix cfg
// let task = &app.software_tasks[name];
// let cfgs = &task.cfgs;

stmts.push(quote!(
#(#cfgs)*
let exec = rtic::export::executor::AsyncTaskExecutor::#from_ptr_n_args(#name, &#exec_name);
#(#cfgs)*
exec.poll(|| {
let exec = rtic::export::executor::AsyncTaskExecutor::#from_ptr_n_args(#name, &#exec_name);
exec.set_pending();
Expand Down
2 changes: 2 additions & 0 deletions rtic-macros/src/codegen/hardware_tasks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,12 @@ pub fn codegen(app: &App, analysis: &Analysis) -> TokenStream2 {

if !task.is_extern {
let attrs = &task.attrs;
let cfgs = &task.cfgs;
let context = &task.context;
let stmts = &task.stmts;
user_tasks.push(quote!(
#(#attrs)*
#(#cfgs)*
#[allow(non_snake_case)]
fn #name(#context: #name::Context) {
use rtic::Mutex as _;
Expand Down
11 changes: 8 additions & 3 deletions rtic-macros/src/codegen/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,19 @@ pub fn codegen(app: &App, analysis: &Analysis) -> TokenStream2 {

let mut executor_allocations = Vec::new();

for (name, _) in app.software_tasks.iter() {
for (name, task) in app.software_tasks.iter() {
let exec_name = util::internal_task_ident(name, "EXEC");
let new_n_args = util::new_n_args_ident(app.software_tasks[name].inputs.len());
let cfgs = &task.cfgs;

executor_allocations.push(quote!(
#(#cfgs)*
let executor = ::core::mem::ManuallyDrop::new(rtic::export::executor::AsyncTaskExecutor::#new_n_args(#name));
executors_size += ::core::mem::size_of_val(&executor);
#exec_name.set_in_main(&executor);
#(#cfgs)*
{
executors_size += ::core::mem::size_of_val(&executor);
#exec_name.set_in_main(&executor);
}
));
}

Expand Down
4 changes: 4 additions & 0 deletions rtic/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ For each category, *Added*, *Changed*, *Fixed* add new entries at the top!

## [Unreleased]

### Fixed

- Fixed `#[cfg]` tags on hardware and software tasks.

## [v2.1.1] - 2024-03-13

### Fixed
Expand Down
Empty file.
35 changes: 35 additions & 0 deletions rtic/examples/t-cfg-tasks.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
//! [compile-pass] check that `#[cfg]` attributes applied on tasks work
#![no_main]
#![no_std]
#![deny(warnings)]
#![deny(unsafe_code)]
#![deny(missing_docs)]

use panic_semihosting as _;

#[rtic::app(device = lm3s6965, dispatchers = [SSI0])]
mod app {
use cortex_m_semihosting::debug;

#[shared]
struct Shared {}

#[local]
struct Local {}

#[init]
fn init(_: init::Context) -> (Shared, Local) {
debug::exit(debug::EXIT_SUCCESS); // Exit QEMU simulator

(Shared {}, Local {})
}

#[cfg(feature = "feature_x")]
#[task]
async fn opt_sw_task(cx: opt_sw_task::Context) {}

#[cfg(feature = "feature_x")]
#[task(binds = UART0)]
fn opt_hw_task(cx: opt_hw_task::Context) {}
}

0 comments on commit afd506f

Please sign in to comment.