Commit Graph

213 Commits

Author SHA1 Message Date
5e6ee59ecd Fix time calculation
Use unwrap_or_get to avoid checking time when not necessary
2021-10-20 14:36:16 +02:00
3c2daf0d32 Remove unused import 2021-10-20 14:36:16 +02:00
6c9420978b Prevent overflow in std timer driver
This prevents the std time driver from overflowing when setting the next
wakeup time. If an overflow occurs, default to sleeping up to 1 second.

Fixes #438
2021-10-20 14:36:16 +02:00
729b17bc25 Merge #428
428: executor: Use critical sections instead of atomic CAS loops r=lulf a=Dirbaio

Optimize executor wakes.

CAS loops (either `fetch_update`, or manual `load + compare_exchange_weak`) generate surprisingly horrible code: https://godbolt.org/z/zhscnM1cb

This switches to using critical sections, which makes it faster. On thumbv6 (Cortex-M0) it should make it even faster, as it is currently using `atomic-polyfill`, which will make many critical sections for each `compare_exchange_weak` anyway.

```
            opt-level=3   opt-level=s
   atmics:  105 cycles    101 cycles
       CS:   76 cycles     72 cycles
CS+inline:   72 cycles     64 cycles
```

Measured in nrf52 with icache disabled, with this code:

