The stopwatch is the highest resolution timer available and goes down to 100nano-second resolution.

The time cost of the Gpio.Write and Gpio.Read methods can be an issue with time sensitive things.

Using Stopwatch To Accurately Delay


using System.Diagnostics;

	private Stopwatch Stopwatch1;

	Stopwatch1 = Stopwatch.StartNew();

	StopwatchWait(5);		//Delay in mS


	//*************************************
	//*************************************
	//*********** STOPWATCH WAIT **********
	//*************************************
	//*************************************
	//A synchronous wait is used to avoid yielding the thread.  This method allows for very precise timing.
	private void StopwatchWait(double milliseconds)
	{
		//Calculates the number of CPU ticks that will elapse in the specified time
		long initialTick = Stopwatch1.ElapsedTicks;
		long initialElapsed = Stopwatch1.ElapsedMilliseconds;
		double desiredTicks = milliseconds / 1000.0 * Stopwatch.Frequency;
		double finalTick = initialTick + desiredTicks;

		//Wait in a loop until the threshold is hit
		while (Stopwatch1.ElapsedTicks < finalTick)
		{

		}
	}

	private void Page_Unloaded(object sender, RoutedEventArgs e)
	{
		Stopwatch1.Stop();

Creating a high priority thread that runs forever with a high accuracy stopwatch timebase

Note this isn’t perfect!!  We’ve found there will be pauses of lots time (> 200mS) every now and then,presuambly when the OS is up to something else.  


using System.Diagnostics;

	Stopwatch Stopwatch1;

	//----- START OUR HIGH PRIORITY BACKGROUND THREAD -----
	//We don't await it as its going to run for the lifetime of the application in the background
	Stopwatch1 = Stopwatch.StartNew();
	Windows.System.Threading.ThreadPool.RunAsync(this.MyHighPriorityBackgroundThread, Windows.System.Threading.WorkItemPriority.High);


	//******************************************************
	//******************************************************
	//********** HIGH PRIORITY BACKGROUND THREAD ***********
	//******************************************************
	//******************************************************
	private void MyHighPriorityBackgroundThread(Windows.Foundation.IAsyncAction action)
	{
		//This thread runs on a high priority task and loops forever
		while (true)
		{
			//DO SOMETHING...


			//Delay using high accuracy timer
			StopwatchWait(5);
				
		}
	}


	//*************************************
	//*************************************
	//*********** STOPWATCH WAIT **********
	//*************************************
	//*************************************
	//A synchronous wait is used to avoid yielding the thread.  This method allows for very precise timing.
	private void StopwatchWait(double milliseconds)
	{
		//Calculates the number of CPU ticks that will elapse in the specified time
		long initialTick = Stopwatch1.ElapsedTicks;
		long initialElapsed = Stopwatch1.ElapsedMilliseconds;
		double desiredTicks = milliseconds / 1000.0 * Stopwatch.Frequency;
		double finalTick = initialTick + desiredTicks;

		//Wait in a loop until the threshold is hit
		while (Stopwatch1.ElapsedTicks < finalTick)
		{

		}
	}

 

Feel free to comment if you can add help to this page or point out issues and solutions you have found. I do not provide support on this site, if you need help with a problem head over to stack overflow.

Comments

Your email address will not be published. Required fields are marked *