mirror of
				https://github.com/FreeRTOS/FreeRTOS-Kernel.git
				synced 2025-11-04 11:09:01 +01:00 
			
		
		
		
	Add vPortGenerateSimulatedInterruptFromWindowsThread in MSVC port (#1044)
Add vPortGenerateSimulatedInterruptFromWindowsThread in MSVC port to enable native windows threads to notify FreeRTOS tasks.
This commit is contained in:
		
							parent
							
								
									78c8bbde0e
								
							
						
					
					
						commit
						067d04e44e
					
				@ -177,28 +177,7 @@ static DWORD WINAPI prvSimulatedPeripheralTimer( LPVOID lpParameter )
 | 
				
			|||||||
            Sleep( portTICK_PERIOD_MS );
 | 
					            Sleep( portTICK_PERIOD_MS );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if( xPortRunning == pdTRUE )
 | 
					        vPortGenerateSimulatedInterruptFromWindowsThread( portINTERRUPT_TICK );
 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            configASSERT( xPortRunning );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            /* 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 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 );
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
@ -636,6 +615,32 @@ void vPortGenerateSimulatedInterrupt( uint32_t ulInterruptNumber )
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
/*-----------------------------------------------------------*/
 | 
					/*-----------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void vPortGenerateSimulatedInterruptFromWindowsThread( uint32_t ulInterruptNumber )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if( xPortRunning == pdTRUE )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        /* Can't proceed if in a critical section as pvInterruptEventMutex won't
 | 
				
			||||||
 | 
					         * be available. */
 | 
				
			||||||
 | 
					        WaitForSingleObject( pvInterruptEventMutex, INFINITE );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* Pending a user defined interrupt to be handled in simulated interrupt
 | 
				
			||||||
 | 
					         * handler thread. */
 | 
				
			||||||
 | 
					        ulPendingInterrupts |= ( 1 << ulInterruptNumber );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* 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 );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/*-----------------------------------------------------------*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void vPortSetInterruptHandler( uint32_t ulInterruptNumber,
 | 
					void vPortSetInterruptHandler( uint32_t ulInterruptNumber,
 | 
				
			||||||
                               uint32_t ( * pvHandler )( void ) )
 | 
					                               uint32_t ( * pvHandler )( void ) )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
				
			|||||||
@ -184,8 +184,9 @@ void vPortExitCritical( void );
 | 
				
			|||||||
#define portTASK_FUNCTION_PROTO( vFunction, pvParameters )    void vFunction( void * pvParameters )
 | 
					#define portTASK_FUNCTION_PROTO( vFunction, pvParameters )    void vFunction( void * pvParameters )
 | 
				
			||||||
#define portTASK_FUNCTION( vFunction, pvParameters )          void vFunction( void * pvParameters )
 | 
					#define portTASK_FUNCTION( vFunction, pvParameters )          void vFunction( void * pvParameters )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define portINTERRUPT_YIELD    ( 0UL )
 | 
					#define portINTERRUPT_YIELD                        ( 0UL )
 | 
				
			||||||
#define portINTERRUPT_TICK     ( 1UL )
 | 
					#define portINTERRUPT_TICK                         ( 1UL )
 | 
				
			||||||
 | 
					#define portINTERRUPT_APPLICATION_DEFINED_START    ( 2UL )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Raise a simulated interrupt represented by the bit mask in ulInterruptMask.
 | 
					 * Raise a simulated interrupt represented by the bit mask in ulInterruptMask.
 | 
				
			||||||
@ -194,6 +195,14 @@ void vPortExitCritical( void );
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
void vPortGenerateSimulatedInterrupt( uint32_t ulInterruptNumber );
 | 
					void vPortGenerateSimulatedInterrupt( uint32_t ulInterruptNumber );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Raise a simulated interrupt represented by the bit mask in ulInterruptMask.
 | 
				
			||||||
 | 
					 * Each bit can be used to represent an individual interrupt - with the first
 | 
				
			||||||
 | 
					 * two bits being used for the Yield and Tick interrupts respectively. This function
 | 
				
			||||||
 | 
					 * can be called in a windows thread.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void vPortGenerateSimulatedInterruptFromWindowsThread( uint32_t ulInterruptNumber );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Install an interrupt handler to be called by the simulated interrupt handler
 | 
					 * Install an interrupt handler to be called by the simulated interrupt handler
 | 
				
			||||||
 * thread.  The interrupt number must be above any used by the kernel itself
 | 
					 * thread.  The interrupt number must be above any used by the kernel itself
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user