* RMT: move configure_*x_channel to Channel impl
These methods are essentially (unsafe) constructors for Channel, so it
makes sense for them to be part of the Channel rather than free-standing
functions.
Importantly, this refactoring also reorders channel configuration and
creation of GenericPeripheralGuard. Note that it's still not guranteed
that the peripheral is clocked when configuring it, since code like the
following compiles:
```
let ch0_creator = {
let rmt = Rmt::new(peripherals.RMT, freq).unwrap();
rmt.channel0;
// Other fields of `rmt` are dropped, including the
// `Rmt.peripheral: RMT` field.
// Since not GenericPeripheralGuard has been created at this
// point, this will disable the peripheral's clock.
};
// This re-enables RMT clocks. With this commit, it does so before
// actually accessing RMT registers. However, the clock configuration that
// happens in Rmt::new() will have been lost!
// -> will be fixed in a later PR
let ch0 = ch0_creator.configure_tx(pin, config).unwrap();
```
There's no change to the API here.
* RMT: merge transmit_continuously{,with_loopcount}
...by introducing an extra loopcount argument.
Add the LoopCount enum such that the resulting code remains readable.
This is in preparation for adding more variants of rx/tx methods in
order to avoid combinatoric explosion.
* RMT: use stop_tx if available, only for esp32 fill buffer with end markers
note that stop_tx requires an update() call (according to TRMs and to IDF code)
for consistency, this also removes all update() calls from the low-level
methods in favor of explicit calls
this de-duplicates some update calls for start_tx()
* RMT: deduplicate ContinuousTxTransaction::{stop, stop_next}
* RMT: remove spurious ch_tx_thr_event access on Rx channel
for esp32 + esp32s2, which don't support the ch_rx_thr_event (this was
partially cleaned up in #3701 already, but this instance was overseen)
* RMT: assert!(...is_ok()) -> unwrap in HIL tests
* Clean up arch-specific task code
* Avoid a few redundant unwraps in run_scheduler
* Pass TaskPtr to alarm callback
* Ensure the radio runs on the scheduler's core
* clippy
* Add warnings
* Add priority to tasks
* Separate Mutex out of counting Semaphore
* Add priority inheritance to mutexes
* Test priority inheritance, fix issues
* Compare against the owner's current priority
* Use riscv-rt's startup code
* CHANGELOG.md
* Enable v-trap - get rid of one unused function
* Re-use riscv-rt's TrapFrame instead of keeping a copy of it
* fmt
* Update riscv-rt rev
* Enable defmt
* use riscv-rt's trap handling
* Compile on stable
* (Re)add the SP fixing code
* Move comment
* Update `riscv*` deps
* esp-riscv-rt: Remove the (unused) CI feature
* Add wait queue to semaphores
* Spawn idle task, prevent re-waking a ready task
* Add wait queues to queues
* Clean up wait queues
* Remove task from wait queue on timeout/resume
* Do not re-schedule deleted task
* Implement simple stack overflow detection
* Task deletion: remove task from queues in one place
* Fix storing context into freed memory
* Restore idle task stack size
* Undo alloc changes
* Don't let task sleep if wakeup time is in the past
* Improve codegen of esp_preempt_now
* Separate the alloc and run lists
* Replace circular task list with ready queue
* Remove separate SCHEDULER_STATE static
* Move scheduler to new file
* Reorganize, allow restarting scheduler
* Fix InternalMemory polyfill
* Use SingleShotTimer internally
* Implement a simple timer queue
* Extract run queue, wake tasks, store reason of scheduler event
* Add inherent function to get current task ptr
* Reimplement usleep with the timer queue
* Store current task in timer queue
* Sleep in timer queue task
* Remove ability to sleep arbitrary tasks
* More logging
* Clear timer interrupt in timer handler
* Even more logging
* Merge mutexes into semaphores
* Move adc channel from associated constant to function
* Move adc channel from associated constant to function
* Syntax cleanup
* RISCV and Format fixes
* FIx xtensa
---------
Co-authored-by: Juraj Sadel <juraj.sadel@espressif.com>
- Update example commands to use the new `--chip` argument format for `build examples` and `run example` subcommands.
- Improve clarity by showing explicit argument order and usage.
- Reflect recent changes in xtask interface for building and running examples.
Signed-off-by: Alexei Pastuchov <info@maximka.de>
* RMT: add HIL test that exercises all channels
to ensure that there are no issues with channel/register indexing; see
also the code comments.
no user-facing changes
* RMT: store ch_idx instead of channel number
`ConstChannelAccess` and `DynChannelAccess` used to store the channel number
and have a `Direction` generic parameter.
However, there are invalid combinations of `Direction` and the channel
number on some chips (e.g. on esp32c3, there is no channel with (Tx, 2),
because channel 2 and 3 only support Rx).
In constrast, the tuple `(Dir, ch_idx)` also uniquely identifies a
channel and its configuration, and any combination of it is valid as long as the
channel index is in bounds.
This makes it somewhat easier to work with; in particular, it will allow
removing bounds checks on ch_idx in a later commit by replacing
`ch_idx: u8` with an enum type.
This also refactors the `async_interrupt_handler` accordingly.
This is user-visible via the `ConstChannelAccess` type, however a later
commit in this PR will remove that entirely.
* RMT: elide bounds checks via ChannelIndex enum
If the channel index is not known at compile time in a given function,
the compiler will insert bounds checks on
- indexing the STATE global
- register access via the PAC
The compiler seems to be able to deduplicate them since low-level
functions are mostly inlined, but each function will retain at least one
bounds check.
This change helps the compiler to elide these checks by using a custom
type for channel indices that can only take values for which a channel
exists.
Specifically, this uses an enum to serve as a refinement of u8 to help
the compiler restrict value ranges. Due to inlining, this restricted
value range is propagated by the compiler until the potential bounds checks,
even if there's intermediate cast to u8,
cf. https://github.com/rust-lang/rust/issues/109958
There are no user-facing changes. (`ChannelIndex` is `pub` because it
appears in a `[doc(hidden)]` trait member.)
* RMT: always type-erase channels
- remove the `Raw` generic on `Channel`: This simplifies the types,
should have negligible performance impact (helped by elided bounds
checks via the recently introduced `ChannelIndex` enum), and greatly
reduce code size if several channels are used (by avoiding
monomorphization per channel)
- this also changed the arguments to configure_(tx,rx)_channel such that
they don't contain generics, again avoiding code bloat due to
monomorphization
This requires user code to change type annotations for channels and
transactions, and remove any manual type erasure (via `channel.degrade()`).
* RMT: impl blocking tx/rx methods directly on Channel
There's now only a single type that should implement these methods due
to erasing the channel index const generic, so the indirection via a
trait serves no purpose. Implementing methods directly on the channel
probably also helps to make the docs more discoverable.
This requires user code to remove the `TxChannel` and `RxChannel`
imports.
* RMT: impl async tx/rx methods directly on Channel
There's now only a single type that should implement these methods due
to erasing the channel index const generic, so the indirection via a
trait serves no purpose. Implementing methods directly on the channel
probably also helps to make the docs more discoverable.
This requires user code to remove the `TxChannelAsync` and `RxChannelAsync`
imports.
* RMT: impl *ChannelInternal traits only on DynChannelAccess
rather than as a blanket impl for RawChannelAccess, which includes
ConstChannelAccess: We don't intend to perform any accesses via
ConstChannelAccess anymore, so enforce that.
We could also get rid of the traits entirely and directly impl their
methods for DynChannelAccess, but it seems somewhat useful to keep them
around to guarantee that the interfaces in both chip_specific modules
are consistent.
There are no user-facing changes here.
* RMT: remove `pub` on various internal types
that used to be visible somewhere in the API's trait bounds, but are not
part of the API themselves
This is user-visible, but user code should not have used these types in
the first place.
* RMT: rm ConstChannelAccess, RawChannelAccess, private DynChannelAccess
now that Channel has no `Raw: RawChannelAccess` type parameter:
- we don't need low-level channel methods to be implemented for
ConstChannelAccess, since all accesses go through DynChannelAccess.
Thus, remove the *ChannelInternal traits and implement their methods directly
on DynChannelAccess
- none of these types need to be public (although one might consider
actually making them public with an unsafe constructor to provide an
unsafe low-level interface to the hardware)
This is user-visible (imports need to be removed; they're not used
anymore since the previous commit that always type-erased the `Raw`
parameter of `Channel`)
* RMT: changelog and migration guide for type-erased channels
* RMT: (review) remove stray comment
* RMT: (review) remove is_tx() from Direction trait
we can simply use the const item directly