深圳公司廣告片制作江西seo推廣方案
????????消息隊列可以應用于發(fā)送不定長消息的場合,包括任務與任務間的消息交換,隊列是
FreeRTOS 主要的任務間通訊方式,可以在任務與任務間、中斷和任務間傳送信息,發(fā)送到
隊列的消息是通過拷貝方式實現(xiàn)的,這意味著隊列存儲的數(shù)據(jù)是原數(shù)據(jù),而不是原數(shù)據(jù)的
引用。
-
消息隊列控制塊
typedef struct QueueDefinition
{int8_t *pcHead; //pcHead 指向隊列消息存儲區(qū)起始位置,即第一個消息空間int8_t *pcWriteTo; //pcWriteTo 指向隊列消息存儲區(qū)下一個可用消息空間union{QueuePointers_t xQueue; /*結(jié)構(gòu)體,包含pcTail指向隊列消息存儲區(qū)結(jié)束位置地址; pcReadFrom指向出隊消息空間的最后一個*/SemaphoreData_t xSemaphore; /*作為信號量時,用的結(jié)構(gòu)體*/} u;List_t xTasksWaitingToSend; //是一個發(fā)送消息阻塞列表,如果隊列滿了想發(fā)送消息的任務會阻塞List_t xTasksWaitingToReceive;//是一個接收消息阻塞列表如果隊列為空想接收消息的任務會阻塞volatile UBaseType_t uxMessagesWaiting;//用于記錄當前消息隊列的消息個數(shù)UBaseType_t uxLength; //表示隊列的長度,Item的數(shù)量 UBaseType_t uxItemSize; //表示單元消息的大小,Item的大小volatile int8_t cRxLock; //隊列上鎖后,儲存從隊列收到的列表項數(shù)目,也就是出隊的數(shù)量 volatile int8_t cTxLock; //隊列上鎖后,儲存發(fā)送到隊列的列表項數(shù)目,也就是入隊的數(shù)量#if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )uint8_t ucStaticallyAllocated;//如果隊列使用的內(nèi)存是靜態(tài)分配的,以確保不嘗試釋放內(nèi)存, 則設置為pdTRUE#endif#if ( configUSE_QUEUE_SETS == 1 )struct QueueDefinition *pxQueueSetContainer;//隊列控制塊指針#endif#if ( configUSE_TRACE_FACILITY == 1 )UBaseType_t uxQueueNumber; //消息隊列數(shù)量uint8_t ucQueueType; //消息隊列類型#endif} xQUEUE;
3.1動態(tài)創(chuàng)建隊列xQueueCreate()
3.1.1函數(shù)原型

3.1.2函數(shù)框架
xQueueCreate()就是調(diào)用xQueueGenericCreate()實現(xiàn)的。
3.2動態(tài)創(chuàng)建隊列xQueueGenericCreate()
3.2.1函數(shù)原型
- uxQueueLength:隊列長度,Item的數(shù)量;
- uxItemSize:消息單元的大小。
- ucQueueType:消息隊列類型:
- 返回值:隊列句柄。
3.2.2函數(shù)框架
3.3靜態(tài)創(chuàng)建隊列xQueueCreateStatic()
3.3.1函數(shù)原型
3.3.2函數(shù)框架
xQueueCreateStatic()由xQueueGenericCreateStatic()函數(shù)實現(xiàn)。
3.4靜態(tài)創(chuàng)建隊列xQueueGenericCreateStatic()
3.4.1函數(shù)原型
- uxQueueLength:隊列能夠存儲的最大單元數(shù)目,即隊列深度;
- uxItemSize:消息單元的大小;
- pucQueueStorage:指向自己分配的隊列消息存儲空間起始地址;
- pxStaticQueue:指向自己分配的隊列起始地址;
- ucQueueType:消息隊列類型;
- 返回值:隊列句柄。
3.4.2函數(shù)框架
靜態(tài)創(chuàng)建隊列與動態(tài)創(chuàng)建隊列的區(qū)別就是,靜態(tài)創(chuàng)建時的隊列控制塊和隊列消息存儲空間需要自己預先分配好,再傳遞起始地址給靜態(tài)創(chuàng)建函數(shù),類似于任務的動態(tài)創(chuàng)建與靜態(tài)創(chuàng)建的區(qū)別。
3.5刪除隊列vQueueDelete()
3.5.1函數(shù)原型
void vQueueDelete( QueueHandle_t xQueue )
- xQueue :隊列句柄。
3.5.2函數(shù)框架
3.6隊列發(fā)送消息xQueueSend()
3.6.1函數(shù)原型
- xQueue:隊列句柄;
- pvItemToQueue:指針,指向要發(fā)送到隊列尾部的隊列消息;
- xTicksToWait:阻塞時間,如果隊列滿了,任務就會阻塞?xTicksToWait時間。
- 返回值:消息發(fā)送成功成功返回 pdTRUE,否則返回 errQUEUE_FULL。
3.6.2函數(shù)框架
?xQueueSend()是一個宏,宏展開是調(diào)用函數(shù) xQueueGenericSend()。
xQueueSend()用于向隊列尾部發(fā)送一個隊列消息。消息以拷貝的形式入隊,而不是以引用的形式。該函數(shù)絕對不能在中斷服務程序里面被調(diào)用,中斷中必須使用帶有中斷保護功能的 xQueueSendFromISR()來代替。?
3.7隊列發(fā)送消息xQueueGenericSend()
3.7.1函數(shù)原型
- xQueue:隊列句柄;
- pvItemToQueue:指針,指向要發(fā)送到隊列尾部的隊列消息;
- xTicksToWait:阻塞時間,如果隊列滿了,任務就會阻塞?xTicksToWait時間。
- xCopyPosition:發(fā)送數(shù)據(jù)到消息隊列的位置:
- 返回值:消息發(fā)送成功成功返回 pdTRUE,否則返回 errQUEUE_FULL。
3.7.2函數(shù)框架
3.8隊列發(fā)送消息xQueueSendFromISR()
3.8.1函數(shù)原型
3.8.2函數(shù)框架
xQueueSendFromISR也是一個宏,宏展開是調(diào)用函數(shù) xQueueGenericSendFromISR()。該宏是 xQueueSend()的中斷保護版本,用于在中斷服務程序中向隊列尾部發(fā)送一個隊列消息。
3.9隊列發(fā)送消息xQueueGenericSendFromISR()
3.9.1函數(shù)原型
- xQueue:隊列句柄;
- pvItemToQueue:指針,指向要發(fā)送到隊列尾部的隊列消息;
- pxHigherPriorityTaskWoken:如果入隊導致一個任務解鎖,并且解鎖的任務優(yōu)先級高于當前被中斷的任務,則將*pxHigherPriorityTaskWoken設置成 pdTRUE,然后在中斷退出前需要進行一次上下文切換, 去 執(zhí)行被喚醒的優(yōu)先級更高的任務 。
- 返回值:消息發(fā)送成功成功返回 pdTRUE,否則返回 errQUEUE_FULL。
3.9.2函數(shù)框架
3.10隊列發(fā)送消息xQueueReceive()
3.10.1函數(shù)原型
- xQueue:隊列句柄;
- pvBuffer:指針,指向要保存接收消息的空間;
- xTicksToWait:等待時間。
- 返回值:隊列項接收成功返回 pdTRUE ,否則返回 pdFALSE 。
3.10.2函數(shù)框架
3.11隊列發(fā)送消息xQueueReceiveFromISR()
3.11.1函數(shù)原型
- xQueue:隊列句柄;
- pvBuffer:指針,指向要保存接收消息的空間;
- pxHigherPriorityTaskWoken:如果有任務因隊列滿了阻塞發(fā)送,現(xiàn)在調(diào)用接收函數(shù)導致任務恢復,且恢復的任務優(yōu)先級高于當前被中斷的任務,則將*pxHigherPriorityTaskWoken設置成 pdTRUE,這個過程是在 xQueueReceiveFromISR函數(shù)里完成的,然后在中斷退出前需要進行一次上下文切換, 去執(zhí)行被喚醒的優(yōu)先級更高的任務。如果設置成NULL的話,函數(shù)就不會*pxHigherPriorityTaskWoken = pdTRUE;
- 隊列項接收成功返回 pdTRUE ,否則返回 pdFALSE 。