Test program for AccurateWaiter
Dependencies: SerialStream AccurateWaiter
This test program shows how to use AccurateWaiter and demonstrates its performance.
Here's what it looks like running on a NUCLEO_F429ZI:
Diff: TestAccurateWaiter.cpp
- Revision:
- 0:df183df60d24
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TestAccurateWaiter.cpp Thu Nov 12 23:17:01 2020 -0800 @@ -0,0 +1,66 @@ +// +// Created by jamie on 11/12/2020. +// + +#include "AccurateWaiter.h" +#include "SerialStream.h" +#include <cinttypes> +#include <random> + +namespace chrono = std::chrono; + +BufferedSerial serial(USBTX, USBRX, 115200); +SerialStream<BufferedSerial> pc(serial); + +std::mt19937 randomGen; +std::uniform_int_distribution<uint64_t> distrib(0, 1e6); + +// Thread to perform a precise wait and print the results +void testWaiting() +{ + AccurateWaiter waiter; + + while(true) + { + // choose a random wait time + chrono::microseconds randomWaitTime(distrib(randomGen)); + + auto startTime = waiter.clock().now(); + waiter.wait_for(randomWaitTime); + auto endTime = waiter.clock().now(); + + uint64_t actualWaitTime = chrono::duration_cast<chrono::microseconds>(endTime - startTime).count(); + pc.printf("Expected time: %" PRIu64 " us, actual: %" PRIu64 " us, offset = %" PRIi64 "us\n", randomWaitTime.count(), actualWaitTime, + static_cast<int64_t>(actualWaitTime) - static_cast<int64_t>(randomWaitTime.count())); + } +} + +// infinite loop which is run at normal priority +void infiniteLoop() +{ + int workload; + while(true) + { + workload++; + } +} + +int main() +{ + // print info + pc.printf("---------------------------------------------\n"); + pc.printf(" Starting Accurate Waiter Test\n"); + pc.printf("---------------------------------------------\n"); + + pc.printf("us Ticker Resolution: %.02f us\n", 1e6f/us_ticker_get_info()->frequency); + + // start timing thread + Thread timingThread(osPriorityHigh); + timingThread.start(callback(testWaiting)); + + while(true) {} + + infiniteLoop(); + + return 0; +} \ No newline at end of file