| 82 | }; |
| 83 | |
| 84 | inline LowMemPinTogglePeriodStats computeLowMemPeriodStats( |
| 85 | const fl::EdgeTime* edges, fl::size edge_count) FL_NOEXCEPT { |
| 86 | LowMemPinTogglePeriodStats s{0, 0, 0, 0, 0}; |
| 87 | fl::u64 sum = 0; |
| 88 | fl::u64 sum_sq = 0; |
| 89 | fl::u32 min_ns = 0xFFFFFFFFu; |
| 90 | fl::u32 max_ns = 0; |
| 91 | fl::u32 count = 0; |
| 92 | for (fl::size i = 0; i + 1 < edge_count; i += 2) { |
| 93 | const fl::u32 period_ns = |
| 94 | static_cast<fl::u32>(edges[i].ns) + |
| 95 | static_cast<fl::u32>(edges[i + 1].ns); |
| 96 | if (period_ns == 0) continue; |
| 97 | sum += period_ns; |
| 98 | sum_sq += static_cast<fl::u64>(period_ns) * static_cast<fl::u64>(period_ns); |
| 99 | if (period_ns < min_ns) min_ns = period_ns; |
| 100 | if (period_ns > max_ns) max_ns = period_ns; |
| 101 | ++count; |
| 102 | } |
| 103 | if (count == 0) return s; |
| 104 | const fl::u32 mean = static_cast<fl::u32>(sum / static_cast<fl::u64>(count)); |
| 105 | const fl::u64 mean64 = static_cast<fl::u64>(mean); |
| 106 | const fl::u64 var = (sum_sq / static_cast<fl::u64>(count)) - (mean64 * mean64); |
| 107 | fl::u32 sig = 0; |
| 108 | while (static_cast<fl::u64>(sig + 1) * static_cast<fl::u64>(sig + 1) <= var) ++sig; |
| 109 | s.periods = count; |
| 110 | s.mean_ns = mean; |
| 111 | s.sigma_ns = sig; |
| 112 | s.min_ns = (min_ns == 0xFFFFFFFFu) ? 0u : min_ns; |
| 113 | s.max_ns = max_ns; |
| 114 | return s; |
| 115 | } |
| 116 | #endif // FL_IS_ARM_LPC |
| 117 | |
| 118 | } // namespace |
no outgoing calls
no test coverage detected