Fix buffer clean up in \FreeRTOS_Plus_TCP_Minimal_Windows_Simulator\demo_logging.c.
Update queue code to allow an overwrite operation on a queue that is in a queue set, and add prvTestQueueOverwriteWithQueueSet() to test function. Update Eclipse Win32 project to bring it closer the the Visual Studio equivalent.
This commit is contained in:
@ -296,8 +296,8 @@ HANDLE xCurrentTask;
|
||||
if( xLength2 < 0 )
|
||||
{
|
||||
/* Clean up. */
|
||||
xLength2 = sizeof( cPrintString ) - 1 - xLength;
|
||||
cPrintString[ sizeof( cPrintString ) - 1 ] = '\0';
|
||||
xLength2 = dlMAX_PRINT_STRING_LENGTH - 1 - xLength;
|
||||
cPrintString[ dlMAX_PRINT_STRING_LENGTH - 1 ] = '\0';
|
||||
}
|
||||
|
||||
xLength += xLength2;
|
||||
|
@ -1,9 +1,14 @@
|
||||
Changes since V2.0.0 release
|
||||
|
||||
+ Added FREERTOS_SO_WAKEUP_CALLBACK option so a callback can be executed
|
||||
when data arrives.
|
||||
+ Improve print output when using WinPCap to assist in selecting the
|
||||
correct network interface.
|
||||
+ Update FreeRTOS_gethostbyname() to allow an IP address to be passed in -
|
||||
in which case it is just returned as a uint32_t.
|
||||
+ Introduce ipconfigSOCKET_HAS_USER_WAKE_CALLBACK to FreeRTOS_Sockets.c to
|
||||
allow a user supposed callback function to be executed when socket events
|
||||
occur in the same way that the socket semaphore is currently used.
|
||||
+ Update xNetworkBuffersInitialise() to ensure the semaphore created by the
|
||||
function is not accessed until after the NULL check.
|
||||
+ Improve print messages output by the Win32 port layer version of
|
||||
prvPrintAvailableNetworkInterfaces().
|
||||
|
||||
Changes between 160908 and 160919 releases:
|
||||
|
||||
|
@ -138,9 +138,17 @@ static BaseType_t prvCheckReceivedValueWithinExpectedRange( uint32_t ulReceived,
|
||||
|
||||
/*
|
||||
* Increase test coverage by occasionally change the priorities of the two tasks
|
||||
* relative to each other. */
|
||||
* relative to each other.
|
||||
*/
|
||||
static void prvChangeRelativePriorities( void );
|
||||
|
||||
/*
|
||||
* Queue overwrites can only be performed on queues of length of one, requiring
|
||||
* a special test function so a queue of length 1 can temporarily be added to a
|
||||
* set.
|
||||
*/
|
||||
static void prvTestQueueOverwriteWithQueueSet( void );
|
||||
|
||||
/*
|
||||
* Local pseudo random number seed and return functions. Used to avoid calls
|
||||
* to the standard library.
|
||||
@ -599,6 +607,71 @@ uint32_t ulTxValueSnapshot = ulISRTxValue;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static void prvTestQueueOverwriteWithQueueSet( void )
|
||||
{
|
||||
uint32_t ulValueToSend = 0, ulValueReceived = 0;
|
||||
QueueHandle_t xQueueHandle = NULL, xReceivedHandle = NULL;
|
||||
const UBaseType_t xLengthOfOne = ( UBaseType_t ) 1;
|
||||
|
||||
/* Create a queue that has a length of one - a requirement in order to call
|
||||
xQueueOverwrite. This will get deleted again when this test completes. */
|
||||
xQueueHandle = xQueueCreate( xLengthOfOne, sizeof( uint32_t ) );
|
||||
|
||||
if( xQueueHandle != NULL )
|
||||
{
|
||||
xQueueAddToSet( xQueueHandle, xQueueSet );
|
||||
|
||||
/* Add an item to the queue then ensure the queue set correctly
|
||||
indicates that one item is available, and that that item is indeed the
|
||||
queue written to. */
|
||||
xQueueSend( xQueueHandle, ( void * ) &ulValueToSend, 0 );
|
||||
if( uxQueueMessagesWaiting( xQueueSet ) != ( UBaseType_t ) 1 )
|
||||
{
|
||||
/* Expected one item in the queue set. */
|
||||
xQueueSetTasksStatus = pdFAIL;
|
||||
}
|
||||
xQueuePeek( xQueueSet, &xReceivedHandle, queuesetDONT_BLOCK );
|
||||
if( xReceivedHandle != xQueueHandle )
|
||||
{
|
||||
/* Wrote to xQueueHandle so expected xQueueHandle to be the handle
|
||||
held in the queue set. */
|
||||
xQueueSetTasksStatus = pdFAIL;
|
||||
}
|
||||
|
||||
/* Now overwrite the value in the queue and ensure the queue set state
|
||||
doesn't change as the number of items in the queues within the set have
|
||||
not changed. */
|
||||
ulValueToSend++;
|
||||
xQueueOverwrite( xQueueHandle, ( void * ) &ulValueToSend );
|
||||
if( uxQueueMessagesWaiting( xQueueSet ) != ( UBaseType_t ) 1 )
|
||||
{
|
||||
/* Still expected one item in the queue set. */
|
||||
xQueueSetTasksStatus = pdFAIL;
|
||||
}
|
||||
xReceivedHandle = xQueueSelectFromSet( xQueueSet, queuesetDONT_BLOCK );
|
||||
if( xReceivedHandle != xQueueHandle )
|
||||
{
|
||||
/* Wrote to xQueueHandle so expected xQueueHandle to be the handle
|
||||
held in the queue set. */
|
||||
xQueueSetTasksStatus = pdFAIL;
|
||||
}
|
||||
|
||||
/* Also ensure the value received from the queue is the overwritten
|
||||
value, not the value originally written. */
|
||||
xQueueReceive( xQueueHandle, &ulValueReceived, queuesetDONT_BLOCK );
|
||||
if( ulValueReceived != ulValueToSend )
|
||||
{
|
||||
/* Unexpected value recevied from the queue. */
|
||||
xQueueSetTasksStatus = pdFAIL;
|
||||
}
|
||||
|
||||
/* Clean up. */
|
||||
xQueueRemoveFromSet( xQueueHandle, xQueueSet );
|
||||
vQueueDelete( xQueueHandle );
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static void prvSetupTest( void )
|
||||
{
|
||||
BaseType_t x;
|
||||
@ -675,6 +748,11 @@ uint32_t ulValueToSend = 0;
|
||||
xQueueSetTasksStatus = pdFAIL;
|
||||
}
|
||||
|
||||
/* Testing the behaviour of queue sets when a queue overwrite operation is
|
||||
performed on a set member requires a special test as overwrites can only
|
||||
be performed on queues that have a length of 1. */
|
||||
prvTestQueueOverwriteWithQueueSet();
|
||||
|
||||
/* Resume the task that writes to the queues. */
|
||||
vTaskResume( xQueueSetSendingTask );
|
||||
|
||||
|
@ -172,7 +172,7 @@ BaseType_t xNextByte = 0;
|
||||
continuing to look for the end of the string. */
|
||||
xNextByte++;
|
||||
|
||||
configASSERT( xNextByte < sizeof( cRxBuffer ) );
|
||||
configASSERT( ( size_t ) xNextByte < sizeof( cRxBuffer ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -193,7 +193,7 @@ static BaseType_t xCallCount = 0;
|
||||
|
||||
/* Send the next four bytes to the stream buffer. */
|
||||
xStreamBufferSendFromISR( xStreamBuffer,
|
||||
( void * ) ( pcStringToSend + xNextByteToSend ),
|
||||
( const void * ) ( pcStringToSend + xNextByteToSend ),
|
||||
xBytesToSend,
|
||||
NULL );
|
||||
|
||||
|
Binary file not shown.
@ -141,8 +141,8 @@ static void prvDemonstrateTaskStateAndHandleGetFunctions( void );
|
||||
static void prvDemonstratePendingFunctionCall( void );
|
||||
|
||||
/*
|
||||
* The function that is pended by prvDemonstratePendingFunctionCall().
|
||||
*/
|
||||
* The function that is pended by prvDemonstratePendingFunctionCall().
|
||||
*/
|
||||
static void prvPendedFunction( void *pvParameter1, uint32_t ulParameter2 );
|
||||
|
||||
/*
|
||||
|
@ -56,7 +56,7 @@
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1507735156304</id>
|
||||
<id>1519407948166</id>
|
||||
<name>Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
@ -65,7 +65,7 @@
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1507735156307</id>
|
||||
<id>1519407948169</id>
|
||||
<name>Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
@ -74,7 +74,7 @@
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1507735156310</id>
|
||||
<id>1519407948172</id>
|
||||
<name>Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
@ -83,7 +83,7 @@
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1507735156313</id>
|
||||
<id>1519407948176</id>
|
||||
<name>Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
@ -92,7 +92,7 @@
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1507735156316</id>
|
||||
<id>1519407948179</id>
|
||||
<name>Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
@ -101,7 +101,7 @@
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1507735156319</id>
|
||||
<id>1519407948183</id>
|
||||
<name>Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
@ -110,7 +110,7 @@
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1507735156323</id>
|
||||
<id>1519407948186</id>
|
||||
<name>Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
@ -119,7 +119,7 @@
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1507735156327</id>
|
||||
<id>1519407948190</id>
|
||||
<name>Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
@ -128,7 +128,7 @@
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1507735156330</id>
|
||||
<id>1519407948195</id>
|
||||
<name>Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
@ -137,7 +137,7 @@
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1507735156333</id>
|
||||
<id>1519407948199</id>
|
||||
<name>Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
@ -146,7 +146,7 @@
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1507735156337</id>
|
||||
<id>1519407948202</id>
|
||||
<name>Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
@ -155,7 +155,7 @@
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1507735156340</id>
|
||||
<id>1519407948213</id>
|
||||
<name>Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
@ -164,7 +164,7 @@
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1507735156343</id>
|
||||
<id>1519407948216</id>
|
||||
<name>Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
@ -173,7 +173,7 @@
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1507735156347</id>
|
||||
<id>1519407948224</id>
|
||||
<name>Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
@ -182,7 +182,7 @@
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1507735156350</id>
|
||||
<id>1519407948228</id>
|
||||
<name>Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
@ -191,7 +191,7 @@
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1507735156353</id>
|
||||
<id>1519407948231</id>
|
||||
<name>Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
@ -200,7 +200,7 @@
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1507735156356</id>
|
||||
<id>1519407948235</id>
|
||||
<name>Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
@ -209,7 +209,7 @@
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1507735156359</id>
|
||||
<id>1519407948237</id>
|
||||
<name>Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
@ -218,7 +218,7 @@
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1507735156362</id>
|
||||
<id>1519407948240</id>
|
||||
<name>Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
@ -227,7 +227,7 @@
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1507735156366</id>
|
||||
<id>1519407948242</id>
|
||||
<name>Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
@ -236,7 +236,7 @@
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1507735156369</id>
|
||||
<id>1519407948269</id>
|
||||
<name>Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
@ -244,6 +244,42 @@
|
||||
<arguments>1.0-name-matches-false-false-MessageBufferDemo.c</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1519407948274</id>
|
||||
<name>Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||
<arguments>1.0-name-matches-false-false-StreamBufferDemo.c</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1519407948277</id>
|
||||
<name>Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||
<arguments>1.0-name-matches-false-false-StreamBufferInterrupt.c</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1519407948281</id>
|
||||
<name>Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||
<arguments>1.0-name-matches-false-false-MessageBufferDemo.c</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1519407948286</id>
|
||||
<name>Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||
<arguments>1.0-name-matches-false-false-MessageBufferAMP.c</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>0</id>
|
||||
<name>FreeRTOS_Source/portable</name>
|
||||
|
@ -114,6 +114,12 @@ uses the same semantics as the standard C assert() macro. */
|
||||
extern void vAssertCalled( unsigned long ulLine, const char * const pcFileName );
|
||||
#define configASSERT( x ) if( ( x ) == 0 ) vAssertCalled( __LINE__, __FILE__ )
|
||||
|
||||
#define configINCLUDE_MESSAGE_BUFFER_AMP_DEMO 1
|
||||
#if ( configINCLUDE_MESSAGE_BUFFER_AMP_DEMO == 1 )
|
||||
extern void vGenerateCoreBInterrupt( void * xUpdatedMessageBuffer );
|
||||
#define sbSEND_COMPLETED( pxStreamBuffer ) vGenerateCoreBInterrupt( pxStreamBuffer )
|
||||
#endif /* configINCLUDE_MESSAGE_BUFFER_AMP_DEMO */
|
||||
|
||||
/* Include the FreeRTOS+Trace FreeRTOS trace macro definitions. */
|
||||
#include "trcRecorder.h"
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -102,6 +102,8 @@
|
||||
#include "AbortDelay.h"
|
||||
#include "MessageBufferDemo.h"
|
||||
#include "StreamBufferDemo.h"
|
||||
#include "StreamBufferInterrupt.h"
|
||||
#include "MessageBufferAMP.h"
|
||||
|
||||
/* Priorities at which the tasks are created. */
|
||||
#define mainCHECK_TASK_PRIORITY ( configMAX_PRIORITIES - 2 )
|
||||
@ -204,6 +206,8 @@ int main_full( void )
|
||||
|
||||
vStartMessageBufferTasks();
|
||||
vStartStreamBufferTasks();
|
||||
vStartStreamBufferInterruptDemo();
|
||||
vStartMessageBufferAMPTasks();
|
||||
|
||||
#if( configUSE_PREEMPTION != 0 )
|
||||
{
|
||||
@ -342,10 +346,28 @@ const TickType_t xCycleFrequency = pdMS_TO_TICKS( 2500UL );
|
||||
{
|
||||
pcStatusMessage = "Error: Abort delay";
|
||||
}
|
||||
else if( xIsInterruptStreamBufferDemoStillRunning() != pdPASS )
|
||||
{
|
||||
pcStatusMessage = "Error: Stream buffer interrupt";
|
||||
}
|
||||
else if( xAreMessageBufferAMPTasksStillRunning() != pdPASS )
|
||||
{
|
||||
pcStatusMessage = "Error: Message buffer AMP";
|
||||
}
|
||||
|
||||
#if( configSUPPORT_STATIC_ALLOCATION == 1 )
|
||||
else if( xAreStaticAllocationTasksStillRunning() != pdPASS )
|
||||
{
|
||||
pcStatusMessage = "Error: Static allocation";
|
||||
}
|
||||
#endif /* configSUPPORT_STATIC_ALLOCATION */
|
||||
|
||||
/* This is the only task that uses stdout so its ok to call printf()
|
||||
directly. */
|
||||
printf( ( char * ) "%s - %u\r\n", pcStatusMessage, ( unsigned int ) xTaskGetTickCount() );
|
||||
printf( "%s - tick count %u - free heap %u - min free heap %u\r\n", pcStatusMessage,
|
||||
xTaskGetTickCount(),
|
||||
xPortGetFreeHeapSize(),
|
||||
xPortGetMinimumEverFreeHeapSize() );
|
||||
fflush( stdout );
|
||||
}
|
||||
}
|
||||
@ -454,6 +476,10 @@ TaskHandle_t xTimerTask;
|
||||
level functionality. */
|
||||
vPeriodicStreamBufferProcessing();
|
||||
|
||||
/* Writes a string to a string buffer four bytes at a time to demonstrate
|
||||
a stream being sent from an interrupt to a task. */
|
||||
vBasicStreamBufferSendFromISR();
|
||||
|
||||
/* For code coverage purposes. */
|
||||
xTimerTask = xTimerGetTimerDaemonTaskHandle();
|
||||
configASSERT( uxTaskPriorityGetFromISR( xTimerTask ) == configTIMER_TASK_PRIORITY );
|
||||
|
@ -752,13 +752,23 @@ Queue_t * const pxQueue = ( Queue_t * ) xQueue;
|
||||
if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) )
|
||||
{
|
||||
traceQUEUE_SEND( pxQueue );
|
||||
xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );
|
||||
|
||||
#if ( configUSE_QUEUE_SETS == 1 )
|
||||
{
|
||||
UBaseType_t uxPreviousMessagesWaiting = pxQueue->uxMessagesWaiting;
|
||||
|
||||
xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );
|
||||
|
||||
if( pxQueue->pxQueueSetContainer != NULL )
|
||||
{
|
||||
if( prvNotifyQueueSetContainer( pxQueue, xCopyPosition ) != pdFALSE )
|
||||
if( ( xCopyPosition == queueOVERWRITE ) && ( uxPreviousMessagesWaiting != ( UBaseType_t ) 0 ) )
|
||||
{
|
||||
/* Do not notify the queue set as an existing item
|
||||
was overwritten in the queue so the number of items
|
||||
in the queue has not changed. */
|
||||
mtCOVERAGE_TEST_MARKER();
|
||||
}
|
||||
else if( prvNotifyQueueSetContainer( pxQueue, xCopyPosition ) != pdFALSE )
|
||||
{
|
||||
/* The queue is a member of a queue set, and posting
|
||||
to the queue set caused a higher priority task to
|
||||
@ -805,6 +815,8 @@ Queue_t * const pxQueue = ( Queue_t * ) xQueue;
|
||||
}
|
||||
#else /* configUSE_QUEUE_SETS */
|
||||
{
|
||||
xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );
|
||||
|
||||
/* If there was a task waiting for data to arrive on the
|
||||
queue then unblock it now. */
|
||||
if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )
|
||||
|
Reference in New Issue
Block a user