亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? queue.c

?? Modbus協議的源代碼 Modbus協議的源代碼、 Modbus協議的源代碼 Modbus協議的源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*

	FreeRTOS.org V4.1.1 - Copyright (C) 2003-2006 Richard Barry.



	This file is part of the FreeRTOS.org distribution.



	FreeRTOS.org is free software; you can redistribute it and/or modify

	it under the terms of the GNU General Public License as published by

	the Free Software Foundation; either version 2 of the License, or

	(at your option) any later version.



	FreeRTOS.org is distributed in the hope that it will be useful,

	but WITHOUT ANY WARRANTY; without even the implied warranty of

	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

	GNU General Public License for more details.



	You should have received a copy of the GNU General Public License

	along with FreeRTOS.org; if not, write to the Free Software

	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA



	A special exception to the GPL can be applied should you wish to distribute

	a combined work that includes FreeRTOS.org, without being obliged to provide

	the source code for any proprietary components.  See the licensing section

	of http://www.FreeRTOS.org for full details of how and when the exception

	can be applied.



	***************************************************************************

	See http://www.FreeRTOS.org for documentation, latest information, license

	and contact details.  Please ensure to read the configuration and relevant

	port sections of the online documentation.

	***************************************************************************

*/



/*

Changes from V1.01



	+ More use of 8bit data types.

	+ Function name prefixes changed where the data type returned has changed.



Changed from V2.0.0



	+ Added the queue locking mechanism and make more use of the scheduler

	  suspension feature to minimise the time interrupts have to be disabled

	  when accessing a queue.



Changed from V2.2.0



	+ Explicit use of 'signed' qualifier on portCHAR types added.



Changes from V3.0.0



	+ API changes as described on the FreeRTOS.org WEB site.



Changes from V3.2.3



	+ Added the queue functions that can be used from co-routines.



Changes from V4.0.5



	+ Added a loop within xQueueSend() and xQueueReceive() to prevent the

	  functions exiting when a block time remains and the function has

	  not completed.



*/



#include <stdlib.h>

#include <string.h>

#include "FreeRTOS.h"

#include "task.h"

#include "croutine.h"



/*-----------------------------------------------------------

 * PUBLIC LIST API documented in list.h

 *----------------------------------------------------------*/



/* Constants used with the cRxLock and cTxLock structure members. */

#define queueUNLOCKED	( ( signed portBASE_TYPE ) -1 )

#define queueERRONEOUS_UNBLOCK					( -1 )



/*

 * Definition of the queue used by the scheduler.

 * Items are queued by copy, not reference.

 */

typedef struct QueueDefinition

{

	signed portCHAR *pcHead;				/*< Points to the beginning of the queue storage area. */

	signed portCHAR *pcTail;				/*< Points to the byte at the end of the queue storage area.  Once more byte is allocated than necessary to store the queue items, this is used as a marker. */



	signed portCHAR *pcWriteTo;				/*< Points to the free next place in the storage area. */

	signed portCHAR *pcReadFrom;			/*< Points to the last place that a queued item was read from. */



	xList xTasksWaitingToSend;				/*< List of tasks that are blocked waiting to post onto this queue.  Stored in priority order. */

	xList xTasksWaitingToReceive;			/*< List of tasks that are blocked waiting to read from this queue.  Stored in priority order. */



	unsigned portBASE_TYPE uxMessagesWaiting;/*< The number of items currently in the queue. */

	unsigned portBASE_TYPE uxLength;		/*< The length of the queue defined as the number of items it will hold, not the number of bytes. */

	unsigned portBASE_TYPE uxItemSize;		/*< The size of each items that the queue will hold. */



	signed portBASE_TYPE xRxLock;				/*< Stores the number of items received from the queue (removed from the queue) while the queue was locked.  Set to queueUNLOCKED when the queue is not locked. */

	signed portBASE_TYPE xTxLock;				/*< Stores the number of items transmitted to the queue (added to the queue) while the queue was locked.  Set to queueUNLOCKED when the queue is not locked. */

} xQUEUE;

/*-----------------------------------------------------------*/



/*

 * Inside this file xQueueHandle is a pointer to a xQUEUE structure.

 * To keep the definition private the API header file defines it as a

 * pointer to void.

 */

typedef xQUEUE * xQueueHandle;



/*

 * Prototypes for public functions are included here so we don't have to

 * include the API header file (as it defines xQueueHandle differently).  These

 * functions are documented in the API header file.

 */

xQueueHandle xQueueCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize );

