aboutsummaryrefslogtreecommitdiff
path: root/tests/rp/src/bin/float.rs
diff options
context:
space:
mode:
authorpennae <[email protected]>2023-04-19 01:57:37 +0200
committerpennae <[email protected]>2023-04-19 23:04:47 +0200
commitfdd6e08ed6b5445a53c8cd0752f80f203c4860ac (patch)
tree9b997c5db2d55c911a6fd4cfdce38141e372b762 /tests/rp/src/bin/float.rs
parenta673b9aa294a55c441f3f61c48481484629b4347 (diff)
rp: hook up softfloat rom intrinsics
rp-hal has done this very well already, so we'll just copy their entire impl again. only div.rs needed some massaging because our sio access works a little differently, everything else worked as is.
Diffstat (limited to 'tests/rp/src/bin/float.rs')
-rw-r--r--tests/rp/src/bin/float.rs53
1 files changed, 53 insertions, 0 deletions
diff --git a/tests/rp/src/bin/float.rs b/tests/rp/src/bin/float.rs
new file mode 100644
index 000000000..6715271e6
--- /dev/null
+++ b/tests/rp/src/bin/float.rs
@@ -0,0 +1,53 @@
1#![no_std]
2#![no_main]
3#![feature(type_alias_impl_trait)]
4
5use defmt::*;
6use embassy_executor::Spawner;
7use embassy_rp::pac;
8use embassy_time::{Duration, Timer};
9use {defmt_rtt as _, panic_probe as _};
10
11#[embassy_executor::main]
12async fn main(_spawner: Spawner) {
13 embassy_rp::init(Default::default());
14 info!("Hello World!");
15
16 const PI_F: f32 = 3.1415926535f32;
17 const PI_D: f64 = 3.14159265358979323846f64;
18
19 unsafe {
20 pac::BUSCTRL
21 .perfsel(0)
22 .write(|r| r.set_perfsel(pac::busctrl::vals::Perfsel::ROM));
23 }
24
25 for i in 0..=360 {
26 let rad_f = (i as f32) * PI_F / 180.0;
27 info!(
28 "{}° float: {=f32} / {=f32} / {=f32} / {=f32}",
29 i,
30 rad_f,
31 rad_f - PI_F,
32 rad_f + PI_F,
33 rad_f % PI_F
34 );
35 let rad_d = (i as f64) * PI_D / 180.0;
36 info!(
37 "{}° double: {=f64} / {=f64} / {=f64} / {=f64}",
38 i,
39 rad_d,
40 rad_d - PI_D,
41 rad_d + PI_D,
42 rad_d % PI_D
43 );
44 Timer::after(Duration::from_millis(10)).await;
45 }
46
47 let rom_accesses = unsafe { pac::BUSCTRL.perfctr(0).read().perfctr() };
48 // every float operation used here uses at least 10 cycles
49 defmt::assert!(rom_accesses >= 360 * 12 * 10);
50
51 info!("Test OK");
52 cortex_m::asm::bkpt();
53}