Do not call exit() on MSVC Port when calling vPortEndScheduler (#624)

* make port exitable

* correctly set xPortRunning to False

* add suggestions from Review

Co-authored-by: Gaurav-Aggarwal-AWS <33462878+aggarg@users.noreply.github.com>

* add suggestions from Review

Co-authored-by: Gaurav-Aggarwal-AWS <33462878+aggarg@users.noreply.github.com>

---------

Co-authored-by: Gaurav-Aggarwal-AWS <33462878+aggarg@users.noreply.github.com>
diff --git a/portable/MSVC-MingW/port.c b/portable/MSVC-MingW/port.c
index 67b79ba..f39f0ec 100644
--- a/portable/MSVC-MingW/port.c
+++ b/portable/MSVC-MingW/port.c
@@ -160,7 +160,7 @@
     /* Just to prevent compiler warnings. */
     ( void ) lpParameter;
 
-    for( ;; )
+    while( xPortRunning == pdTRUE )
     {
         /* Wait until the timer expires and we can access the simulated interrupt
         variables.  *NOTE* this is not a 'real time' way of generating tick
@@ -177,32 +177,32 @@
             Sleep( portTICK_PERIOD_MS );
         }
 
-        configASSERT( xPortRunning );
+        if( xPortRunning == pdTRUE )
+        {
+            configASSERT( xPortRunning );
 
-        /* Can't proceed if in a critical section as pvInterruptEventMutex won't
-        be available. */
-        WaitForSingleObject( pvInterruptEventMutex, INFINITE );
+            /* Can't proceed if in a critical section as pvInterruptEventMutex won't
+            be available. */
+            WaitForSingleObject( pvInterruptEventMutex, INFINITE );
 
-        /* The timer has expired, generate the simulated tick event. */
-        ulPendingInterrupts |= ( 1 << portINTERRUPT_TICK );
+            /* The timer has expired, generate the simulated tick event. */
+            ulPendingInterrupts |= ( 1 << portINTERRUPT_TICK );
 
-        /* The interrupt is now pending - notify the simulated interrupt
-        handler thread.  Must be outside of a critical section to get here so
-        the handler thread can execute immediately pvInterruptEventMutex is
-        released. */
-        configASSERT( ulCriticalNesting == 0UL );
-        SetEvent( pvInterruptEvent );
+            /* The interrupt is now pending - notify the simulated interrupt
+            handler thread.  Must be outside of a critical section to get here so
+            the handler thread can execute immediately pvInterruptEventMutex is
+            released. */
+            configASSERT( ulCriticalNesting == 0UL );
+            SetEvent( pvInterruptEvent );
 
-        /* Give back the mutex so the simulated interrupt handler unblocks
-        and can access the interrupt handler variables. */
-        ReleaseMutex( pvInterruptEventMutex );
+            /* Give back the mutex so the simulated interrupt handler unblocks
+            and can access the interrupt handler variables. */
+            ReleaseMutex( pvInterruptEventMutex );
+        }
     }
 
-    #ifdef __GNUC__
-        /* Should never reach here - MingW complains if you leave this line out,
-        MSVC complains if you put it in. */
-        return 0;
-    #endif
+
+    return 0;
 }
 /*-----------------------------------------------------------*/
 
@@ -566,7 +566,7 @@
 
 void vPortEndScheduler( void )
 {
-    exit( 0 );
+    xPortRunning = pdFALSE;
 }
 /*-----------------------------------------------------------*/