signed portBASE_TYPE xQueueSend( xQueueHandle xQueue, const void * pvItemToQueue, portTickType xTicksToWait );

unsigned portBASE_TYPE uxQueueMessagesWaiting( xQueueHandle pxQueue );

void vQueueDelete( xQueueHandle xQueue );

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

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

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



#if configUSE_CO_ROUTINES == 1

	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



/*

 * Unlocks a queue locked by a call to prvLockQueue.  Locking a queue does not

 * prevent an ISR from adding or removing items to the queue, but does prevent

 * an ISR from removing tasks from the queue event lists.  If an ISR finds a

 * queue is locked it will instead increment the appropriate queue lock count

 * to indicate that a task may require unblocking.  When the queue in unlocked

 * these lock counts are inspected, and the appropriate action taken.

 */

static void prvUnlockQueue( xQueueHandle pxQueue );



/*

 * Uses a critical section to determine if there is any data in a queue.

 *

 * @return pdTRUE if the queue contains no items, otherwise pdFALSE.

 */

static signed portBASE_TYPE prvIsQueueEmpty( const xQueueHandle pxQueue );



/*

 * Uses a critical section to determine if there is any space in a queue.

 *

 * @return pdTRUE if there is no space, otherwise pdFALSE;

 */

static signed portBASE_TYPE prvIsQueueFull( const xQueueHandle pxQueue );



/*

 * Macro that copies an item into the queue.  This is done by copying the item

 * byte for byte, not by reference.  Updates the queue state to ensure it's

 * integrity after the copy.

 */

#define prvCopyQueueData( pxQueue, pvItemToQueue )												\

{																								\

	memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( unsigned ) pxQueue->uxItemSize );	\

	++( pxQueue->uxMessagesWaiting );															\

	pxQueue->pcWriteTo += pxQueue->uxItemSize;													\

	if( pxQueue->pcWriteTo >= pxQueue->pcTail )													\

	{																							\

		pxQueue->pcWriteTo = pxQueue->pcHead;													\

	}																							\

}

/*-----------------------------------------------------------*/



/*

 * Macro to mark a queue as locked.  Locking a queue prevents an ISR from

 * accessing the queue event lists.

 */

#define prvLockQueue( pxQueue )			\

{										\

	taskENTER_CRITICAL();				\

		++( pxQueue->xRxLock );			\

		++( pxQueue->xTxLock );			\

	taskEXIT_CRITICAL();				\

}

/*-----------------------------------------------------------*/





/*-----------------------------------------------------------

 * PUBLIC QUEUE MANAGEMENT API documented in queue.h

 *----------------------------------------------------------*/



xQueueHandle xQueueCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize )

{

xQUEUE *pxNewQueue;

size_t xQueueSizeInBytes;



	/* Allocate the new queue structure. */

	if( uxQueueLength > ( unsigned portBASE_TYPE ) 0 )

	{

		pxNewQueue = ( xQUEUE * ) pvPortMalloc( sizeof( xQUEUE ) );

		if( pxNewQueue != NULL )

		{

			/* Create the list of pointers to queue items.  The queue is one byte

			longer than asked for to make wrap checking easier/faster. */

			xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ) + ( size_t ) 1;



			pxNewQueue->pcHead = ( signed portCHAR * ) pvPortMalloc( xQueueSizeInBytes );

			if( pxNewQueue->pcHead != NULL )

			{

				/* Initialise the queue members as described above where the

				queue type is defined. */

				pxNewQueue->pcTail = pxNewQueue->pcHead + ( uxQueueLength * uxItemSize );

				pxNewQueue->uxMessagesWaiting = 0;

				pxNewQueue->pcWriteTo = pxNewQueue->pcHead;

				pxNewQueue->pcReadFrom = pxNewQueue->pcHead + ( ( uxQueueLength - 1 ) * uxItemSize );

				pxNewQueue->uxLength = uxQueueLength;

				pxNewQueue->uxItemSize = uxItemSize;

				pxNewQueue->xRxLock = queueUNLOCKED;

				pxNewQueue->xTxLock = queueUNLOCKED;



				/* Likewise ensure the event queues start with the correct state. */

				vListInitialise( &( pxNewQueue->xTasksWaitingToSend ) );

				vListInitialise( &( pxNewQueue->xTasksWaitingToReceive ) );



				return  pxNewQueue;

			}

			else

			{

				vPortFree( pxNewQueue );

			}

		}

	}



	/* Will only reach here if we could not allocate enough memory or no memory

	was required. */

	return NULL;

}

/*-----------------------------------------------------------*/



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