```rust


    poll_fn(|cx| {
        let task = unsafe { task_from_waker(cx.waker()) };

        compiler_fence(Ordering::SeqCst);
        let a = cortex_m::peripheral::DWT::get_cycle_count();
        compiler_fence(Ordering::SeqCst);

        unsafe { wake_task(task) }

        compiler_fence(Ordering::SeqCst);
        let b = cortex_m::peripheral::DWT::get_cycle_count();
        compiler_fence(Ordering::SeqCst);

        defmt::info!("cycles: {=u32}", b.wrapping_sub(a));

        Poll::Ready(())
    })
    .await;
````

Co-authored-by: Dario Nieuwenhuis <dirbaio@dirbaio.net>
2021-10-18 12:05:43 +00:00
a2e7c24e00 Clippy fixes 2021-10-18 01:05:29 +02:00
4c0fa03c14 interrupt: transmute instead of steal.
That steal method has a TAKEN=true write [here](6b013138b7/src/peripheral/mod.rs (L180)).
This is not zero cost, we don't want it. Transmute instead, which is zero cost.
2021-10-16 04:11:19 +02:00
d32477f5a1 executor: Inline enqueue fns 2021-10-16 01:50:10 +02:00
39e5677621 executor: Use critical sections instead of atomic CAS loops 2021-10-16 01:49:54 +02:00
a7c37d2ff4 Fix typo in RunQueue documentation 2021-10-11 13:55:05 +02:00
99a94f1d50 Update version of critical-section 2021-09-13 17:05:17 +02:00
e24528051b Add WASM support for executor
* Adds an executor for WASM runtimes based on wasm_bindgen.
* Add time driver based on JS time handling.
* Add example that can run in browser locally.
* Update to critical-section version that supports 'std' flag
2021-09-13 16:42:39 +02:00
70e5877d68 embassy/channel: switch to use MutexKind 2021-09-13 00:08:41 +02:00
5be5bdfd20 embassy/blocking_mutex: add MutexKind to allow writing code generic over mutex kinds. 2021-09-12 23:28:00 +02:00
e1f9dd1170 embassy/channel: remove unused receiver_consumed 2021-09-11 02:58:41 +02:00
b78f4695c4 embassy/channel: use heapless::Deque. 2021-09-11 02:49:16 +02:00
ead987245d embassy: Refactor module structure to remove kitchen-sink util. 2021-09-11 02:35:35 +02:00
f2623e7e9b Update lots of deps 2021-09-11 01:35:23 +02:00
11d2b0cdc1 Remove more unused features. 2021-09-03 17:13:54 +02:00
de016e8456 Remove trait_alias, allow(incomplete_features).
trait_alias seems unused. no idea why it's there.
2021-09-03 17:00:58 +02:00
5f04d6e6c5 Fix embassy::main macros for std target 2021-09-02 14:45:54 +02:00
297de612e5 Improve executor naming. Add docs. 2021-08-31 23:59:28 +02:00
c4b9c8ac87 std: fold into embassy core, add non-hacky time driver. 2021-08-25 21:06:27 +02:00
7c0990ad1e time: allow storing state inside the driver struct. 2021-08-25 21:06:27 +02:00
55b2d7b524 io: move std stuff to own module 2021-08-25 21:06:27 +02:00
503be49417 Document embassy::time 2021-08-25 21:06:27 +02:00
ae179d49af executor: improve module structure 2021-08-25 00:20:29 +02:00
7ca745a5c0 Refactor to allow defmt to intern strings. 2021-08-22 00:11:19 +01:00
4d3c07f71b Fix fmt 2021-08-21 22:38:02 +01:00
170121cdf6 Add defmt support for mpsc errors. 2021-08-21 22:36:23 +01:00
a3b56a3764 embassy-macros: Use defmt::unwrap! when spawning embassy::main
But only when `defmt` feature is enabled.
2021-08-05 22:40:12 +02:00
36402b5487 Merge pull request #348 from embassy-rs/remove-portal
Remove Portal. Fixes #32
2021-08-05 22:31:06 +02:00
b1240217bd Remove Portal. Fixes #32
Portal is very niche, I've only ever used it in `nrf-softdevice` and in a very particular case:
sending event raw-pointers across tasks but "synchronously", because the destination task must process
it now, so it's not deallocated. For most usecases, Signal or channels is enough.

It's unclear to me whether it can be made ub-free. It has problems with reentrancy. It's also not leak-safe, which is quite annoying.

So, remove it for now. We can always add it back later.
2021-08-05 22:24:03 +02:00
aaa0d1419c util: fix unsoundness when dropping ThreadModeMutex outside thread mode.
Fixes #283
2021-08-05 22:20:45 +02:00
0ea6a2d890 time: replace dyn clock/alarm with a global Driver trait 2021-08-05 19:14:09 +02:00
07d4b196f7 Update nightly, remove removed features. 2021-08-04 19:48:14 +02:00
250f1cd0a5 util: fix unused return warning 2021-08-04 19:38:05 +02:00
6043383008 Remove version pinning workaround. 2021-08-02 20:47:30 +02:00
f2c2ad06ca Use lifetime to ensure only a single future is created at a time 2021-08-02 12:42:06 +02:00
4d8d8e386f Make RecvFuture sync
RecvFuture always locks the underlying Channel when polled.
2021-08-02 11:18:59 +02:00
332bc44b8c Expose SendFuture and RecvFuture types
Having these types available makes it easier to store futures for later
use as the named types can be embedded in other types at compile time.
2021-08-02 10:45:50 +02:00
c8a48d726a Merge pull request #277 from Liamolucko/fix-peripheral-ub
extras: Fix UB in `Peripheral`
2021-07-29 13:08:30 +02:00
1b7ad7080e Add Send/Sync bounds to PeripheralState 2021-07-24 12:53:57 +10:00
72d6f79ec7 Feature no longer required given 1.55 2021-07-15 12:31:53 +10:00
3778f55d80 Provides a cleaner construction of the channel with the common "new" naming 2021-07-15 12:31:53 +10:00
6f78527aeb Partial borrow for receiver to enforce compile-time mpssc 2021-07-15 12:31:53 +10:00
076198a3b9 Small tidy up 2021-07-15 12:31:53 +10:00
d711e8a82c Eliminates unsoundness by using an UnsafeCell for sharing the channel 2021-07-15 12:31:53 +10:00
babee7f32a Tighten sender/receiver bounds 2021-07-15 12:31:53 +10:00
d86892ca56 Removed the closing state as it was not required 2021-07-15 12:31:53 +10:00
a247fa4f2c Explicitly drop non consumed items 2021-07-15 12:31:53 +10:00