ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ESP-IDF FreeRTOS - Buffer (vscode)
    소프트웨어 2023. 3. 30. 13:07

    #esp32 윈도우 vscode 환경
    #선행(필수) ESP-IDF 윈도우 개발환경 세팅(vscode)
    #선행(필수) ESP-IDF 외부 폴더에서 예제 파일 실행(vscode)
    #선행(필수) ESP-IDF FreeRTOS - Task Create 포스트 예정
    #선행(추천) ESP-IDF - Queue 포스트 예정


    1) Stream buffer

    하나의 Task에서 다른 Task로 데이터를 전달하기 위한 방법입니다.

    #include <stdio.h>
    #include <string.h>
    #include "freertos/FreeRTOS.h"
    #include "freertos/task.h"
    #include "freertos/stream_buffer.h"
    
    StreamBufferHandle_t StreamBufferHanle = NULL;
    
    void task_send(void *pvParam)
    {
        char buffer[7];
        int send_byte = 0;
    
        while(1)
        {
            sprintf(buffer, "Hello\n");
            send_byte = xStreamBufferSend(StreamBufferHanle, buffer, 6, portMAX_DELAY);
            printf("task_send : buf_len = %d, send_byte = %d\n",6, send_byte);
            vTaskDelay(3000 / portTICK_PERIOD_MS);
        }
    }
    
    
    void task_recv(void *pvParam)
    {
        vTaskDelay(10 / portTICK_PERIOD_MS);
        char buffer[7];
        int recv_byte = 0;
    
        while(1)
        {
            memset(buffer, 0, sizeof(buffer));
            recv_byte = xStreamBufferReceive(StreamBufferHanle, buffer, 6, portMAX_DELAY);
            printf("task_recv : recv_byte = %d, data = %s \n",recv_byte, buffer);
            vTaskDelay(1000 / portTICK_PERIOD_MS);
        }
    }
    
    
    void app_main(void) {
        StreamBufferHanle = xStreamBufferCreate(10, 1); // 10 bytes, 1 byte per item
        if(StreamBufferHanle != NULL)
        {
            xTaskCreate (task_send, "task_send", 2048, NULL, 5, NULL);
            xTaskCreate (task_recv, "task_recv", 2048, NULL, 5, NULL);
        }
        else
        {
            printf("Fail to create stream buffer!\n");
        }
    }

     
     
    app_main()의
    xStreamBufferCreate(10, 1)코드로 아래 10byte 공간이 SRAM에 준비 됩니다.

    파라미터 '1' : Stream Buffer에 1byte만 들어와도 access 가능합니다.

     
    task_send()의
    xStreamBufferSend(StreamBufferHanle, buffer, 6, portMAX_DELAY);
    portMAX_DELAY : Stream buffer 에 최소 6byte의 빈 공간이 있을 때 까지 기다렸다가,
    buffer 배열 'H' 'e' 'l' 'l' 'o' '\n' '\0'에서 Stream buffer 버퍼로 6byte 만큼 들어갑니다.

     
    task_resv()의
    recv_byte = xStreamBufferReceive(StreamBufferHanle, buffer, 6, portMAX_DELAY); 
    portMAX_DELAY : Stream buffer 에 1byte라도 값이 있으면,
    6byte 단위로 읽어와 buffer에 저장하고 Stream buffer에 있던 6byte는 지워집니다.

     

     

    2) Message buffer

    Stream buffer와 Message buffer의 차이점은, 

    데이터를 연속적으로 다루는지 (Stream buffer)

    버퍼로 보낼 때의 데이터를 한 덩어리로 다루는지 입니다. (Message buffer)

    Stream buffer는 데이터가 연속적으로 저장되고,

    받는 쪽에서 원하는 크기 만큼 받을 수 있습니다.

    위 그림은 수신 쪽에서 버퍼의 데이터를 읽어오려는 시점에,

    발송 쪽에서 보내진 두 개의"Hello\n"이 저장되어 있습니다.

    받는 쪽에서 Stream buffer 값을 읽어올 때는 지정한 길이 만큼 읽어올 수 있습니다.

    20byte 단위로 읽오 온다면 "Hello\n" "Hello\n" 이 한 번에 읽혀 들어옵니다.

     

    반면 Message buffer는,

    Message buffer에 저장된 "Hello\n" "Hello\n"를 읽어들일 때,

    전송된 단위 만큼 읽어오게 됩니다.

    첫 번째 읽어 올 때 "Hello\n"값이 들어오고 Message buffer에는 "Hello\n" 하나가 그대로 남아 있습니다.

    두 번째 읽어 올 때 나머지 "Hello\n" 값이 읽혀 들어옵니다.

    *Message buffer에 데이터가 들어올 때 데이터 앞 4byte는 데이터의 길이가 저장되어 데이터를 읽을 때 단위를 끊을 수 있습니다.

     

     

    *공부하는 입장에서 정리중인 자료들 입니다.


    ESP-IDF 윈도우 개발환경 세팅 (VSCODE)
    ESP-IDF 외부 폴더에서 예제 파일 실행 (VSCODE)
    ESP-IDF GPIO 인풋, 아웃풋 (VSCODE)
    ESP-IDF 인터럽트 (VSCODE)

    ESP-IDF 디바운싱 (esp32, vscode)
    ESP-IDF .c .h 참조 cMakeLists (vscode)

    ESP-IDF components 참조 cMakeLists (vscode)
    ESP-IDF LCD 출력(vscode)
    ESP-IDF 메모리 - Flash (vscode)
    ESP-IDF 메모리 - SRAM (vscode)
    ESP-IDF FreeRTOS - buffer (vscode)

    ESP-IDF 쿨링팬 FG센서, PWM제어(vscode)



    <포스트 예정>
    *ESP-IDF 메모리 - ROM
    *LCD - 메뉴 만들고 버튼으로 메뉴 이동(터미널로 작업)
    *LCD - 2차원 배열로 메뉴 진입, 뒤로가기(터미널로 작업)
    *LCD - 메뉴 만든 것 LCD 출력
    *LCD - 메뉴 UI 제작.  연두색 블럭은 메인 메뉴 회색 블럭은 서브 메뉴
            (1.팬  1-1.ON  1-2.OFF  1-3.BACK   2.LED  2-1.밝기 약  2-2.밝기 중  2-3.밝기 강   2-4.BACK   3.빛 밝기 출력 lux(+PPFD 변환)
    *Easy EDA툴 활용하여 커스텀 ESP32 보드 제작
    *LCD - LCD , 팬 , 펌프 ,  ESP32 연결 가능한 PCB 제작 주문.
    *LCD - 간이 스마트팜 제작
    *ESP32 JTAG 디버그
    *FreeRTOS
    *FreeRTOS - QUEUE
    *FreeRTOS - timer
    *FreeRTOS - Semaphore , mutex
    *FreeRTOS - event group , notification
    *ESP-IDF I2C SPI UART
    *ESP-IDF wifi
    *ESP-IDF MQTT
    *ESP-IDF Server (XAMPP 로컬 서버 연결)
    *DIY 컨테이너 / 유리온실 스마트팜 제작

     

     
     
     
     
     
     
     
     
     
     
     
     
     
     
     

    '소프트웨어' 카테고리의 다른 글

    ESP32 PIN-OUT  (0) 2023.04.12
    ESP-IDF 쿨링팬 FG센서, PWM제어(vscode)  (0) 2023.04.11
    ESP-IDF 메모리 - SRAM (vscode)  (0) 2023.03.28
    ESP-IDF 메모리 - Flash (vscode)  (0) 2023.03.25
    ESP-IDF LCD 예제(vscode)  (0) 2023.03.25
Designed by PixelSpace