Browse Source

[utest][atomic]添加返回值测试 (#7124)

* [utest][atomic]添加返回值测试
Yaochenger 2 years ago
parent
commit
38eb3fc40f

+ 38 - 15
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);
     }

+ 2 - 2
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;

+ 1 - 1
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;