From 1402941402512f4777c05fcfac166bf79cbfce1d Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Thu, 24 Dec 2020 01:55:10 +0100 Subject: [PATCH] test/freertos: add RISC-V support in thread local storage test --- components/freertos/test/test_thread_local.c | 52 +++++++++++--------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/components/freertos/test/test_thread_local.c b/components/freertos/test/test_thread_local.c index 96b6645d8b..ad3ed7302a 100644 --- a/components/freertos/test/test_thread_local.c +++ b/components/freertos/test/test_thread_local.c @@ -3,6 +3,7 @@ */ #include +#include #include #include "freertos/FreeRTOS.h" @@ -11,7 +12,12 @@ #include "test_utils.h" #include "sdkconfig.h" -#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32C3) +#if defined(__XTENSA__) +#define GET_THREADPTR(tp_dest) do { asm volatile ("rur.threadptr %0":"=r"(tp_dest)); } while(0) +#elif defined (__riscv) +#define GET_THREADPTR(tp_dest) do { register uint32_t _tp asm("tp"); tp_dest = _tp; } while(0) +#endif + static __thread int tl_test_var1; static __thread uint8_t tl_test_var2 = 55; @@ -27,17 +33,19 @@ static __thread struct test_tls_var { static void task_test_tls(void *arg) { bool *running = (bool *)arg; - uint32_t tp = (uint32_t)-1; + uint32_t tp = (uint32_t) -1; int test_var1_old = 0; uint8_t test_var2_old = 0; uint16_t test_var3_old = 0; int f32_old = 0; uint8_t f8_old = 0; uint16_t f16_old = 0; + srand((int) xTaskGetCurrentTaskHandle()); + int step = (rand() % 10) + 1; - asm volatile ("rur.threadptr %0":"=r"(tp)); + GET_THREADPTR(tp); for (int i = 0; i < 5; i++) { - printf("Task[%x]: var = 0x%x 0x%x\n", tp, tl_test_var1, tl_test_var2); + printf("Task[%x]: var = 0x%x 0x%x step=%d\n", tp, tl_test_var1, tl_test_var2, step); if (i == 0) { TEST_ASSERT_EQUAL(0, tl_test_var1); TEST_ASSERT_EQUAL(55, tl_test_var2); @@ -52,33 +60,34 @@ static void task_test_tls(void *arg) TEST_ASSERT_EQUAL(0, tl_test_struct_var.farr[k]); } } else { - TEST_ASSERT_EQUAL(test_var1_old+1, tl_test_var1); - TEST_ASSERT_EQUAL(test_var2_old+1, tl_test_var2); - TEST_ASSERT_EQUAL(test_var3_old+1, tl_test_var3); + TEST_ASSERT_EQUAL(test_var1_old + step, tl_test_var1); + TEST_ASSERT_EQUAL(test_var2_old + step, tl_test_var2); + TEST_ASSERT_EQUAL(test_var3_old + step, tl_test_var3); for (int k = 0; k < sizeof(tl_test_arr_var); k++) { - TEST_ASSERT_EQUAL(i-1, tl_test_arr_var[k]); + TEST_ASSERT_EQUAL((i - 1) * step, tl_test_arr_var[k]); } - TEST_ASSERT_EQUAL(f32_old+1, tl_test_struct_var.f32); - TEST_ASSERT_EQUAL(f8_old+1, tl_test_struct_var.f8); - TEST_ASSERT_EQUAL(f16_old+1, tl_test_struct_var.f16); + TEST_ASSERT_EQUAL(f32_old + step, tl_test_struct_var.f32); + TEST_ASSERT_EQUAL(f8_old + step, tl_test_struct_var.f8); + TEST_ASSERT_EQUAL(f16_old + step, tl_test_struct_var.f16); for (int k = 0; k < sizeof(tl_test_struct_var.farr); k++) { - TEST_ASSERT_EQUAL(i-1, tl_test_struct_var.farr[k]); + TEST_ASSERT_EQUAL((i - 1) * step, tl_test_struct_var.farr[k]); } } + test_var1_old = tl_test_var1; test_var2_old = tl_test_var2; test_var3_old = tl_test_var3; f32_old = tl_test_struct_var.f32; f8_old = tl_test_struct_var.f8; f16_old = tl_test_struct_var.f16; - tl_test_var1++; - tl_test_var2++; - tl_test_var3++; - memset(tl_test_arr_var, i, sizeof(tl_test_arr_var)); - tl_test_struct_var.f32++; - tl_test_struct_var.f8++; - tl_test_struct_var.f16++; - memset(tl_test_struct_var.farr, i, sizeof(tl_test_struct_var.farr)); + tl_test_var1 += step; + tl_test_var2 += step; + tl_test_var3 += step; + memset(tl_test_arr_var, i * step, sizeof(tl_test_arr_var)); + tl_test_struct_var.f32 += step; + tl_test_struct_var.f8 += step; + tl_test_struct_var.f16 += step; + memset(tl_test_struct_var.farr, i * step, sizeof(tl_test_struct_var.farr)); vTaskDelay(10); } @@ -103,10 +112,9 @@ TEST_CASE("TLS test", "[freertos]") xTaskCreatePinnedToCore((TaskFunction_t)&task_test_tls, "task_test_tls", stack_size, &running[0], UNITY_FREERTOS_PRIORITY, NULL, 0); xTaskCreateStaticPinnedToCore((TaskFunction_t)&task_test_tls, "task_test_tls", stack_size, &running[1], - UNITY_FREERTOS_PRIORITY, s_stack, &s_task, other_core); + UNITY_FREERTOS_PRIORITY, s_stack, &s_task, other_core); while (running[0] || running[1]) { vTaskDelay(10); } vTaskDelay(10); /* Make sure idle task can clean up s_task, before it goes out of scope */ } -#endif // #if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32C3)