Centralizing context switch logic in PendSV simplifies concurrency reasoning and enhances system performance by reducing register preservation overhead of all other exceptions.
Changing a Rust enum variant through a mutable reference can be achieved either by wrapping the variant attached variable inside `Option`, or better, by introducing an `Undef` variant in the enum.
Although `ArrayQueue` contains no explicit spin lock or mutex, its code structure forms a big spin lock and thus deadlock is possible.
SVC will be pended if a higher priority exception arrives during the stacking. If the priority of SVC is raised above the previously higher priority exception inside its handler, SVC will be activated immediately, nested above the current handler, which causes problems because the register context seen by the SVC handler is not system call arguments.
Read-modify-write on the `cr1` register of I²C may generate two consecutive start condition and hang the peripheral.
The Rust HAL Library `stm32f4xx-hal` failed to set the `LAST` bit in I²C `CR2` before initiating a DMA read. We tracked down the problem with a logic analyzer and identified the fix.
The I²C bus may be stuck busy after a software reset if the slave peripheral is holding the SDA line upon reset. Manually generating some clock pulses on the SCL line and sending a NACK on the SDA line will make the peripheral to release the SDA line, allowing normal operation.
STM32F4xx I²C can be stuck after start condition when the stop bit is set while the I²C bus is already idle.
Calling a Rust closure from assembly code involves erasing the type and converting everything into raw pointers before passing to the assembly code, and then reconstructing Rust objects from the raw pointers once control returns to Rust.
We show by example the generated symbols of C constructs and their attributes in each case. We also provide a Rust program for examining the symbols in an object file.