/* The example of ESP-IDF
*
* This sample code is in the public domain.
*/
#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 SendingTask( void *pvParameters )
{
ESP_LOGI(pcTaskGetName(NULL),"Start");
char
cString[PAYLOAD_SIZE];
long
MessageCount = 1000;
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");
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 )
{
ESP_LOGI(pcTaskGetName(NULL),"Start");
size_t
xReceivedBytes;
char
cReceived[PAYLOAD_SIZE];
TickType_t
FirstTick = 0;
TickType_t
LastTick, DiffTick;
for( ;; )
{
xReceivedBytes = xMessageBufferReceive( xMessageBuffer,
cReceived, sizeof( cReceived ), portMAX_DELAY );
cReceived[xReceivedBytes] = 0;
ESP_LOGD(pcTaskGetName(NULL),"cReceived=[%.*s]",
xReceivedBytes, cReceived);
if (strncmp(cReceived, "First Message", xReceivedBytes) ==
0) {
FirstTick = xTaskGetTickCount();
} else if (strncmp(cReceived, "Last Message",
xReceivedBytes) == 0) {
LastTick = xTaskGetTickCount();
DiffTick = LastTick - FirstTick;
ESP_LOGI(pcTaskGetName(NULL),"DiffTick=[%d]", DiffTick);
}
}
vTaskDelete(NULL);
}
static void RingReceivingTask( void *pvParameters )
{
ESP_LOGI(pcTaskGetName(NULL),"Start");
size_t
xReceivedBytes;
TickType_t
FirstTick = 0;
TickType_t
LastTick, DiffTick;
for( ;; )
{
char *cReceived = (char *)xRingbufferReceive( xRingBuffer,
&xReceivedBytes, portMAX_DELAY );
ESP_LOGD(pcTaskGetName(NULL),"cReceived=[%.*s]",
xReceivedBytes, cReceived);
if (strncmp(cReceived, "First Message", xReceivedBytes) ==
0) {
FirstTick = xTaskGetTickCount();
} else if (strncmp(cReceived, "Last Message",
xReceivedBytes) == 0) {
LastTick = xTaskGetTickCount();
DiffTick = LastTick - FirstTick;
ESP_LOGI(pcTaskGetName(NULL),"DiffTick=[%d]", DiffTick);
}
//Return Item
vRingbufferReturnItem(xRingBuffer, (void *)cReceived);
}
vTaskDelete(NULL);
}
void app_main()
{
// Create
Message Buffer
xMessageBuffer
= xMessageBufferCreate( BUFFER_SIZE );
configASSERT(
xMessageBuffer );
// Create Ring
Buffer
xRingBuffer =
xRingbufferCreate(BUFFER_SIZE, RINGBUF_TYPE_NOSPLIT);
configASSERT(
xRingBuffer );
xTaskCreate(
&SendingTask, "SEND", 1024*2, NULL, 1, NULL );
xTaskCreate(
&MessageReceivingTask, "MESSAGE", 1024*2, NULL, 1,
NULL );
xTaskCreate(
&RingReceivingTask, "RING", 1024*2, NULL, 1, NULL );
} |