## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# Message passing & capacity

Software tasks support message passing, this means that software tasks can be spawned with an argument: `foo::spawn(1)` which will run the task `foo` with the argument `1`.

Capacity sets the size of the spawn queue for the task, if not specified capacity defaults to 1.

In the example below, the capacity of task `foo` is `3`, allowing three simultaneous pending spawns of `foo`. Exceeding this capacity is an `Error`.

The number of arguments to a task is not limited:

    #![allow(unused)]
    fn main() {
    //! examples/message_passing.rs

    #![deny(unsafe_code)]
    #![deny(warnings)]
    #![deny(missing_docs)]
    #![no_main]
    #![no_std]

    use panic_semihosting as _;

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

        #[shared]
        struct Shared {}

        #[local]
        struct Local {}

        #[init]
        fn init(_: init::Context) -> (Shared, Local, init::Monotonics) {
            foo::spawn(1, 1).unwrap();
            foo::spawn(1, 2).unwrap();
            foo::spawn(2, 3).unwrap();
            assert!(foo::spawn(1, 4).is_err()); // The capacity of `foo` is reached

            (Shared {}, Local {}, init::Monotonics())
        }

        #[task(capacity = 3)]
        fn foo(_c: foo::Context, x: i32, y: u32) {
            hprintln!("foo {}, {}", x, y);
            if x == 2 {
                debug::exit(debug::EXIT_SUCCESS); // Exit QEMU simulator
            }
        }
    }
    }

    $ cargo run --target thumbv7m-none-eabi --example message_passing
    foo 1, 1
    foo 1, 2
    foo 2, 3