⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 queue.h

📁 关于 modbus tcp 的一些源代码
💻 H
📖 第 1 页 / 共 2 页
字号:


 // Task to receive from the queue.

 void vADifferentTask( void *pvParameters )

 {

 struct AMessage *pxRxedMessage;



    if( xQueue != 0 )

    {

        // Receive a message on the created queue.  Block for 10 ticks if a

        // message is not immediately available.

        if( xQueueReceive( xQueue, &( pxRxedMessage ), ( portTickType ) 10 ) )

        {

            // pcRxedMessage now points to the struct AMessage variable posted

            // by vATask.

        }

    }



	// ... Rest of task code.

 }

 </pre>

 * \defgroup xQueueReceive xQueueReceive

 * \ingroup QueueManagement

 */

signed portBASE_TYPE xQueueReceive( xQueueHandle xQueue, void *pvBuffer, portTickType xTicksToWait );



/**

 * queue. h

 * <pre>unsigned portBASE_TYPE uxQueueMessagesWaiting( xQueueHandle xQueue );</pre>

 *

 * Return the number of messages stored in a queue.

 *

 * @param xQueue A handle to the queue being queried.

 * 

 * @return The number of messages available in the queue.

 *

 * \page uxQueueMessagesWaiting uxQueueMessagesWaiting

 * \ingroup QueueManagement

 */

unsigned portBASE_TYPE uxQueueMessagesWaiting( xQueueHandle xQueue );



/**

 * queue. h

 * <pre>void vQueueDelete( xQueueHandle xQueue );</pre>

 *

 * Delete a queue - freeing all the memory allocated for storing of items

 * placed on the queue.

 * 

 * @param xQueue A handle to the queue to be deleted.

 *

 * \page vQueueDelete vQueueDelete

 * \ingroup QueueManagement

 */

void vQueueDelete( xQueueHandle xQueue );



/**

 * queue. h

 * <pre>

 portBASE_TYPE xQueueSendFromISR( 

                                    xQueueHandle pxQueue, 

                                    const void *pvItemToQueue, 

                                    portBASE_TYPE xTaskPreviouslyWoken 

                                );

 </pre>

 *

 * Post an item on a queue.  It is safe to use this function from within an

 * interrupt service routine.

 *

 * Items are queued by copy not reference so it is preferable to only

 * queue small items, especially when called from an ISR.  In most cases

 * it would be preferable to store a pointer to the item being queued.

 *

 * @param xQueue The handle to the queue on which the item is to be posted.

 * 

 * @param pvItemToQueue A pointer to the item that is to be placed on the 

 * queue.  The size of the items the queue will hold was defined when the

 * queue was created, so this many bytes will be copied from pvItemToQueue

 * into the queue storage area.

 *

 * @param cTaskPreviouslyWoken This is included so an ISR can post onto

 * the same queue multiple times from a single interrupt.  The first call

 * should always pass in pdFALSE.  Subsequent calls should pass in

 * the value returned from the previous call.  See the file serial .c in the

 * PC port for a good example of this mechanism.

 *

 * @return pdTRUE if a task was woken by posting onto the queue.  This is 

 * used by the ISR to determine if a context switch may be required following

 * the ISR.

 *

 * Example usage for buffered IO (where the ISR can obtain more than one value

 * per call):

   <pre>

 void vBufferISR( void )

 {

 portCHAR cIn;

 portBASE_TYPE xTaskWokenByPost;



    // We have not woken a task at the start of the ISR.

    cTaskWokenByPost = pdFALSE;



    // Loop until the buffer is empty.

    do

    {

        // Obtain a byte from the buffer.

        cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );						



        // Post the byte.  The first time round the loop cTaskWokenByPost

        // will be pdFALSE.  If the queue send causes a task to wake we do

        // not want the task to run until we have finished the ISR, so

        // xQueueSendFromISR does not cause a context switch.  Also we 

        // don't want subsequent posts to wake any other tasks, so we store

        // the return value back into cTaskWokenByPost so xQueueSendFromISR

        // knows not to wake any task the next iteration of the loop.

        xTaskWokenByPost = xQueueSendFromISR( xRxQueue, &cIn, cTaskWokenByPost );



    } while( portINPUT_BYTE( BUFFER_COUNT ) );



    // Now the buffer is empty we can switch context if necessary.

    if( cTaskWokenByPost )

    {

        taskYIELD ();

    }

 }

 </pre>

 *

 * \defgroup xQueueSendFromISR xQueueSendFromISR

 * \ingroup QueueManagement

 */

