forked from espressif/esp-idf
		
	
		
			
	
	
		
			94 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			94 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <esp_types.h>
							 | 
						||
| 
								 | 
							
								#include <stdio.h>
							 | 
						||
| 
								 | 
							
								#include <stdlib.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "freertos/FreeRTOS.h"
							 | 
						||
| 
								 | 
							
								#include "freertos/task.h"
							 | 
						||
| 
								 | 
							
								#include "freertos/semphr.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "unity.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "soc/uart_reg.h"
							 | 
						||
| 
								 | 
							
								#include "soc/dport_reg.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static volatile bool exit_flag;
							 | 
						||
| 
								 | 
							
								static bool dport_test_result;
							 | 
						||
| 
								 | 
							
								static bool apb_test_result;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static void accessDPORT(void *pvParameters)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    xSemaphoreHandle *sema = (xSemaphoreHandle *) pvParameters;
							 | 
						||
| 
								 | 
							
								    uint32_t dport_date = DPORT_REG_READ(DPORT_DATE_REG);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    dport_test_result = true;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // although exit flag is set in another task, checking (exit_flag == false) is safe
							 | 
						||
| 
								 | 
							
								    while (exit_flag == false) {
							 | 
						||
| 
								 | 
							
								        if (dport_date != DPORT_REG_READ(DPORT_DATE_REG)) {
							 | 
						||
| 
								 | 
							
								            dport_test_result = false;
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    xSemaphoreGive(*sema);
							 | 
						||
| 
								 | 
							
								    vTaskDelete(NULL);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static void accessAPB(void *pvParameters)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    xSemaphoreHandle *sema = (xSemaphoreHandle *) pvParameters;
							 | 
						||
| 
								 | 
							
								    uint32_t uart_date = REG_READ(UART_DATE_REG(0));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    apb_test_result = true;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // although exit flag is set in another task, checking (exit_flag == false) is safe
							 | 
						||
| 
								 | 
							
								    while (exit_flag == false) {
							 | 
						||
| 
								 | 
							
								        if (uart_date != REG_READ(UART_DATE_REG(0))) {
							 | 
						||
| 
								 | 
							
								            apb_test_result = false;
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    xSemaphoreGive(*sema);
							 | 
						||
| 
								 | 
							
								    vTaskDelete(NULL);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TEST_CASE("access DPORT and APB at same time", "[esp32]")
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    int i;
							 | 
						||
| 
								 | 
							
								    TaskHandle_t th[2];
							 | 
						||
| 
								 | 
							
								    xSemaphoreHandle exit_sema[2];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for (i=0; i<2; i++) {
							 | 
						||
| 
								 | 
							
								        exit_sema[i] = xSemaphoreCreateMutex();
							 | 
						||
| 
								 | 
							
								        xSemaphoreTake(exit_sema[i], portMAX_DELAY);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    exit_flag = false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef CONFIG_FREERTOS_UNICORE
							 | 
						||
| 
								 | 
							
								    printf("assign task accessing DPORT to core 0 and task accessing APB to core 1\n");
							 | 
						||
| 
								 | 
							
								    xTaskCreatePinnedToCore(accessDPORT  , "accessDPORT"  , 2048, &exit_sema[0], UNITY_FREERTOS_PRIORITY - 1, &th[0], 0);
							 | 
						||
| 
								 | 
							
								    xTaskCreatePinnedToCore(accessAPB  , "accessAPB"  , 2048, &exit_sema[1], UNITY_FREERTOS_PRIORITY - 1, &th[1], 1);
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    printf("assign task accessing DPORT and accessing APB\n");
							 | 
						||
| 
								 | 
							
								    xTaskCreate(accessDPORT  , "accessDPORT"  , 2048, &exit_sema[0], UNITY_FREERTOS_PRIORITY - 1, &th[0]);
							 | 
						||
| 
								 | 
							
								    xTaskCreate(accessAPB  , "accessAPB"  , 2048, &exit_sema[1], UNITY_FREERTOS_PRIORITY - 1, &th[1]);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    printf("start wait for 10 seconds\n");
							 | 
						||
| 
								 | 
							
								    vTaskDelay(10000 / portTICK_PERIOD_MS);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // set exit flag to let thread exit
							 | 
						||
| 
								 | 
							
								    exit_flag = true;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for (i=0; i<2; i++) {
							 | 
						||
| 
								 | 
							
								        xSemaphoreTake(exit_sema[i], portMAX_DELAY);
							 | 
						||
| 
								 | 
							
								        vSemaphoreDelete(exit_sema[i]);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    TEST_ASSERT(dport_test_result == true && apb_test_result == true);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 |