Files
drivers/examples
Ayke van Laethem 9fdf0d657d delay: add new package for cycle-accurate delays
This is implemented in inline assembly using machine.CPUFrequency() to
know how long a single CPU cycle takes. As long as it is called with a
constant duration, it should be fully inlined and all values can be
const-propagated resulting in very tight inline assembly.

For example, when I convert i2csoft to use this delay function, the
entire delay function compiles to something like this:

    8784:   movs    r6, #100
    8786:   mov     r0, r6
    8788:   nop
    878a:   nop
    878c:   nop
    878e:   nop
    8790:   nop
    8792:   subs    r0, #1
    8794:   bne     0x8788

That means that all the math to calculate the number of cycles is
entirely optimized away (in this case, to 100 loops).

I ran the example on a few boards to see how well it works:

| board                 | 100ms wait | CPU core
|-----------------------|------------|------
| microbit              | 121.6ms    | Cortex-M0 so it has 12% overhead
| circuitplay-express   | 100.1ms    | Cortex-M0+ so it is cycle accurate
| pico                  | 100.2ms    | Cortex-M0+
| pyportal              | 100.3ms    | Cortex-M4
| circuitplay-bluefruit | 125.8ms    | Cortex-M4
| esp8266               | 125.1ms    |

This shows that there is some loop overhead because of conservative
estimates, but note that even though there may be a 25% overhead, the
actual overhead per `delay.Sleep()` call is very small. It should be
good enough for software I2C at least, and can potentially be improved
in the future.
2023-05-14 19:35:29 +02:00
..
2021-05-12 09:21:52 +02:00
2021-12-20 09:57:37 +01:00
2020-02-08 19:54:31 +01:00
2020-07-31 19:31:52 +02:00
2021-01-08 11:32:49 +01:00
2022-03-10 19:10:50 +01:00
2020-02-08 19:54:31 +01:00
2022-09-18 15:22:07 +02:00
2021-01-27 23:50:58 +01:00
2020-07-31 19:25:56 +02:00
2021-12-20 09:57:37 +01:00
2021-05-11 11:13:29 +02:00
2021-03-26 18:10:39 +01:00
2022-04-08 15:41:46 +02:00
2021-12-20 09:57:37 +01:00
2020-02-08 19:54:31 +01:00
2022-09-25 13:23:16 +02:00
2021-11-21 14:46:15 +01:00
2020-02-26 19:56:13 +01:00
2021-05-12 15:29:18 +02:00
2020-02-08 19:54:31 +01:00
2022-02-18 06:01:55 +01:00
2021-01-27 23:50:58 +01:00
2021-01-27 23:50:58 +01:00
2020-02-08 19:54:31 +01:00
2021-12-14 09:14:10 +09:00