smp.c 1013 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #include <rtdevice.h>
  2. #include "utest.h"
  3. #include "utest_assert.h"
  4. #include "smp.h"
  5. int pass_count = 0;
  6. int pass = 1000;
  7. struct rt_spinlock lock;
  8. void test_call(void *data)
  9. {
  10. rt_spin_lock(&lock);
  11. int *i = (int *)data;
  12. int id = rt_hw_cpu_id();
  13. *i &= ~(1 << id);
  14. if(*i == 0)
  15. pass_count++;
  16. rt_spin_unlock(&lock);
  17. }
  18. void test()
  19. {
  20. int cpu_mask = 0xf;
  21. for(int i =0 ;i < 1000 ;i++)
  22. {
  23. cpu_mask = rand()% 0xf;
  24. if (cpu_mask == 0)
  25. pass--;
  26. rt_smp_call_func_cond(cpu_mask,test_call, &cpu_mask);
  27. if(i % 20 == 0)
  28. rt_kprintf("#");
  29. rt_thread_mdelay(1);
  30. }
  31. rt_kprintf("\n");
  32. }
  33. static rt_err_t utest_tc_init(void)
  34. {
  35. rt_spin_lock_init(&lock);
  36. return RT_EOK;
  37. }
  38. static rt_err_t utest_tc_cleanup(void)
  39. {
  40. uassert_true(pass_count == pass);
  41. return RT_EOK;
  42. }
  43. static void testcase(void)
  44. {
  45. UTEST_UNIT_RUN(test);
  46. }
  47. UTEST_TC_EXPORT(testcase, "testcase.smp.smp", utest_tc_init, utest_tc_cleanup, 10);