<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/LearnESP32" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
說明
esp32里面跑的是freertos,如果需要傳遞數據需要使用內部的緩存管理.
代碼
#include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" #include "driver/gpio.h" char data[10]="01234567"; static xQueueHandle xQueueHandle1 = NULL; //任務函數 static void function(void *pvParameters) { char datarecv[12]; while(1) { //如果緩存里面有數據;則取出數據(存儲到datarecv); 無限期的等着(portMAX_DELAY),直到有數據 if(xQueueReceive(xQueueHandle1, &datarecv, portMAX_DELAY)) { printf("datarecv=%s\n", datarecv); fflush(stdout); } } } //任務函數 static void function_1(void *pvParameters) { while(1) { vTaskDelay(1000 / portTICK_PERIOD_MS);//延時約1000ms //向緩存管理中存儲數據; 如果緩存不夠,則等待(最長等待10ms); 存儲失敗返回 pdFALSE xQueueSend(xQueueHandle1, (void *) &data, 10/portTICK_PERIOD_MS); } } void app_main(void) { //初始化緩存管理,緩存數據的最大條數是5條,每條數據的長度是10字節 xQueueHandle1 = xQueueCreate(5, 10); xTaskCreate(function, "function", 2048, NULL, 10, NULL); xTaskCreate(function_1, "function_1", 2048, NULL, 11, NULL); }
注意
初始化緩存的時候設置的數據長度是10字節
往緩存里面存儲數據的時候,內部就會拷貝10字節.
所以大家伙一定要記住:你設置了緩存時的每一條數據是多大小,那么每次往緩存里面放數據的時候,內部就會拷貝多大小的數據.
如果在中斷里面發送數據需要使用下面的函數(在后面的gpio章節中使用了這個)
xQueueSendFromISR
xQueueSendFromISR 和 xQueueSend 函數前兩個參數相同
xQueueSendFromISR 的最后一個參數可以寫 null
最后一個參數用於保存是否有高優先級任務准備就緒。
如果函數執行完畢后,此參數的數值是pdTRUE,說明有高優先級任務要執行,否則沒有
portBASE_TYPE xHigherPriorityTaskWoken;
xQueueSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
if( xHigherPriorityTaskWoken ){ /* 實際宏使用了特殊接口 */ 有高優先級別的任務要運行,可以在此切換任務. }
如果在中斷里面接收數據需要使用下面的函數
xQueueSendFromISR( xQueueHandle pxQueue, const void *pvItemToQueue, portBASE_TYPE *pxHigherPriorityTaskWoken );