{

signed portBASE_TYPE xReturn;

xTimeOutType xTimeOut;



	/* Make sure other tasks do not access the queue. */

	vTaskSuspendAll();



	/* Capture the current time status for future reference. */

	vTaskSetTimeOutState( &xTimeOut );



	/* It is important that this is the only thread/ISR that modifies the

	ready or delayed lists until xTaskResumeAll() is called.  Places where

	the ready/delayed lists are modified include:



		+ vTaskDelay() -  Nothing can call vTaskDelay as the scheduler is

		  suspended, vTaskDelay() cannot be called from an ISR.

		+ vTaskPrioritySet() - Has a critical section around the access.

		+ vTaskSwitchContext() - This will not get executed while the scheduler

		  is suspended.

		+ prvCheckDelayedTasks() - This will not get executed while the

		  scheduler is suspended.

		+ xTaskCreate() - Has a critical section around the access.

		+ vTaskResume() - Has a critical section around the access.

		+ xTaskResumeAll() - Has a critical section around the access.

		+ xTaskRemoveFromEventList - Checks to see if the scheduler is

		  suspended.  If so then the TCB being removed from the event is

		  removed from the event and added to the xPendingReadyList.

	*/



	/* Make sure interrupts do not access the queue event list. */

	prvLockQueue( pxQueue );



	/* It is important that interrupts to not access the event list of the

	queue being modified here.  Places where the event list is modified

	include:



		+ xQueueSendFromISR().  This checks the lock on the queue to see if

		  it has access.  If the queue is locked then the Tx lock count is

		  incremented to signify that a task waiting for data can be made ready

		  once the queue lock is removed.  If the queue is not locked then

		  a task can be moved from the event list, but will not be removed

		  from the delayed list or placed in the ready list until the scheduler

		  is unlocked.



		+ xQueueReceiveFromISR().  As per xQueueSendFromISR().

	*/

		

	/* If the queue is already full we may have to block. */

	do

	{

		if( prvIsQueueFull( pxQueue ) )

		{

			/* The queue is full - do we want to block or just leave without

			posting? */

			if( xTicksToWait > ( portTickType ) 0 )

			{

				/* We are going to place ourselves on the xTasksWaitingToSend event

				list, and will get woken should the delay expire, or space become

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩精品综合一本久道在线视频| 成熟亚洲日本毛茸茸凸凹| 国产精品毛片久久久久久| 亚洲精品在线电影| 精品国产精品一区二区夜夜嗨| 日韩一区二区高清| 91精品国产91久久久久久一区二区| 欧美在线你懂的| 欧美影片第一页| 欧美日韩视频专区在线播放| 欧美亚洲丝袜传媒另类| 欧美色大人视频| 337p亚洲精品色噜噜狠狠| 91精品国产入口在线| 日韩视频免费直播| 久久久噜噜噜久久人人看 | 国产精品看片你懂得| 欧美激情一区三区| ●精品国产综合乱码久久久久| 亚洲免费在线电影| 日韩福利电影在线观看| 麻豆91免费观看| 国产福利视频一区二区三区| www.在线成人| 欧美视频三区在线播放| 欧美一级黄色大片| 久久蜜桃香蕉精品一区二区三区| 国产欧美一区二区精品婷婷 | 一区二区三区在线视频免费观看| 亚洲一区二区三区免费视频| 免费xxxx性欧美18vr| 国产精品一品视频| 99在线精品观看| 在线播放欧美女士性生活| 精品久久久久99| 亚洲日本在线看| 男女视频一区二区| jizzjizzjizz欧美| 678五月天丁香亚洲综合网| 国产午夜亚洲精品午夜鲁丝片| 一区二区在线观看不卡| 久久精品国产一区二区三| 不卡的av网站| 日韩欧美国产电影| 亚洲欧洲日本在线| 精品亚洲国内自在自线福利| 色8久久精品久久久久久蜜 | 国产一区二区三区蝌蚪| 91看片淫黄大片一级在线观看| 精品美女一区二区| 亚洲成人你懂的| 99久久精品免费看国产| 精品国产青草久久久久福利| 亚洲夂夂婷婷色拍ww47| 成人黄色综合网站| 久久久久久久久久电影| 婷婷中文字幕综合| 色久综合一二码| 国产精品久久久久毛片软件| 国内外成人在线| 日韩一级免费一区| 亚洲第一搞黄网站| 在线观看日韩精品| 中文字幕亚洲不卡| 成人18精品视频| 国产区在线观看成人精品| 久久电影网站中文字幕| 777xxx欧美| 日日夜夜免费精品视频| 欧美视频在线观看一区二区| 亚洲色欲色欲www在线观看| 国产一区二区不卡在线 | 欧美成人国产一区二区| 首页国产欧美久久| 欧美亚洲日本一区| 亚洲一区二区在线观看视频| 91免费看视频| 亚洲美女精品一区| 91麻豆国产福利精品| 亚洲手机成人高清视频| 91片在线免费观看| 亚洲精品免费视频| 欧美色大人视频| 日韩激情在线观看| 538prom精品视频线放| 图片区小说区区亚洲影院| 欧美日韩精品欧美日韩精品一| 亚洲国产另类精品专区| 欧美色视频一区| 日本欧美久久久久免费播放网| 在线播放一区二区三区| 蜜臀久久99精品久久久画质超高清 | 欧美一二区视频| 久久国产乱子精品免费女| 欧美精品一区二区在线播放 | 久久精品夜色噜噜亚洲aⅴ| 国产九色sp调教91| 中文字幕欧美一区| 在线观看欧美精品| 日本午夜一区二区| 久久蜜桃av一区精品变态类天堂| 国产精品一区二区免费不卡 | 污片在线观看一区二区 | 国产成人综合在线观看| 国产精品久久久久久久久搜平片 | 亚洲高清免费观看| 日韩三级高清在线| www.99精品| 日日夜夜精品视频天天综合网| 欧美xxxxx裸体时装秀| a级精品国产片在线观看| 亚洲成人av电影| 久久女同精品一区二区| 91麻豆精东视频| 极品瑜伽女神91| 一区二区三区在线免费播放| 欧美大肚乱孕交hd孕妇| 成人一级片在线观看| 亚洲地区一二三色| 欧美激情一区二区在线| 欧美视频中文一区二区三区在线观看 | 国产欧美精品区一区二区三区| 99久久综合99久久综合网站| 麻豆精品国产传媒mv男同| 国产精品激情偷乱一区二区∴| 91精品啪在线观看国产60岁| 91色在线porny| 国产激情一区二区三区| 亚欧色一区w666天堂| 国产精品少妇自拍| 欧美成人一区二区三区| 欧美性猛片xxxx免费看久爱| 本田岬高潮一区二区三区| 秋霞午夜av一区二区三区| 亚洲精品成人a在线观看| 国产欧美一区视频| 欧美不卡在线视频| 精品婷婷伊人一区三区三| 99久久免费精品| 国产不卡高清在线观看视频| 久草这里只有精品视频| 婷婷久久综合九色国产成人| 亚洲精品国产第一综合99久久| 国产农村妇女精品| 久久久久久麻豆| 亚洲精品一区二区三区四区高清| 欧美精品aⅴ在线视频| 欧美在线免费视屏| 色偷偷久久一区二区三区| 成人av资源网站| 成人自拍视频在线观看| 国产精品一区二区久激情瑜伽| 麻豆成人免费电影| 久久国产尿小便嘘嘘| 日韩精品一区第一页| 天涯成人国产亚洲精品一区av| 亚洲国产精品一区二区久久恐怖片 | 国产精品888| 国产夫妻精品视频| 国产精品2024| 懂色av一区二区在线播放| 国产毛片一区二区| 国产91精品精华液一区二区三区 | 欧美一级片在线| 精品电影一区二区| 欧美精品一区二区三区蜜桃| 久久综合久久综合九色| 久久精品一区二区三区不卡牛牛| 久久精品人人做| 亚洲欧美综合色| 亚洲国产成人高清精品| 偷拍与自拍一区| 国内不卡的二区三区中文字幕| 国产精品18久久久久久久久久久久| 国产二区国产一区在线观看| 成人av电影观看| 欧洲人成人精品| 精品少妇一区二区三区免费观看 | 欧美国产精品一区二区三区| 中文字幕亚洲综合久久菠萝蜜| 一区二区三区不卡视频在线观看| 婷婷激情综合网| 国产精品888| 欧美色视频在线观看| 欧美mv和日韩mv国产网站| 中文字幕第一区二区| 亚洲自拍偷拍网站| 激情五月播播久久久精品| 成人黄色小视频| 欧美一区二区三区在| 国产日韩精品一区| 亚洲综合一二三区| 狠狠色综合播放一区二区| 色综合久久久久| 日韩美女视频一区二区在线观看| 日本一区二区视频在线观看| 午夜日韩在线观看| 国产高清久久久| 制服丝袜av成人在线看| 中文字幕一区在线观看|