#include <stdio.h>
#include <inttypes.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/ringbuf.h"
#include "freertos/message_buffer.h"
#include "esp_log.h"
/* Size of buffer */
#define BUFFER_SIZE 1000
/* Size of payload */
#define PAYLOAD_SIZE 100
static MessageBufferHandle_t xMessageBuffer;
static RingbufHandle_t xRingBuffer;
static void MessageSendingTask( void *pvParameters )
{
TaskHandle_t
ParentTaskHandle = (TaskHandle_t)pvParameters;
ESP_LOGI(pcTaskGetName(NULL),"Start");
char
cString[PAYLOAD_SIZE];
long
MessageCount = 10000;
sprintf(
cString, "First Message");
xMessageBufferSend( xMessageBuffer, ( void * ) cString,
strlen(cString), portMAX_DELAY );
for(long i=0;
i<MessageCount; i++) {
sprintf(cString, "Message is %ld", i);
xMessageBufferSend( xMessageBuffer, ( void * ) cString,
strlen(cString), portMAX_DELAY );
}
sprintf(
cString, "Last Message");
xMessageBufferSend( xMessageBuffer, ( void * ) cString,
strlen(cString), portMAX_DELAY );
ESP_LOGI(pcTaskGetName(NULL),"xMessageBufferSend Finish");
vTaskDelete(NULL);
}
static void RingSendingTask( void *pvParameters )
{
TaskHandle_t
ParentTaskHandle = (TaskHandle_t)pvParameters;
ESP_LOGI(pcTaskGetName(NULL),"Start");
char
cString[PAYLOAD_SIZE];
long
MessageCount = 10000;
sprintf(
cString, "First Message");
xRingbufferSend( xRingBuffer, ( void * ) cString,
strlen(cString), portMAX_DELAY );
for(long i=0;
i<MessageCount; i++) {
sprintf( cString, "Message is %ld", i );
xRingbufferSend( xRingBuffer, ( void * ) cString,
strlen(cString), portMAX_DELAY );
}
sprintf(
cString, "Last Message");
xRingbufferSend( xRingBuffer, ( void * ) cString,
strlen(cString), portMAX_DELAY );
ESP_LOGI(pcTaskGetName(NULL),"xRingBufferSend Finish");
vTaskDelete(NULL);
}
static void MessageReceivingTask( void *pvParameters )
{
TaskHandle_t
ParentTaskHandle = (TaskHandle_t)pvParameters;
ESP_LOGI(pcTaskGetName(NULL),"Start");
size_t
xReceivedBytes;
char
cReceived[PAYLOAD_SIZE];
TickType_t
FirstTick = 0;
TickType_t
LastTick, DiffTick;
bool running =
true;
while (running)
{
xReceivedBytes = xMessageBufferReceive( xMessageBuffer,
cReceived, sizeof( cReceived ), portMAX_DELAY );
cReceived[xReceivedBytes] = 0;
ESP_LOGD(pcTaskGetName(NULL),"cReceived=[%.*s]",
xReceivedBytes, cReceived);
if (strncmp(cReceived, "First Message", strlen("First
Message")) == 0) {
FirstTick = xTaskGetTickCount();
} else if (strncmp(cReceived, "Last Message", strlen("Last
Message")) == 0) {
LastTick = xTaskGetTickCount();
DiffTick = LastTick - FirstTick;
ESP_LOGI(pcTaskGetName(NULL),"DiffTick=[%"PRIu32"]",
DiffTick);
running = false;
}
}
xTaskNotifyGive( ParentTaskHandle );
ESP_LOGI(pcTaskGetName(NULL),"Finish");
vTaskDelete(NULL);
}
static void RingReceivingTask( void *pvParameters )
{
TaskHandle_t
ParentTaskHandle = (TaskHandle_t)pvParameters;
ESP_LOGI(pcTaskGetName(NULL),"Start");
size_t
xReceivedBytes;
TickType_t
FirstTick = 0;
TickType_t
LastTick, DiffTick;
bool running =
true;
while (running)
{
char *cReceived = (char *)xRingbufferReceive( xRingBuffer,
&xReceivedBytes, portMAX_DELAY );
ESP_LOGD(pcTaskGetName(NULL),"cReceived=[%.*s]",
xReceivedBytes, cReceived);
if (strncmp(cReceived, "First Message", strlen("First
Message")) == 0) {
FirstTick = xTaskGetTickCount();
} else if (strncmp(cReceived, "Last Message", strlen("Last
Message")) == 0) {
LastTick = xTaskGetTickCount();
DiffTick = LastTick - FirstTick;
ESP_LOGI(pcTaskGetName(NULL),"DiffTick=[%"PRIu32"]",
DiffTick);
running = false;
}
//Return Item
vRingbufferReturnItem(xRingBuffer, (void *)cReceived);
}
ESP_LOGI(pcTaskGetName(NULL),"Finish");
vTaskDelete(NULL);
}
void app_main()
{
TaskHandle_t
ParentTaskHandle = xTaskGetCurrentTaskHandle();
// Create
Message Buffer
xMessageBuffer
= xMessageBufferCreate( BUFFER_SIZE );
configASSERT(
xMessageBuffer );
// Create Ring
Buffer
xRingBuffer =
xRingbufferCreate(BUFFER_SIZE, RINGBUF_TYPE_NOSPLIT);
configASSERT(
xRingBuffer );
xTaskCreate(
&MessageSendingTask, "MSEND", 1024*2, (void
*)ParentTaskHandle, 1, NULL );
xTaskCreate(
&MessageReceivingTask, "MESSAGE", 1024*2, (void
*)ParentTaskHandle, 1, NULL );
uint32_t value
= ulTaskNotifyTake( pdTRUE, portMAX_DELAY );
ESP_LOGI(pcTaskGetName(NULL), "ulTaskNotifyTake
value=0x%"PRIx32, value);
xTaskCreate(
&RingSendingTask, "RSEND", 1024*2, (void
*)ParentTaskHandle, 1, NULL );
xTaskCreate(
&RingReceivingTask, "RING", 1024*2, (void
*)ParentTaskHandle, 1, NULL );
} |