From 38eb3fc40f817ea1dce5223a9bac0d2d3b578bd2 Mon Sep 17 00:00:00 2001 From: Yaochenger <75192526+Yaochenger@users.noreply.github.com> Date: Thu, 30 Mar 2023 11:06:21 +0800 Subject: [PATCH] =?UTF-8?q?[utest][atomic]=E6=B7=BB=E5=8A=A0=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E5=80=BC=E6=B5=8B=E8=AF=95=20(#7124)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [utest][atomic]添加返回值测试 --- examples/utest/testcases/kernel/atomic_tc.c | 53 +++++++++++++++------ libcpu/arm/common/atomic_arm.c | 4 +- libcpu/risc-v/common/atomic_riscv.c | 2 +- 3 files changed, 41 insertions(+), 18 deletions(-) diff --git a/examples/utest/testcases/kernel/atomic_tc.c b/examples/utest/testcases/kernel/atomic_tc.c index 53b1839e4f..a83c05f730 100644 --- a/examples/utest/testcases/kernel/atomic_tc.c +++ b/examples/utest/testcases/kernel/atomic_tc.c @@ -29,52 +29,67 @@ static void test_atomic_api(void) { rt_atomic_t base; rt_atomic_t oldval; + rt_atomic_t result; /* rt_atomic_t */ uassert_true(sizeof(rt_atomic_t) == ATOMIC_WORD(sizeof(uint64_t), sizeof(uint32_t))); /* rt_atomic_add */ base = 0; - rt_atomic_add(&base, 10); + result = rt_atomic_add(&base, 10); uassert_true(base == 10); + uassert_true(result == 0); /* rt_atomic_add negative */ base = 2; - rt_atomic_add(&base, -4); + result = rt_atomic_add(&base, -4); uassert_true(base == -2); + uassert_true(result == 2); /* rt_atomic_sub */ base = 11; - rt_atomic_sub(&base, 10); + result = rt_atomic_sub(&base, 10); uassert_true(base == 1); + uassert_true(result == 11); /* rt_atomic_sub negative */ base = 2; - rt_atomic_sub(&base, -5); + result = rt_atomic_sub(&base, -5); uassert_true(base == 7); + uassert_true(result == 2); /* rt_atomic_or */ base = 0xFF00; - rt_atomic_or(&base, 0x0F0F); + result = rt_atomic_or(&base, 0x0F0F); uassert_true(base == 0xFF0F); + uassert_true(result == 0xFF00); /* rt_atomic_xor */ base = 0xFF00; - rt_atomic_xor(&base, 0x0F0F); + result = rt_atomic_xor(&base, 0x0F0F); uassert_true(base == 0xF00F); + uassert_true(result == 0xFF00); /* rt_atomic_and */ base = 0xFF00; - rt_atomic_and(&base, 0x0F0F); + result = rt_atomic_and(&base, 0x0F0F); uassert_true(base == 0x0F00); + uassert_true(result == 0xFF00); /* rt_atomic_exchange */ base = 0xFF00; - rt_atomic_exchange(&base, 0x0F0F); + result = rt_atomic_exchange(&base, 0x0F0F); uassert_true(base == 0x0F0F); + uassert_true(result == 0xFF00); - /* rt_atomic_flag_test_and_set */ + /* rt_atomic_flag_test_and_set (Flag 0) */ base = 0x0; - rt_atomic_flag_test_and_set(&base); + result = rt_atomic_flag_test_and_set(&base); uassert_true(base == 0x1); + uassert_true(result == 0x0); + /* rt_atomic_flag_test_and_set (Flag 1) */ + base = 0x1; + result = rt_atomic_flag_test_and_set(&base); + uassert_true(base == 0x1); + uassert_true(result == 0x1); /* rt_atomic_flag_clear */ base = 0x1; @@ -83,25 +98,33 @@ static void test_atomic_api(void) /* rt_atomic_load */ base = 0xFF00; - rt_atomic_load(&base); + result = rt_atomic_load(&base); uassert_true(base == 0xFF00); + uassert_true(result == 0xFF00); /* rt_atomic_store */ base = 0xFF00; rt_atomic_store(&base, 0x0F0F); uassert_true(base == 0x0F0F); - /* rt_atomic_compare_exchange_strong */ + /* rt_atomic_compare_exchange_strong (equal) */ base = 10; oldval = 10; - uassert_true(rt_atomic_compare_exchange_strong(&base, &oldval, 11) == 1); + result = rt_atomic_compare_exchange_strong(&base, &oldval, 11); uassert_true(base == 11); + uassert_true(result == 0x1); + /* rt_atomic_compare_exchange_strong (not equal) */ + base = 10; + oldval = 5; + result = rt_atomic_compare_exchange_strong(&base, &oldval, 11); + uassert_true(base == 10); + uassert_true(result == 0x0); } static void ture_entry(void *parameter) { int i; - for(i = 0; i < 1000000; i++) + for (i = 0; i < 1000000; i++) { rt_atomic_add(&count, 1); } @@ -122,7 +145,7 @@ static void test_atomic_add(void) thread = rt_thread_create("t3", ture_entry, RT_NULL, THREAD_STACKSIZE, THREAD_PRIORITY, THREAD_TIMESLICE); rt_thread_startup(thread); - for(i = 0; i < 3; i++) + for (i = 0; i < 3; i++) { rt_sem_take(sem_t, RT_WAITING_FOREVER); } diff --git a/libcpu/arm/common/atomic_arm.c b/libcpu/arm/common/atomic_arm.c index 81ada079f3..bcdb496317 100644 --- a/libcpu/arm/common/atomic_arm.c +++ b/libcpu/arm/common/atomic_arm.c @@ -77,7 +77,7 @@ rt_atomic_t rt_hw_atomic_load(volatile rt_atomic_t *ptr) { oldval = __LDREXW(ptr); } while ((__STREXW(oldval, ptr)) != 0U); - return *ptr; + return oldval; } void rt_hw_atomic_store(volatile rt_atomic_t *ptr, rt_atomic_t val) @@ -166,7 +166,7 @@ rt_atomic_t rt_hw_atomic_flag_test_and_set(volatile rt_atomic_t *ptr) return oldval; } -rt_atomic_t rt_hw_atomic_compare_exchange_strong(volatile rt_atomic_t *ptr, rt_atomic_t *old, rt_atomic_t new) +rt_atomic_t rt_hw_atomic_compare_exchange_strong(volatile rt_atomic_t *ptr, volatile rt_atomic_t *old, rt_atomic_t new) { rt_atomic_t result; rt_atomic_t temp = *old; diff --git a/libcpu/risc-v/common/atomic_riscv.c b/libcpu/risc-v/common/atomic_riscv.c index 8a9ef2c8f5..6a8cb99787 100644 --- a/libcpu/risc-v/common/atomic_riscv.c +++ b/libcpu/risc-v/common/atomic_riscv.c @@ -120,7 +120,7 @@ void rt_hw_atomic_flag_clear(volatile rt_atomic_t *ptr) #endif } -rt_atomic_t rt_hw_atomic_compare_exchange_strong(volatile rt_atomic_t *ptr, rt_atomic_t *old, rt_atomic_t new) +rt_atomic_t rt_hw_atomic_compare_exchange_strong(volatile rt_atomic_t *ptr, volatile rt_atomic_t *old, rt_atomic_t new) { rt_atomic_t tmp = *old; rt_atomic_t result; -- GitLab