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 Feb 24, 2024
1 parent 4a23c8d commit b5b0370
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 4 deletions.
4 changes: 4 additions & 0 deletions rtic-macros/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ For each category, *Added*, *Changed*, *Fixed* add new entries at the top!

- Upgraded from syn 1.x to syn 2.x

### Fixed

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

## [v2.0.1] - 2023-07-25

### Added
Expand Down
11 changes: 7 additions & 4 deletions rtic-macros/src/codegen/async_dispatchers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,16 @@ 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 type_name = util::internal_task_ident(name, "F");
let exec_name = util::internal_task_ident(name, "EXEC");
let cfgs = &task.cfgs;

items.push(quote!(
#(#cfgs)*
#[allow(non_camel_case_types)]
type #type_name = impl core::future::Future;
#(#cfgs)*
#[allow(non_upper_case_globals)]
static #exec_name: rtic::export::executor::AsyncTaskExecutor<#type_name> =
rtic::export::executor::AsyncTaskExecutor::new();
Expand Down Expand Up @@ -50,11 +53,11 @@ pub fn codegen(app: &App, analysis: &Analysis) -> TokenStream2 {

for name in channel.tasks.iter() {
let exec_name = util::internal_task_ident(name, "EXEC");
// TODO: Fix cfg
// let task = &app.software_tasks[name];
// let cfgs = &task.cfgs;
let task = &app.software_tasks[name];
let cfgs = &task.cfgs;

stmts.push(quote!(
#(#cfgs)*
#exec_name.poll(|| {
#exec_name.set_pending();
#pend_interrupt
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
1 change: 1 addition & 0 deletions rtic/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ For each category, *Added*, *Changed*, *Fixed* add new entries at the top!

- **Soundness fix:** Monotonics did not wait long enough in `Duration` based delays.
This is not directly a change for `rtic`, but required bumping the minimal version of `rtic-monotonics`.
- Fixed `#[cfg]` tags on hardware and software tasks.

### Changed

Expand Down
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 b5b0370

Please sign in to comment.