RP2040 Low Low-level hardware-divider API. Non-RP2040 platforms provide software versions of all the functions.
More...
|
| static divmod_result_t | hw_divider_divmod_s32 (int32_t a, int32_t b) |
| | Do a signed HW divide and wait for result.
|
| static divmod_result_t | hw_divider_divmod_u32 (uint32_t a, uint32_t b) |
| | Do an unsigned HW divide and wait for result.
|
| static void | hw_divider_divmod_s32_start (int32_t a, int32_t b) |
| | Start a signed asynchronous divide.
|
| static void | hw_divider_divmod_u32_start (uint32_t a, uint32_t b) |
| | Start an unsigned asynchronous divide.
|
| static void | hw_divider_wait_ready (void) |
| | Wait for a divide to complete.
|
| static divmod_result_t | hw_divider_result_nowait (void) |
| | Return result of HW divide, nowait.
|
| static divmod_result_t | hw_divider_result_wait (void) |
| | Return result of last asynchronous HW divide.
|
| static uint32_t | to_quotient_u32 (divmod_result_t r) |
| | Efficient extraction of unsigned quotient from 32p32 fixed point.
|
| static int32_t | to_quotient_s32 (divmod_result_t r) |
| | Efficient extraction of signed quotient from 32p32 fixed point.
|
| static uint32_t | to_remainder_u32 (divmod_result_t r) |
| | Efficient extraction of unsigned remainder from 32p32 fixed point.
|
| static int32_t | to_remainder_s32 (divmod_result_t r) |
| | Efficient extraction of signed remainder from 32p32 fixed point.
|
| static uint32_t | hw_divider_u32_quotient_wait (void) |
| | Return result of last asynchronous HW divide, unsigned quotient only.
|
| static int32_t | hw_divider_s32_quotient_wait (void) |
| | Return result of last asynchronous HW divide, signed quotient only.
|
| static uint32_t | hw_divider_u32_remainder_wait (void) |
| | Return result of last asynchronous HW divide, unsigned remainder only.
|
| static int32_t | hw_divider_s32_remainder_wait (void) |
| | Return result of last asynchronous HW divide, signed remainder only.
|
| static uint32_t | hw_divider_u32_quotient (uint32_t a, uint32_t b) |
| | Do an unsigned HW divide, wait for result, return quotient.
|
| static uint32_t | hw_divider_u32_remainder (uint32_t a, uint32_t b) |
| | Do an unsigned HW divide, wait for result, return remainder.
|
| static int32_t | hw_divider_quotient_s32 (int32_t a, int32_t b) |
| | Do a signed HW divide, wait for result, return quotient.
|
| static int32_t | hw_divider_remainder_s32 (int32_t a, int32_t b) |
| | Do a signed HW divide, wait for result, return remainder.
|
|
static void | hw_divider_pause (void) |
| | Pause for exact amount of time needed for a asynchronous divide to complete.
|
| static uint32_t | hw_divider_u32_quotient_inlined (uint32_t a, uint32_t b) |
| | Do a hardware unsigned HW divide, wait for result, return quotient.
|
| static uint32_t | hw_divider_u32_remainder_inlined (uint32_t a, uint32_t b) |
| | Do a hardware unsigned HW divide, wait for result, return remainder.
|
| static int32_t | hw_divider_s32_quotient_inlined (int32_t a, int32_t b) |
| | Do a hardware signed HW divide, wait for result, return quotient.
|
| static int32_t | hw_divider_s32_remainder_inlined (int32_t a, int32_t b) |
| | Do a hardware signed HW divide, wait for result, return remainder.
|
| static void | hw_divider_save_state (hw_divider_state_t *dest) |
| | Save the calling cores hardware divider state.
|
| static void | hw_divider_restore_state (hw_divider_state_t *src) |
| | Load a saved hardware divider state into the current core's hardware divider.
|
RP2040 Low Low-level hardware-divider API. Non-RP2040 platforms provide software versions of all the functions.
The SIO contains an 8-cycle signed/unsigned divide/modulo circuit, per core. Calculation is started by writing a dividend and divisor to the two argument registers, DIVIDEND and DIVISOR. The divider calculates the quotient / and remainder % of this division over the next 8 cycles, and on the 9th cycle the results can be read from the two result registers DIV_QUOTIENT and DIV_REMAINDER. A 'ready' bit in register DIV_CSR can be polled to wait for the calculation to complete, or software can insert a fixed 8-cycle delay
This header provides low level macros and inline functions for accessing the hardware dividers directly, and perhaps most usefully performing asynchronous divides. These functions however do not follow the regular SDK conventions for saving/restoring the divider state, so are not generally safe to call from interrupt handlers
The pico_divider library provides a more user friendly set of APIs over the divider (and support for 64 bit divides), and of course by default regular C language integer divisions are redirected through that library, meaning you can just use C level / and % operators and gain the benefits of the fast hardware divider.
On RP2350 there is no hardware divider, and the functions are implemented in software
- See also
- pico_divider
Example
int main() {
printf("Hello, divider!\n");
int32_t dividend = 123456;
int32_t divisor = -321;
printf("Working backwards! Result %d should equal %d!\n\n",
int32_t udividend = 123456;
int32_t udivisor = 321;
printf("Working backwards! Result %d should equal %d!\n\n",
printf(
"Async result %d/%d = %d remainder %d\n", dividend, divisor,
to_quotient_s32(result),
printf("%d / %d = (by operator %d) (inlined %d)\n", dividend, divisor,
printf("outer divide %d / %d = %d\n", dividend, divisor, tmp);
return 0;
}
static uint32_t to_quotient_u32(divmod_result_t r)
Efficient extraction of unsigned quotient from 32p32 fixed point.
Definition divider.h:198
static int32_t hw_divider_s32_quotient_inlined(int32_t a, int32_t b)
Do a hardware signed HW divide, wait for result, return quotient.
Definition divider.h:440
static void hw_divider_divmod_s32_start(int32_t a, int32_t b)
Start a signed asynchronous divide.
Definition divider.h:107
static int32_t to_quotient_s32(divmod_result_t r)
Efficient extraction of signed quotient from 32p32 fixed point.
Definition divider.h:208
static int32_t to_remainder_s32(divmod_result_t r)
Efficient extraction of signed remainder from 32p32 fixed point.
Definition divider.h:232
static divmod_result_t hw_divider_divmod_s32(int32_t a, int32_t b)
Do a signed HW divide and wait for result.
Definition divider.h:74
static void hw_divider_restore_state(hw_divider_state_t *src)
Load a saved hardware divider state into the current core's hardware divider.
Definition divider.h:512
static int32_t hw_divider_s32_quotient_wait(void)
Return result of last asynchronous HW divide, signed quotient only.
Definition divider.h:260
static void hw_divider_save_state(hw_divider_state_t *dest)
Save the calling cores hardware divider state.
Definition divider.h:497
static divmod_result_t hw_divider_result_wait(void)
Return result of last asynchronous HW divide.
Definition divider.h:187
static divmod_result_t hw_divider_divmod_u32(uint32_t a, uint32_t b)
Do an unsigned HW divide and wait for result.
Definition divider.h:92
uint64_t hw_divider_state_t
Saved hardware divider state.
Definition divider.h:482
static uint32_t to_remainder_u32(divmod_result_t r)
Efficient extraction of unsigned remainder from 32p32 fixed point.
Definition divider.h:220
bool stdio_init_all(void)
Initialize all of the present standard stdio types that are linked into the binary.
Definition stdio.c:207