mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-11-04 14:14:11 +00:00 
			
		
		
		
	Apply the pre-commit hook whitespace fixes to all files in the repo. (Line endings, blank lines at end of file, trailing whitespace)
		
			
				
	
	
		
			104 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <string.h>
 | 
						|
#include "freertos/FreeRTOS.h"
 | 
						|
#include "freertos/task.h"
 | 
						|
#include "freertos/semphr.h"
 | 
						|
#include "freertos/stream_buffer.h"
 | 
						|
#include "freertos/message_buffer.h"
 | 
						|
#include "unity.h"
 | 
						|
#include "test_utils.h"
 | 
						|
 | 
						|
typedef struct {
 | 
						|
    StreamBufferHandle_t sb;
 | 
						|
    SemaphoreHandle_t end_test;
 | 
						|
    bool send_fail;
 | 
						|
    bool receive_fail;
 | 
						|
    bool produce_isr;
 | 
						|
}test_context;
 | 
						|
 | 
						|
static void producer_task(void *arg)
 | 
						|
{
 | 
						|
    test_context *tc  = arg;
 | 
						|
    uint8_t produced = 0;
 | 
						|
    printf("Starting sender task... \n");
 | 
						|
 | 
						|
    while(produced < 100) {
 | 
						|
 | 
						|
        if(!tc->produce_isr) {
 | 
						|
            BaseType_t result = xStreamBufferSend(tc->sb, &produced, 1, 0);
 | 
						|
            if(!result) {
 | 
						|
                tc->send_fail = true;
 | 
						|
                xSemaphoreGive(tc->end_test);
 | 
						|
                vTaskDelete(NULL);
 | 
						|
            } else {
 | 
						|
                produced++;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        vTaskDelay(1);
 | 
						|
    }
 | 
						|
 | 
						|
    tc->send_fail = false;
 | 
						|
    vTaskDelete(NULL);
 | 
						|
}
 | 
						|
 | 
						|
static void receiver_task(void *arg)
 | 
						|
{
 | 
						|
    test_context *tc = arg;
 | 
						|
    uint8_t expected_consumed = 0;
 | 
						|
    printf("Starting receiver task... \n");
 | 
						|
 | 
						|
    for(;;){
 | 
						|
         uint8_t read_byte = 0xFF;
 | 
						|
         uint32_t result = xStreamBufferReceive(tc->sb, &read_byte, 1, 1000);
 | 
						|
 | 
						|
         if((read_byte != expected_consumed) || !result) {
 | 
						|
            tc->receive_fail = true;
 | 
						|
            xSemaphoreGive(tc->end_test);
 | 
						|
            vTaskDelete(NULL);
 | 
						|
         } else {
 | 
						|
             expected_consumed++;
 | 
						|
             if(expected_consumed == 99) {
 | 
						|
                 break;
 | 
						|
             }
 | 
						|
         }
 | 
						|
    }
 | 
						|
 | 
						|
    tc->receive_fail = false;
 | 
						|
    xSemaphoreGive(tc->end_test);
 | 
						|
    vTaskDelete(NULL);
 | 
						|
}
 | 
						|
 | 
						|
TEST_CASE("Send-receive stream buffer test", "[freertos]")
 | 
						|
{
 | 
						|
    BaseType_t result;
 | 
						|
    test_context tc;
 | 
						|
 | 
						|
    tc.sb = xStreamBufferCreate(128, 1);
 | 
						|
    tc.end_test = xSemaphoreCreateBinary();
 | 
						|
 | 
						|
    TEST_ASSERT(tc.sb);
 | 
						|
    TEST_ASSERT(tc.end_test);
 | 
						|
 | 
						|
    tc.send_fail = false;
 | 
						|
    tc.receive_fail = false;
 | 
						|
    tc.produce_isr = false;
 | 
						|
 | 
						|
    result = xTaskCreatePinnedToCore(producer_task, "sender", 4096, &tc, UNITY_FREERTOS_PRIORITY + 2, NULL, 0);
 | 
						|
    TEST_ASSERT(result == pdTRUE);
 | 
						|
    result = xTaskCreatePinnedToCore(receiver_task, "receiver", 4096, &tc, UNITY_FREERTOS_PRIORITY + 1, NULL, 1);
 | 
						|
    TEST_ASSERT(result == pdTRUE);
 | 
						|
 | 
						|
    result = xSemaphoreTake(tc.end_test, 2000);
 | 
						|
    TEST_ASSERT(result == pdTRUE);
 | 
						|
 | 
						|
    vTaskDelay(1);
 | 
						|
 | 
						|
    TEST_ASSERT(tc.send_fail == false);
 | 
						|
    TEST_ASSERT(tc.receive_fail == false);
 | 
						|
 | 
						|
    vStreamBufferDelete(tc.sb);
 | 
						|
    vSemaphoreDelete(tc.end_test);
 | 
						|
}
 |