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: https://app.box.com/shared/static/a7vuulqeqodh7pn5skgvniwo0b4h3pmj.png

Committer:
Jamie Smith
Date:
Thu Nov 12 23:17:01 2020 -0800
Revision:
0:df183df60d24
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jamie Smith 0:df183df60d24 1 //
Jamie Smith 0:df183df60d24 2 // Created by jamie on 11/12/2020.
Jamie Smith 0:df183df60d24 3 //
Jamie Smith 0:df183df60d24 4
Jamie Smith 0:df183df60d24 5 #include "AccurateWaiter.h"
Jamie Smith 0:df183df60d24 6 #include "SerialStream.h"
Jamie Smith 0:df183df60d24 7 #include <cinttypes>
Jamie Smith 0:df183df60d24 8 #include <random>
Jamie Smith 0:df183df60d24 9
Jamie Smith 0:df183df60d24 10 namespace chrono = std::chrono;
Jamie Smith 0:df183df60d24 11
Jamie Smith 0:df183df60d24 12 BufferedSerial serial(USBTX, USBRX, 115200);
Jamie Smith 0:df183df60d24 13 SerialStream<BufferedSerial> pc(serial);
Jamie Smith 0:df183df60d24 14
Jamie Smith 0:df183df60d24 15 std::mt19937 randomGen;
Jamie Smith 0:df183df60d24 16 std::uniform_int_distribution<uint64_t> distrib(0, 1e6);
Jamie Smith 0:df183df60d24 17
Jamie Smith 0:df183df60d24 18 // Thread to perform a precise wait and print the results
Jamie Smith 0:df183df60d24 19 void testWaiting()
Jamie Smith 0:df183df60d24 20 {
Jamie Smith 0:df183df60d24 21 AccurateWaiter waiter;
Jamie Smith 0:df183df60d24 22
Jamie Smith 0:df183df60d24 23 while(true)
Jamie Smith 0:df183df60d24 24 {
Jamie Smith 0:df183df60d24 25 // choose a random wait time
Jamie Smith 0:df183df60d24 26 chrono::microseconds randomWaitTime(distrib(randomGen));
Jamie Smith 0:df183df60d24 27
Jamie Smith 0:df183df60d24 28 auto startTime = waiter.clock().now();
Jamie Smith 0:df183df60d24 29 waiter.wait_for(randomWaitTime);
Jamie Smith 0:df183df60d24 30 auto endTime = waiter.clock().now();
Jamie Smith 0:df183df60d24 31
Jamie Smith 0:df183df60d24 32 uint64_t actualWaitTime = chrono::duration_cast<chrono::microseconds>(endTime - startTime).count();
Jamie Smith 0:df183df60d24 33 pc.printf("Expected time: %" PRIu64 " us, actual: %" PRIu64 " us, offset = %" PRIi64 "us\n", randomWaitTime.count(), actualWaitTime,
Jamie Smith 0:df183df60d24 34 static_cast<int64_t>(actualWaitTime) - static_cast<int64_t>(randomWaitTime.count()));
Jamie Smith 0:df183df60d24 35 }
Jamie Smith 0:df183df60d24 36 }
Jamie Smith 0:df183df60d24 37
Jamie Smith 0:df183df60d24 38 // infinite loop which is run at normal priority
Jamie Smith 0:df183df60d24 39 void infiniteLoop()
Jamie Smith 0:df183df60d24 40 {
Jamie Smith 0:df183df60d24 41 int workload;
Jamie Smith 0:df183df60d24 42 while(true)
Jamie Smith 0:df183df60d24 43 {
Jamie Smith 0:df183df60d24 44 workload++;
Jamie Smith 0:df183df60d24 45 }
Jamie Smith 0:df183df60d24 46 }
Jamie Smith 0:df183df60d24 47
Jamie Smith 0:df183df60d24 48 int main()
Jamie Smith 0:df183df60d24 49 {
Jamie Smith 0:df183df60d24 50 // print info
Jamie Smith 0:df183df60d24 51 pc.printf("---------------------------------------------\n");
Jamie Smith 0:df183df60d24 52 pc.printf(" Starting Accurate Waiter Test\n");
Jamie Smith 0:df183df60d24 53 pc.printf("---------------------------------------------\n");
Jamie Smith 0:df183df60d24 54
Jamie Smith 0:df183df60d24 55 pc.printf("us Ticker Resolution: %.02f us\n", 1e6f/us_ticker_get_info()->frequency);
Jamie Smith 0:df183df60d24 56
Jamie Smith 0:df183df60d24 57 // start timing thread
Jamie Smith 0:df183df60d24 58 Thread timingThread(osPriorityHigh);
Jamie Smith 0:df183df60d24 59 timingThread.start(callback(testWaiting));
Jamie Smith 0:df183df60d24 60
Jamie Smith 0:df183df60d24 61 while(true) {}
Jamie Smith 0:df183df60d24 62
Jamie Smith 0:df183df60d24 63 infiniteLoop();
Jamie Smith 0:df183df60d24 64
Jamie Smith 0:df183df60d24 65 return 0;
Jamie Smith 0:df183df60d24 66 }