signed portBASE_TYPE xQueueSendFromISR( xQueueHandle pxQueue, const void *pvItemToQueue, signed portBASE_TYPE xTaskPreviouslyWoken );



/**

 * queue. h

 * <pre>

 portBASE_TYPE xQueueReceiveFromISR( 

                                       xQueueHandle pxQueue, 

                                       void *pvBuffer, 

                                       portBASE_TYPE *pxTaskWoken 

                                   ); 

 * </pre>

 *

 * Receive an item from a queue.  It is safe to use this function from within an

 * interrupt service routine.

 *

 * @param pxQueue The handle to the queue from which the item is to be

 * received.

 *

 * @param pvBuffer Pointer to the buffer into which the received item will

 * be copied.

 * 

 * @param pxTaskWoken A task may be blocked waiting for space to become

 * available on the queue.  If xQueueReceiveFromISR causes such a task to

 * unblock *pxTaskWoken will get set to pdTRUE, otherwise *pxTaskWoken will

 * remain unchanged.

 *

 * @return pdTRUE if an item was successfully received from the queue,

 * otherwise pdFALSE.

 *

 * Example usage:

   <pre>

 

 xQueueHandle xQueue;

 

 // Function to create a queue and post some values.

 void vAFunction( void *pvParameters )

 {

 portCHAR cValueToPost;

 const portTickType xBlockTime = ( portTickType )0xff;



    // Create a queue capable of containing 10 characters.

    xQueue = xQueueCreate( 10, sizeof( portCHAR ) );

    if( xQueue == 0 )

    {

        // Failed to create the queue.

    }



    // ...



    // Post some characters that will be used within an ISR.  If the queue

    // is full then this task will block for xBlockTime ticks.

    cValueToPost = 'a';

    xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime );

    cValueToPost = 'b';

    xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime );



    // ... keep posting characters ... this task may block when the queue

    // becomes full.



    cValueToPost = 'c';

    xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime );

 }



 // ISR that outputs all the characters received on the queue. 

 void vISR_Routine( void )

 {

 portBASE_TYPE xTaskWokenByReceive = pdFALSE;

 portCHAR cRxedChar;



    while( xQueueReceiveFromISR( xQueue, ( void * ) &cRxedChar, &xTaskWokenByReceive) )

    {

        // A character was received.  Output the character now.

        vOutputCharacter( cRxedChar );



        // If removing the character from the queue woke the task that was 

        // posting onto the queue cTaskWokenByReceive will have been set to

        // pdTRUE.  No matter how many times this loop iterates only one

        // task will be woken.

    }



    if( cTaskWokenByPost != ( portCHAR ) pdFALSE;

    {

        taskYIELD ();

    }

 }

 </pre>

 * \defgroup xQueueReceiveFromISR xQueueReceiveFromISR

 * \ingroup QueueManagement

 */

signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle pxQueue, void *pvBuffer, signed portBASE_TYPE *pxTaskWoken );





/* 

 * The functions defined above are for passing data to and from tasks.  The 

 * functions below are the equivalents for passing data to and from 

 * co-rtoutines.

 *

 * These functions are called from the co-routine macro implementation and

 * should not be called directly from application code.  Instead use the macro

 * wrappers defined within croutine.h.

 */

signed portBASE_TYPE xQueueCRSendFromISR( xQueueHandle pxQueue, const void *pvItemToQueue, signed portBASE_TYPE xCoRoutinePreviouslyWoken );

signed portBASE_TYPE xQueueCRReceiveFromISR( xQueueHandle pxQueue, void *pvBuffer, signed portBASE_TYPE *pxTaskWoken );

signed portBASE_TYPE xQueueCRSend( xQueueHandle pxQueue, const void *pvItemToQueue, portTickType xTicksToWait );

signed portBASE_TYPE xQueueCRReceive( xQueueHandle pxQueue, void *pvBuffer, portTickType xTicksToWait );



#endif



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -