Fix inaccurate ticks in windows port (#142)
diff --git a/portable/MSVC-MingW/port.c b/portable/MSVC-MingW/port.c
index f5e26a9..81b5f34 100644
--- a/portable/MSVC-MingW/port.c
+++ b/portable/MSVC-MingW/port.c
@@ -22,7 +22,6 @@
* https://www.FreeRTOS.org
* https://github.com/FreeRTOS
*
- * 1 tab == 4 spaces!
*/
/* Standard includes. */
@@ -140,6 +139,9 @@
{
TickType_t xMinimumWindowsBlockTime;
TIMECAPS xTimeCaps;
+TickType_t xWaitTimeBetweenTicks = portTICK_PERIOD_MS;
+HANDLE hTimer = NULL;
+LARGE_INTEGER liDueTime;
/* Set the timer resolution to the maximum possible. */
if( timeGetDevCaps( &xTimeCaps, sizeof( xTimeCaps ) ) == MMSYSERR_NOERROR )
@@ -159,22 +161,32 @@
/* Just to prevent compiler warnings. */
( void ) lpParameter;
+ /* Tick time for the timer is adjusted with the maximum available
+ resolution. */
+ if( portTICK_PERIOD_MS < xMinimumWindowsBlockTime )
+ {
+ xWaitTimeBetweenTicks = xMinimumWindowsBlockTime;
+ }
+
+ /* Convert the tick time in milliseconds to nanoseconds resolution
+ for the Waitable Timer. */
+ liDueTime.u.LowPart = xWaitTimeBetweenTicks * 1000 * 1000;
+ liDueTime.u.HighPart = 0;
+
+ /* Create a synchronization Waitable Timer.*/
+ hTimer = CreateWaitableTimer( NULL, FALSE, NULL );
+
+ configASSERT( hTimer != NULL );
+
+ /* Set the Waitable Timer. The timer is set to run periodically at every
+ xWaitTimeBetweenTicks milliseconds. */
+ configASSERT( SetWaitableTimer( hTimer, &liDueTime, xWaitTimeBetweenTicks, NULL, NULL, 0 ) );
+
for( ;; )
{
/* Wait until the timer expires and we can access the simulated interrupt
- variables. *NOTE* this is not a 'real time' way of generating tick
- events as the next wake time should be relative to the previous wake
- time, not the time that Sleep() is called. It is done this way to
- prevent overruns in this very non real time simulated/emulated
- environment. */
- if( portTICK_PERIOD_MS < xMinimumWindowsBlockTime )
- {
- Sleep( xMinimumWindowsBlockTime );
- }
- else
- {
- Sleep( portTICK_PERIOD_MS );
- }
+ variables. */
+ WaitForSingleObject( hTimer, INFINITE );
configASSERT( xPortRunning );