Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add vPortGenerateSimulatedInterruptFromWindowsThread in MSVC port #1044

Merged
merged 5 commits into from May 8, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
49 changes: 27 additions & 22 deletions portable/MSVC-MingW/port.c
Expand Up @@ -177,28 +177,7 @@ static DWORD WINAPI prvSimulatedPeripheralTimer( LPVOID lpParameter )
Sleep( portTICK_PERIOD_MS );
}

if( xPortRunning == pdTRUE )
{
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 );
}
vPortGenerateSimulatedInterruptFromNative( portINTERRUPT_TICK );
chinglee-iot marked this conversation as resolved.
Show resolved Hide resolved
}

return 0;
Expand Down Expand Up @@ -636,6 +615,32 @@ void vPortGenerateSimulatedInterrupt( uint32_t ulInterruptNumber )
}
/*-----------------------------------------------------------*/

void vPortGenerateSimulatedInterruptFromNative( 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,
uint32_t ( * pvHandler )( void ) )
{
Expand Down
13 changes: 11 additions & 2 deletions portable/MSVC-MingW/portmacro.h
Expand Up @@ -184,8 +184,9 @@ void vPortExitCritical( void );
#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters )
#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters )

#define portINTERRUPT_YIELD ( 0UL )
#define portINTERRUPT_TICK ( 1UL )
#define portINTERRUPT_YIELD ( 0UL )
#define portINTERRUPT_TICK ( 1UL )
#define portINTERRUPT_APPLICATION_DEFINED_START ( 2UL )
aggarg marked this conversation as resolved.
Show resolved Hide resolved

/*
* Raise a simulated interrupt represented by the bit mask in ulInterruptMask.
Expand All @@ -194,6 +195,14 @@ void vPortExitCritical( void );
*/
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 native windows thread.
*/
void vPortGenerateSimulatedInterruptFromNative( uint32_t ulInterruptNumber );

/*
* 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
Expand Down