-
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