007-ESP32_SDK開發-使用緩存管理傳遞數據


<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 );

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM