mirror of
https://github.com/embassy-rs/embassy.git
synced 2025-09-28 04:40:39 +00:00
225 lines
7.4 KiB
Rust
225 lines
7.4 KiB
Rust
#![doc = include_str!("../README.md")]
|
|
extern crate proc_macro;
|
|
|
|
use proc_macro::TokenStream;
|
|
|
|
mod macros;
|
|
mod util;
|
|
use macros::*;
|
|
|
|
/// Declares an async task that can be run by `embassy-executor`. The optional `pool_size` parameter can be used to specify how
|
|
/// many concurrent tasks can be spawned (default is 1) for the function.
|
|
///
|
|
///
|
|
/// The following restrictions apply:
|
|
///
|
|
/// * The function must be declared `async`.
|
|
/// * The function must not use generics.
|
|
/// * The optional `pool_size` attribute must be 1 or greater.
|
|
///
|
|
///
|
|
/// ## Examples
|
|
///
|
|
/// Declaring a task taking no arguments:
|
|
///
|
|
/// ``` rust
|
|
/// #[embassy_executor::task]
|
|
/// async fn mytask() {
|
|
/// // Function body
|
|
/// }
|
|
/// ```
|
|
///
|
|
/// Declaring a task with a given pool size:
|
|
///
|
|
/// ``` rust
|
|
/// #[embassy_executor::task(pool_size = 4)]
|
|
/// async fn mytask() {
|
|
/// // Function body
|
|
/// }
|
|
/// ```
|
|
#[proc_macro_attribute]
|
|
pub fn task(args: TokenStream, item: TokenStream) -> TokenStream {
|
|
task::run(args.into(), item.into()).into()
|
|
}
|
|
|
|
#[proc_macro_attribute]
|
|
pub fn main_avr(args: TokenStream, item: TokenStream) -> TokenStream {
|
|
main::run(args.into(), item.into(), &main::ARCH_AVR).into()
|
|
}
|
|
|
|
/// Creates a new `executor` instance and declares an application entry point for Cortex-M spawning the corresponding function body as an async task.
|
|
///
|
|
/// The following restrictions apply:
|
|
///
|
|
/// * The function must accept exactly 1 parameter, an `embassy_executor::Spawner` handle that it can use to spawn additional tasks.
|
|
/// * The function must be declared `async`.
|
|
/// * The function must not use generics.
|
|
/// * Only a single `main` task may be declared.
|
|
///
|
|
/// ## Examples
|
|
/// Spawning a task:
|
|
///
|
|
/// ``` rust
|
|
/// #[embassy_executor::main]
|
|
/// async fn main(_s: embassy_executor::Spawner) {
|
|
/// // Function body
|
|
/// }
|
|
/// ```
|
|
#[proc_macro_attribute]
|
|
pub fn main_cortex_m(args: TokenStream, item: TokenStream) -> TokenStream {
|
|
main::run(args.into(), item.into(), &main::ARCH_CORTEX_M).into()
|
|
}
|
|
|
|
/// Creates a new `executor` instance and declares an application entry point for Cortex-A/R
|
|
/// spawning the corresponding function body as an async task.
|
|
///
|
|
/// The following restrictions apply:
|
|
///
|
|
/// * The function must accept exactly 1 parameter, an `embassy_executor::Spawner` handle that it
|
|
/// can use to spawn additional tasks.
|
|
/// * The function must be declared `async`.
|
|
/// * The function must not use generics.
|
|
/// * Only a single `main` task may be declared.
|
|
///
|
|
/// ## Examples
|
|
/// Spawning a task:
|
|
///
|
|
/// ``` rust
|
|
/// #[embassy_executor::main]
|
|
/// async fn main(_s: embassy_executor::Spawner) {
|
|
/// // Function body
|
|
/// }
|
|
/// ```
|
|
#[proc_macro_attribute]
|
|
pub fn main_cortex_ar(args: TokenStream, item: TokenStream) -> TokenStream {
|
|
main::run(args.into(), item.into(), &main::ARCH_CORTEX_AR).into()
|
|
}
|
|
|
|
/// Creates a new `executor` instance and declares an architecture agnostic application entry point spawning
|
|
/// the corresponding function body as an async task.
|
|
///
|
|
/// The following restrictions apply:
|
|
///
|
|
/// * The function must accept exactly 1 parameter, an `embassy_executor::Spawner` handle that it can use to spawn additional tasks.
|
|
/// * The function must be declared `async`.
|
|
/// * The function must not use generics.
|
|
/// * Only a single `main` task may be declared.
|
|
///
|
|
/// A user-defined entry macro must provided via the `entry` argument
|
|
///
|
|
/// ## Examples
|
|
/// Spawning a task:
|
|
/// ``` rust
|
|
/// #[embassy_executor::main(entry = "qingke_rt::entry")]
|
|
/// async fn main(_s: embassy_executor::Spawner) {
|
|
/// // Function body
|
|
/// }
|
|
/// ```
|
|
#[proc_macro_attribute]
|
|
pub fn main_spin(args: TokenStream, item: TokenStream) -> TokenStream {
|
|
main::run(args.into(), item.into(), &main::ARCH_SPIN).into()
|
|
}
|
|
|
|
/// Creates a new `executor` instance and declares an application entry point for RISC-V spawning the corresponding function body as an async task.
|
|
///
|
|
/// The following restrictions apply:
|
|
///
|
|
/// * The function must accept exactly 1 parameter, an `embassy_executor::Spawner` handle that it can use to spawn additional tasks.
|
|
/// * The function must be declared `async`.
|
|
/// * The function must not use generics.
|
|
/// * Only a single `main` task may be declared.
|
|
///
|
|
/// A user-defined entry macro can be optionally provided via the `entry` argument to override the default of `riscv_rt::entry`.
|
|
///
|
|
/// ## Examples
|
|
/// Spawning a task:
|
|
///
|
|
/// ``` rust
|
|
/// #[embassy_executor::main]
|
|
/// async fn main(_s: embassy_executor::Spawner) {
|
|
/// // Function body
|
|
/// }
|
|
/// ```
|
|
///
|
|
/// Spawning a task using a custom entry macro:
|
|
/// ``` rust
|
|
/// #[embassy_executor::main(entry = "esp_riscv_rt::entry")]
|
|
/// async fn main(_s: embassy_executor::Spawner) {
|
|
/// // Function body
|
|
/// }
|
|
/// ```
|
|
#[proc_macro_attribute]
|
|
pub fn main_riscv(args: TokenStream, item: TokenStream) -> TokenStream {
|
|
main::run(args.into(), item.into(), &main::ARCH_RISCV).into()
|
|
}
|
|
|
|
/// Creates a new `executor` instance and declares an application entry point for STD spawning the corresponding function body as an async task.
|
|
///
|
|
/// The following restrictions apply:
|
|
///
|
|
/// * The function must accept exactly 1 parameter, an `embassy_executor::Spawner` handle that it can use to spawn additional tasks.
|
|
/// * The function must be declared `async`.
|
|
/// * The function must not use generics.
|
|
/// * Only a single `main` task may be declared.
|
|
///
|
|
/// ## Examples
|
|
/// Spawning a task:
|
|
///
|
|
/// ``` rust
|
|
/// #[embassy_executor::main]
|
|
/// async fn main(_s: embassy_executor::Spawner) {
|
|
/// // Function body
|
|
/// }
|
|
/// ```
|
|
#[proc_macro_attribute]
|
|
pub fn main_std(args: TokenStream, item: TokenStream) -> TokenStream {
|
|
main::run(args.into(), item.into(), &main::ARCH_STD).into()
|
|
}
|
|
|
|
/// Creates a new `executor` instance and declares an application entry point for WASM spawning the corresponding function body as an async task.
|
|
///
|
|
/// The following restrictions apply:
|
|
///
|
|
/// * The function must accept exactly 1 parameter, an `embassy_executor::Spawner` handle that it can use to spawn additional tasks.
|
|
/// * The function must be declared `async`.
|
|
/// * The function must not use generics.
|
|
/// * Only a single `main` task may be declared.
|
|
///
|
|
/// ## Examples
|
|
/// Spawning a task:
|
|
///
|
|
/// ``` rust
|
|
/// #[embassy_executor::main]
|
|
/// async fn main(_s: embassy_executor::Spawner) {
|
|
/// // Function body
|
|
/// }
|
|
/// ```
|
|
#[proc_macro_attribute]
|
|
pub fn main_wasm(args: TokenStream, item: TokenStream) -> TokenStream {
|
|
main::run(args.into(), item.into(), &main::ARCH_WASM).into()
|
|
}
|
|
|
|
/// Creates a new `executor` instance and declares an application entry point for an unspecified architecture, spawning the corresponding function body as an async task.
|
|
///
|
|
/// The following restrictions apply:
|
|
///
|
|
/// * The function must accept exactly 1 parameter, an `embassy_executor::Spawner` handle that it can use to spawn additional tasks.
|
|
/// * The function must be declared `async`.
|
|
/// * The function must not use generics.
|
|
/// * Only a single `main` task may be declared.
|
|
///
|
|
/// A user-defined entry macro and executor type must be provided via the `entry` and `executor` arguments of the `main` macro.
|
|
///
|
|
/// ## Examples
|
|
/// Spawning a task:
|
|
/// ``` rust
|
|
/// #[embassy_executor::main(entry = "your_hal::entry", executor = "your_hal::Executor")]
|
|
/// async fn main(_s: embassy_executor::Spawner) {
|
|
/// // Function body
|
|
/// }
|
|
/// ```
|
|
#[proc_macro_attribute]
|
|
pub fn main_unspecified(args: TokenStream, item: TokenStream) -> TokenStream {
|
|
main::run(args.into(), item.into(), &main::ARCH_UNSPECIFIED).into()
|
|
}
|